Python3直接爬取图片URL并保存示例


Posted in Python onDecember 18, 2019

有时候我们会需要从网络上爬取一些图片,来满足我们形形色色直至不可描述的需求。

一个典型的简单爬虫项目步骤包括两步:获取网页地址和提取保存数据。

这里是一个简单的从图片url收集图片的例子,可以成为一个小小的开始。

获取地址

这些图片的URL可能是连续变化的,如从001递增到099,这种情况可以在程序中将共同的前面部分截取,再在最后递增并字符串化后循环即可。

抑或是它们的URL都保存在某个文件中,这时可以读取到列表中:

def getUrls(path):
  urls = []
  with open(path,'r') as f:
    for line in f:
      urls.append(line.strip('\n'))
  return(urls)

保存图片

在python3中,urllib提供了一系列用于操作URL的功能,其中的request模块可以非常方便地抓取URL内容,也就是发送一个GET请求到指定的页面,然后返回HTTP的响应。具体细节请看注释:

def requestImg(url, name, num_retries=3):
  img_src = url
  # print(img_src)
  header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) \
    AppleWebKit/537.36 (KHTML, like Gecko) \
      Chrome/35.0.1916.114 Safari/537.36',
    'Cookie': 'AspxAutoDetectCookieSupport=1'
  }
  # Request类可以使用给定的header访问URL
  req = urllib.request.Request(url=img_src, headers=header) 
  try:
    response = urllib.request.urlopen(req) # 得到访问的网址
    filename = name + '.jpg'
    with open(filename, "wb") as f:
      content = response.read() # 获得图片
      f.write(content) # 保存图片
      response.close()
  except HTTPError as e: # HTTP响应异常处理
    print(e.reason)
  except URLError as e: # 一定要放到HTTPError之后,因为它包含了前者
    print(e.reason)
  except IncompleteRead or RemoteDisconnected as e: 
    if num_retries == 0: # 重连机制
      return
    else:
      requestImg(url, name, num_retries-1)

其他

捕获异常

以下是批量爬取网页时可能需要捕获的异常,同时可以看出,urllib2库对应urllib库,而httplib库对应http.client:

Python2 Pyhton3
urllib2.HTTPError urllib.error.HTTPError
urllib2.URLError urllib.error.URLError (HTTPError被包含其中)
httplib.IncompleteRead http.client.IncompleteRead
httplib.RemoteDisconnected http.client.RemoteDisconnected

重连机制

在函数参数中设置一个参数num_retries并对其进行初始化,即默认参数。在某些异常出现时可以将该参数递减,再让它递归调用自身,这就是基本的重连机制。

修饰器

有种设计模式叫修饰器模式,它可以在不修改目标函数代码的前提下,在目标函数执行前后增加一些额外功能。

def clock(func): # 修饰器函数,对函数计时
  def clocked(*args):
    t0 = timeit.default_timer()
    result = func(*args)
    elapsed = timeit.default_timer() - t0
    name = func.__name__
    arg_str = ', '.join(repr(arg) for arg in args)
    print('[%0.8fs] %s(%s)' % (elapsed, name, arg_str))
    # print('%s(%s) -> %r [%0.8fs]' % (name, arg_str, result, elapsed))
    return result
  return clocked

上面这段代码是修饰器函数的一个例子,用来对函数运行时间进行计时,在需要计时的函数上一行添加一点点代码即可:

@clock

完整代码

from urllib.error import HTTPError, URLError
from http.client import IncompleteRead, RemoteDisconnected
import timeit, time
import urllib.request
import socket
 
 
# timeout = 20
# socket.setdefaulttimeout(timeout) # 等待,防止被简单地反爬
 
 
def getUrls(path):
  urls = []
  with open(path,'r') as f:
    for line in f:
      urls.append(line.strip('\n'))
  return(urls)
 
 
def clock(func): # 修饰器函数,对函数计时
  def clocked(*args):
    t0 = timeit.default_timer()
    result = func(*args)
    elapsed = timeit.default_timer() - t0
    name = func.__name__
    arg_str = ', '.join(repr(arg) for arg in args)
    print('[%0.8fs] %s(%s)' % (elapsed, name, arg_str))
    # print('%s(%s) -> %r [%0.8fs]' % (name, arg_str, result, elapsed))
    return result
  return clocked
 
 
@clock
def requestImg(url, name, num_retries=3):
  img_src = url
  # print(img_src)
  header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) \
    AppleWebKit/537.36 (KHTML, like Gecko) \
      Chrome/35.0.1916.114 Safari/537.36',
    'Cookie': 'AspxAutoDetectCookieSupport=1'
  }
  req = urllib.request.Request(url=img_src, headers=header)
  try:
    response = urllib.request.urlopen(req)
    filename = name + '.jpg'
    with open(filename, "wb") as f:
      content = response.read()
      f.write(content)
      response.close()
  except HTTPError as e:
    print(e.reason)
  except URLError as e:
    print(e.reason)
  except IncompleteRead or RemoteDisconnected as e:
    if num_retries == 0:
      return
    else:
      requestImg(url, name, num_retries-1)
 
 
 
