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类定义的讲解
Nov 01 Python
详解Python判定IP地址合法性的三种方法
Mar 06 Python
python3中的md5加密实例
May 29 Python
python实现pdf转换成word/txt纯文本文件
Jun 07 Python
python3解析库BeautifulSoup4的安装配置与基本用法
Jun 26 Python
matplotlib给子图添加图例的方法
Aug 03 Python
解决django 新增加用户信息出现错误的问题
Jul 28 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
Apr 07 Python
Python读取JSON数据操作实例解析
May 18 Python
Python中Qslider控件实操详解
Feb 20 Python
Python列表删除重复元素与图像相似度判断及删除实例代码
May 07 Python
Python数据可视化之基于pyecharts实现的地理图表的绘制
Jun 10 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的array_multisort()使用方法介绍
2012/05/16 PHP
基于PHP创建Cookie数组的详解
2013/07/03 PHP
PHP中调用SVN命令更新网站方法
2015/01/07 PHP
详解WordPress中简码格式标签编写的基本方法
2015/12/22 PHP
php版微信小店API二次开发及使用示例
2016/11/12 PHP
老生常谈文本文件和二进制文件的区别
2017/02/27 PHP
Javascript Math ceil()、floor()、round()三个函数的区别
2010/03/09 Javascript
JavaScript link方法入门实例(给字符串加上超链接)
2014/10/17 Javascript
浅谈javascript 函数属性和方法
2015/01/21 Javascript
$.extend 的一个小问题
2015/06/18 Javascript
全面解析JavaScript中“&&”和“||”操作符(总结篇)
2016/07/18 Javascript
jQuery密码强度验证控件使用详解
2017/01/05 Javascript
AngularJS实现单一页面内设置跳转路由的方法
2017/06/28 Javascript
Vue-cli创建项目从单页面到多页面的方法
2017/09/20 Javascript
vue 动态绑定背景图片的方法
2018/08/10 Javascript
10行代码实现微信小程序滑动tab切换
2018/12/28 Javascript
javascript json对象小技巧之键名作为变量用法分析
2019/11/11 Javascript
解决Vue @submit 提交后不刷新页面问题
2020/07/18 Javascript
vue组件中节流函数的失效的原因和解决方法
2020/12/02 Vue.js
讲解python参数和作用域的使用
2013/11/01 Python
优化Python代码使其加快作用域内的查找
2015/03/30 Python
Django使用HttpResponse返回图片并显示的方法
2018/05/22 Python
Python 20行简单实现有道在线翻译的详解
2019/05/15 Python
使用python的pandas为你的股票绘制趋势图
2019/06/26 Python
django xadmin中form_layout添加字段显示方式
2020/03/30 Python
python exit出错原因整理
2020/08/31 Python
HTML5 标准将把互联网视频扔回到黑暗时代
2010/02/10 HTML / CSS
发现世界上最好的珠宝设计师:JewelStreet
2017/12/17 全球购物
Myprotein中国网站:欧洲畅销运动营养品牌
2021/02/11 全球购物
大学生个人简历自我评价
2013/11/16 职场文书
质检部职责
2013/12/28 职场文书
写演讲稿要注意的六件事
2014/01/14 职场文书
汽车机电维修工求职信
2014/09/30 职场文书
2014年高校辅导员工作总结
2014/12/09 职场文书
英语感谢信范文
2015/01/20 职场文书
在虚拟机中安装windows server 2008的图文教程
2022/06/28 Servers