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操作xml文件示例
Apr 07 Python
Python实现的多线程端口扫描工具分享
Jan 21 Python
Python中函数eval和ast.literal_eval的区别详解
Aug 10 Python
Python遍历numpy数组的实例
Apr 04 Python
基于python OpenCV实现动态人脸检测
May 25 Python
Anaconda下配置python+opencv+contribx的实例讲解
Aug 06 Python
windows下cx_Freeze生成Python可执行程序的详细步骤
Oct 09 Python
pandas去除重复列的实现方法
Jan 29 Python
vscode调试django项目的方法
Aug 06 Python
opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器
Nov 13 Python
Python pandas读取CSV文件的注意事项(适合新手)
Jun 20 Python
Python线程池与GIL全局锁实现抽奖小案例
Apr 13 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
PHP中使用register_shutdown_function函数截获fatal error示例
2015/04/21 PHP
Joomla语言翻译类Jtext用法分析
2016/05/05 PHP
PHP简单数据库操作类实例【支持增删改查及链式操作】
2016/10/10 PHP
php获取客户端IP及URL的方法示例
2017/02/03 PHP
PHP如何使用JWT做Api接口身份认证的实现
2020/02/03 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
基于jquery的图片懒加载js
2010/06/30 Javascript
从面试题学习Javascript 面向对象(创建对象)
2012/03/30 Javascript
jQuery文件上传插件Uploadify使用指南
2014/06/05 Javascript
打造自己的jQuery插件入门教程
2016/09/23 Javascript
基于jQuery插件jqzoom实现的图片放大镜效果示例
2017/01/23 Javascript
Angular.JS中指令ng-if、ng-show/ng-hide和ng-switch的使用教程
2017/05/07 Javascript
JavaScript登录验证基础教程
2017/11/01 Javascript
react中fetch之cors跨域请求的实现方法
2018/03/14 Javascript
vue-cli3 项目从搭建优化到docker部署的方法
2019/01/28 Javascript
javascript异步处理与Jquery deferred对象用法总结
2019/06/04 jQuery
[09:31]2016国际邀请赛中国区预选赛Yao赛后采访 答题送礼
2016/06/27 DOTA
Python操作列表之List.insert()方法的使用
2015/05/20 Python
Python实现提取XML内容并保存到Excel中的方法
2018/09/01 Python
python3文件复制、延迟文件复制任务的实现方法
2019/09/02 Python
关于python pycharm中输出的内容不全的解决办法
2020/01/10 Python
详解python itertools功能
2020/02/07 Python
基于Keras 循环训练模型跑数据时内存泄漏的解决方式
2020/06/11 Python
美国尼曼百货官网:Neiman Marcus
2019/09/05 全球购物
Kappa英国官方在线商店:服装和运动器材
2020/11/22 全球购物
大学生自助营养快餐店创业计划书
2014/01/13 职场文书
护理专科毕业自荐信范文
2014/04/21 职场文书
热爱祖国演讲稿
2014/05/04 职场文书
企业宣传标语
2014/06/09 职场文书
2014应届本科生自我评价
2014/09/13 职场文书
民主评议党员个人自我评价
2015/03/03 职场文书
运动会3000米加油稿
2015/07/21 职场文书
创业计划书之DIY自助厨房
2019/09/06 职场文书
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
2021/04/25 Python
Python中如何处理常见报错
2022/01/18 Python
MySQL远程无法连接的一些常见原因总结
2022/09/23 MySQL