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 Tkinter简单布局实例教程
Sep 03 Python
python通过pil模块将raw图片转换成png图片的方法
Mar 16 Python
Python中if __name__ == '__main__'作用解析
Jun 29 Python
python中文分词教程之前向最大正向匹配算法详解
Nov 02 Python
django_orm查询性能优化方法
Aug 20 Python
Pytorch .pth权重文件的使用解析
Feb 14 Python
python实现秒杀商品的微信自动提醒功能(代码详解)
Apr 27 Python
完美解决pycharm 不显示代码提示问题
Jun 02 Python
利用python实现平稳时间序列的建模方式
Jun 03 Python
Python使用sys.exc_info()方法获取异常信息
Jul 23 Python
python中pickle模块浅析
Dec 29 Python
Pygame如何使用精灵和碰撞检测
Nov 17 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
8个必备的PHP功能实例代码
2013/10/27 PHP
php实现的支持断点续传的文件下载类
2014/09/23 PHP
php常用文件操作函数汇总
2014/11/22 PHP
Linux下编译redis和phpredis的方法
2016/04/07 PHP
php生成mysql的数据字典
2016/07/07 PHP
Jquery乱码的一次解决过程 图解教程
2010/02/20 Javascript
javascript实现的在当前窗口中漂浮框的代码
2010/03/15 Javascript
JS window对象的top、parent、opener含义介绍
2013/12/03 Javascript
Bootstrap每天必学之导航
2015/11/26 Javascript
IONIC自定义subheader的最佳解决方案
2016/09/22 Javascript
微信小程序 本地数据读取实例
2017/04/27 Javascript
VUE2.0+Element-UI+Echarts封装的组件实例
2018/03/02 Javascript
如何解决webpack-dev-server代理常切换问题
2019/01/09 Javascript
手把手带你封装一个vue component第三方库
2019/02/14 Javascript
Python实现的多线程端口扫描工具分享
2015/01/21 Python
python logging重复记录日志问题的解决方法
2018/07/12 Python
python print 格式化输出,动态指定长度的实现
2020/04/12 Python
python + selenium 刷B站播放量的实例代码
2020/06/12 Python
python使用matplotlib绘制折线图的示例代码
2020/09/22 Python
重构Python代码的六个实例
2020/11/25 Python
python中uuid模块实例浅析
2020/12/29 Python
python UDF 实现对csv批量md5加密操作
2021/01/01 Python
印尼最大的婴儿用品购物网站:Orami
2017/09/28 全球购物
荷兰电脑专场:Paradigit
2018/05/05 全球购物
澳大利亚最受欢迎的超级商场每日优惠:Catch
2020/11/17 全球购物
中专生自我鉴定范文
2013/12/19 职场文书
市场营销方案范文
2014/03/11 职场文书
教堂婚礼主持词
2014/03/14 职场文书
保护环境倡议书范文
2014/05/13 职场文书
关爱残疾人标语
2014/06/25 职场文书
小学关爱留守儿童活动方案
2014/08/25 职场文书
免职通知
2015/04/23 职场文书
大学生干部培训心得体会
2016/01/06 职场文书
慰问信的写作格式及范文!
2019/06/24 职场文书
创业计划书之游泳馆
2019/09/16 职场文书
Axios取消重复请求的方法实例详解
2021/06/15 Javascript