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编程中的for循环语句学习教程
Oct 14 Python
Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
Jun 14 Python
Python3下错误AttributeError: ‘dict’ object has no attribute’iteritems‘的分析与解决
Jul 06 Python
Python日期的加减等操作的示例
Aug 15 Python
Python3中的列表,元组,字典,字符串相关知识小结
Nov 10 Python
selenium+python 去除启动的黑色cmd窗口方法
May 22 Python
在pycharm中python切换解释器失败的解决方法
Oct 29 Python
pytorch使用Variable实现线性回归
May 21 Python
python and or用法详解
Jun 26 Python
python开启debug模式的方法
Jun 27 Python
python3读取图片并灰度化图片的四种方法(OpenCV、PIL.Image、TensorFlow方法)总结
Jul 04 Python
浅谈Django前端后端值传递问题
Jul 15 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 什么是PEAR?
2009/03/19 PHP
PHP取余函数介绍MOD(x,y)与x%y
2014/05/15 PHP
Yii2中关联查询简单用法示例
2016/08/10 PHP
10个基于Jquery的幻灯片插件教程
2010/10/29 Javascript
jQuery(1.6.3) 中css方法对浮动的实现缺陷分析
2011/09/09 Javascript
JQuery给网页更换皮肤的方法
2015/05/30 Javascript
JavaScript中的getDay()方法使用详解
2015/06/09 Javascript
jQuery网页右侧广告跟随滚动代码分享
2020/04/20 Javascript
AngularJs 60分钟入门基础教程
2016/04/03 Javascript
JS控制文本域只读或可写属性的方法
2016/06/24 Javascript
js获取指定字符前/后的字符串简单实例
2016/10/27 Javascript
bootstrap table实例详解
2017/01/06 Javascript
JS及JQuery对Html内容编码,Html转义
2017/02/17 Javascript
详解Vue 非父子组件通信方法(非Vuex)
2017/05/24 Javascript
mui 打开新窗口的方式总结及注意事项
2017/08/20 Javascript
详解VUE 数组更新
2017/12/16 Javascript
js如何找出字符串中的最长回文串
2018/06/04 Javascript
基于Vue 2.0 监听文本框内容变化及ref的使用说明介绍
2018/08/24 Javascript
js观察者模式的弹幕案例
2020/11/23 Javascript
JavaScript实现商品评价五星好评
2020/11/30 Javascript
[01:21]辉夜杯战队访谈宣传片—CDEC
2015/12/25 DOTA
简单介绍Python的Tornado框架中的协程异步实现原理
2015/04/23 Python
Ubuntu下安装PyV8
2016/03/13 Python
Python类的动态修改的实例方法
2017/03/24 Python
python中的for循环
2018/09/28 Python
python django model联合主键的例子
2019/08/06 Python
pytorch实现Tensor变量之间的转换
2020/02/17 Python
PyQt5+python3+pycharm开发环境配置教程
2020/03/24 Python
Python unittest基本使用方法代码实例
2020/06/29 Python
python 调用Google翻译接口的方法
2020/12/09 Python
HTML5 audio标签使用js进行播放控制实例
2015/04/24 HTML / CSS
矿泉水广告词
2014/03/20 职场文书
法学求职信
2014/06/22 职场文书
搞笑车尾标语
2014/06/23 职场文书
2015年电话销售工作总结范文
2015/04/20 职场文书
浅谈node.js中间件有哪些类型
2021/04/29 Javascript