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安装Imaging报错:The _imaging C module is not installed问题解决方法
Aug 22 Python
在Python的Django框架中调用方法和处理无效变量
Jul 15 Python
Python安装官方whl包和tar.gz包的方法(推荐)
Jun 04 Python
python PyTorch参数初始化和Finetune
Feb 11 Python
python简单商城购物车实例代码
Mar 15 Python
解决Django layui {{}}冲突的问题
Aug 29 Python
python正则过滤字母、中文、数字及特殊字符方法详解
Feb 11 Python
python自动点赞功能的实现思路
Feb 26 Python
Python 通过监听端口实现唯一脚本运行方式
May 05 Python
使用pyplot.matshow()函数添加绘图标题
Jun 16 Python
如何利用Python动态模拟太阳系运转
Sep 04 Python
Python学习之迭代器详解
Apr 01 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
星际争霸 Starcraft 游戏介绍
2020/03/14 星际争霸
PHP操作文件的一些基本函数使用示例
2014/11/18 PHP
如何直接访问php实例对象中的private属性详解
2017/10/12 PHP
Mootools 1.2教程 正则表达式
2009/09/15 Javascript
javascript 按回车键相应按钮提交事件
2009/11/02 Javascript
Extjs Ext.MessageBox.confirm 确认对话框详解
2010/04/02 Javascript
js创建对象的区别示例介绍
2014/07/24 Javascript
IE及IE6浏览器中判断JS文件加载成功失败的方法
2015/02/18 Javascript
ECMAScript6中Map/WeakMap详解
2015/06/12 Javascript
js实现登陆遮罩效果的方法
2015/07/28 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
2017/03/21 Javascript
JavaScript中重名的函数与对象示例详析
2017/09/28 Javascript
TypeScript中使用getElementXXX()的示例代码
2019/09/12 Javascript
vue cli3 调用百度翻译API翻译页面的实现示例
2019/09/13 Javascript
Angular 多级路由实现登录页面跳转(小白教程)
2019/11/19 Javascript
[08:29]DOTA2每周TOP10 精彩击杀集锦vol.7
2014/06/25 DOTA
[51:10]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[46:59]完美世界DOTA2联赛PWL S2 GXR vs Ink 第二场 11.19
2020/11/20 DOTA
利用python程序生成word和PDF文档的方法
2017/02/14 Python
python 读取DICOM头文件的实例
2018/05/07 Python
Python实现的本地文件搜索功能示例【测试可用】
2018/05/30 Python
python与字符编码问题
2019/05/24 Python
Keras设置以及获取权重的实现
2020/06/19 Python
python复合条件下的字典排序
2020/12/18 Python
Html5在手机端调用相机的方法实现
2020/05/13 HTML / CSS
PHP如何去执行一个SQL语句
2016/03/05 面试题
《满井游记》教学反思
2014/02/26 职场文书
史学专业毕业生求职信
2014/05/09 职场文书
生物科学专业毕业生求职信
2014/06/02 职场文书
驾驶员安全责任书
2014/07/22 职场文书
2014年党风廉政工作总结
2014/12/03 职场文书
中班教师个人总结
2015/02/05 职场文书
从严治党主题教育活动总结
2015/05/07 职场文书
原告离婚代理词
2015/05/23 职场文书
解决vue $http的get和post请求跨域问题
2021/06/07 Vue.js
科学家测试在太空中培育人造肉,用于未来太空旅行
2022/04/29 数码科技