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操作redis的方法
Jul 07 Python
Python上下文管理器和with块详解
Sep 09 Python
Python编程scoketServer实现多线程同步实例代码
Jan 29 Python
Python解决抛小球问题 求小球下落经历的距离之和示例
Feb 01 Python
浅谈python下含中文字符串正则表达式的编码问题
Dec 07 Python
Python实现SQL注入检测插件实例代码
Feb 02 Python
Python面向对象程序设计之类的定义与继承简单示例
Mar 18 Python
python开发游戏的前期准备
May 05 Python
Python中使用pypdf2合并、分割、加密pdf文件的代码详解
May 21 Python
tensorflow多维张量计算实例
Feb 11 Python
Python编写memcached启动脚本代码实例
Aug 14 Python
Python 类,对象,数据分类,函数参数传递详解
Sep 25 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
isset和empty的区别
2007/01/15 PHP
PHP Memcached + APC + 文件缓存封装实现代码
2010/03/11 PHP
PHP反转字符串函数strrev()函数的用法
2012/02/04 PHP
ajax在joomla中的原生态应用代码
2012/07/19 PHP
PHP判断图片格式的七种方法小结
2013/06/03 PHP
php中的Base62类(适用于数值转字符串)
2013/08/12 PHP
PHP循环遍历数组的3种方法list()、each()和while总结
2014/11/19 PHP
php中最简单的字符串匹配算法
2014/12/16 PHP
关于php几种字符串连接的效率比较(详解)
2017/02/22 PHP
关于laravel5.5的定时任务详解(demo)
2019/10/23 PHP
浅析JavaScript基本类型与引用类型
2014/05/28 Javascript
浅谈js里面的InttoStr和StrtoInt
2016/06/14 Javascript
JavaScript+CSS相册特效实例代码
2017/09/07 Javascript
解决node.js含有%百分号时发送get请求时浏览器地址自动编码的问题
2019/11/20 Javascript
jquery实现图片无缝滚动 蒙版遮蔽效果
2020/01/11 jQuery
JS性能优化实现方法及优点进行
2020/08/30 Javascript
[02:09]EHOME夺得首届辉夜杯冠军—现场颁奖仪式
2015/12/28 DOTA
[01:16:16]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第二场 1月8日
2021/03/11 DOTA
Python基于scrapy采集数据时使用代理服务器的方法
2015/04/16 Python
Python运算符重载用法实例
2015/05/28 Python
Python中的集合类型知识讲解
2015/08/19 Python
很酷的python表白工具 你喜欢我吗
2019/04/11 Python
Python+pyftpdlib实现局域网文件互传
2020/08/24 Python
Python用dilb提取照片上人脸的示例
2020/10/26 Python
python 爬取腾讯视频评论的实现步骤
2021/02/18 Python
印度最大的酒店品牌网络:OYO Rooms
2016/07/24 全球购物
澳大利亚正品化妆品之家:Cosmetic Capital
2017/07/03 全球购物
Lookfantastic希腊官网:英国知名美妆购物网站
2018/09/15 全球购物
一家专门经营包包的英国网站:MyBag
2019/09/08 全球购物
英语专业毕业生求职简历的自我评价
2013/10/24 职场文书
如何填写个人简历自我评价
2013/12/10 职场文书
餐饮总经理岗位职责
2014/03/07 职场文书
2014年入党积极分子党校培训心得体会
2014/07/08 职场文书
诚实守信道德模范事迹材料
2014/08/15 职场文书
比赛主持人开场白
2015/05/29 职场文书
nginx反向代理时如何保持长连接
2021/03/31 Servers