if __name__ =='__main__':
  urls = getUrls('./'URLS.txt') # 换成你的URL文件路径
  nLines = len(urls)
  print(nLines)
  for index, value in enumerate(urls):
      requestImg(value, './'+str(index).zfill(6)) # zfill用来格式化数字:000001

以上这篇Python3直接爬取图片URL并保存示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python利用pyHook实现监听用户鼠标与键盘事件
Aug 21 Python
Python实现将照片变成卡通图片的方法【基于opencv】
Jan 17 Python
初探TensorFLow从文件读取图片的四种方式
Feb 06 Python
python实现树形打印目录结构
Mar 29 Python
在PyCharm环境中使用Jupyter Notebook的两种方法总结
May 24 Python
python实现将汉字保存成文本的方法
Nov 16 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
Feb 16 Python
python3.6下Numpy库下载与安装图文教程
Apr 02 Python
python按键按住不放持续响应的实例代码
Jul 17 Python
Python使用ffmpy将amr格式的音频转化为mp3格式的例子
Aug 08 Python
python实现人脸签到系统
Apr 13 Python
详解python的内存分配机制
May 10 Python
python 实现图片上传接口开发 并生成可以访问的图片url
Dec 18 #Python
Python谱减法语音降噪实例
Dec 18 #Python
利用PyCharm操作Github(仓库新建、更新,代码回滚)
Dec 18 #Python
使用python 对验证码图片进行降噪处理
Dec 18 #Python
如何使用Python多线程测试并发漏洞
Dec 18 #Python
Python实现图像去噪方式(中值去噪和均值去噪)
Dec 18 #Python
python 中值滤波,椒盐去噪,图片增强实例
Dec 18 #Python
You might like
Yii框架分页实现方法详解
2017/05/20 PHP
总结PHP代码规范、流程规范、git规范
2018/06/18 PHP
在页面上点击任一链接时触发一个事件的代码
2007/04/07 Javascript
讲两件事:1.this指针的用法小探. 2.ie的attachEvent和firefox的addEventListener在事件处理上的区别
2007/04/12 Javascript
javascript 日期时间函数(经典+完善+实用)
2009/05/27 Javascript
jquery的ajax从纯真网(cz88.net)获取IP地址对应地区名
2009/12/02 Javascript
jquery封装的对话框简单实现
2013/07/21 Javascript
jquery 实现窗口的最大化不论什么情况
2013/09/03 Javascript
将两个div左右并列显示并实现点击标题切换内容
2013/10/22 Javascript
jQuery 事件的命名空间简单了解
2013/11/22 Javascript
jquery解析json格式数据的方法(对象、字符串)
2015/11/24 Javascript
js+css3实现旋转效果
2017/01/20 Javascript
js实现图片360度旋转
2017/01/22 Javascript
Vue.JS项目中5个经典Vuex插件
2017/11/28 Javascript
vue路由组件按需加载的几种方法小结
2018/07/12 Javascript
Vue和React组件之间的传值方式详解
2019/01/31 Javascript
微信小程序3种位置API的使用方法详解
2019/08/05 Javascript
vue打包静态资源后显示空白及static文件路径报错的解决
2020/09/02 Javascript
详解微信小程序「渲染层网络层错误」的解决方法
2021/01/06 Javascript
[03:36]2014DOTA2 TI小组赛综述 八强诞生进军钥匙球馆
2014/07/15 DOTA
python+pandas分析nginx日志的实例
2018/04/28 Python
python基于http下载视频或音频
2018/06/20 Python
python中的线程threading.Thread()使用详解
2019/12/17 Python
如何在python中处理配置文件代码实例
2020/09/27 Python
详解HTML5中download属性的应用
2015/08/06 HTML / CSS
Myprotein瑞典官方网站:畅销欧洲英国运动营养品牌
2018/01/22 全球购物
手工制作的音乐盒:Music Box Attic
2019/09/05 全球购物
三星法国官方网站:Samsung法国
2019/10/31 全球购物
初一生物教学反思
2014/01/18 职场文书
重阳节登山活动方案
2014/02/03 职场文书
工伤事故赔偿协议书(标准)
2014/09/29 职场文书
2015年毕业生实习评语
2015/03/25 职场文书
2015年公司保安年终工作总结
2015/05/14 职场文书
发票退票证明
2015/06/24 职场文书
表彰大会新闻稿
2015/07/17 职场文书
Pytorch distributed 多卡并行载入模型操作
2021/06/05 Python