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中if __name__ == "__main__"详细解释
Oct 21 Python
Python实现去除代码前行号的方法
Mar 10 Python
在ironpython中利用装饰器执行SQL操作的例子
May 02 Python
Python实现TCP/IP协议下的端口转发及重定向示例
Jun 14 Python
Python基于回溯法子集树模板实现8皇后问题
Sep 01 Python
Python爬取成语接龙类网站
Oct 19 Python
django 通过URL访问上传的文件方法
Jul 28 Python
python实现机器人卡牌
Oct 06 Python
tensorflow常用函数API介绍
Apr 19 Python
Python应用实现双指数函数及拟合代码实例
Jun 19 Python
Pycharm2020.1安装无法启动问题即设置中文插件的方法
Aug 07 Python
python ssh 执行shell命令的示例
Sep 29 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
让这部DC动画新作刷新你的认知
2020/03/03 欧美动漫
下载文件的点击数回填
2006/10/09 PHP
PHP开发制作一个简单的活动日程表Calendar
2016/06/20 PHP
PHP操作Redis常用技巧总结
2018/04/24 PHP
用dom+xhtml+css制作的一个相册效果代码打包下载
2008/01/24 Javascript
IE php关于强制下载文件的代码
2008/08/23 Javascript
网页中的图片的处理方法与代码
2009/11/26 Javascript
分享十五款 jQuery 社交网络分享插件
2015/05/16 Javascript
js操作数据库实现注册和登陆的简单实例
2016/05/26 Javascript
详解nodejs微信公众号开发——6.自定义菜单
2017/04/13 NodeJs
Node.js使用orm2进行update操作时关联字段无法修改的解决方法
2017/06/13 Javascript
nodejs后台集成ueditor富文本编辑器的实例
2017/07/11 NodeJs
js Date()日期函数浏览器兼容问题解决方法
2017/09/12 Javascript
前端把html表格生成为excel表格的实例
2017/09/19 Javascript
微信小程序App生命周期详解
2018/01/31 Javascript
select获取下拉框的值 下拉框默认选中方法
2018/02/28 Javascript
vue实现的封装全局filter并统一管理操作示例
2020/02/02 Javascript
详解JavaScript 事件流
2020/09/02 Javascript
在antd4.0中Form使用initialValue操作
2020/11/02 Javascript
原生js实现无缝轮播图效果
2021/01/28 Javascript
python网络编程学习笔记(九):数据库客户端 DB-API
2014/06/09 Python
python xpath获取页面注释的方法
2019/01/14 Python
Python 给定的经纬度标注在地图上的实现方法
2019/07/05 Python
python 申请内存空间,用于创建多维数组的实例
2019/12/02 Python
python 子类调用父类的构造函数实例
2020/03/12 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
2020/09/01 Python
使用Python绘制台风轨迹图的示例代码
2020/09/21 Python
Pretty Little Thing爱尔兰:时尚女性服饰
2017/03/27 全球购物
总经理岗位职责
2013/11/09 职场文书
最新的互联网创业计划书
2014/01/10 职场文书
劳动之星获奖感言
2014/02/01 职场文书
幼儿园运动会加油词
2014/02/14 职场文书
买卖协议书范本
2014/04/21 职场文书
2014年六一儿童节演讲稿
2014/05/23 职场文书
工作试用期自我评价
2015/03/10 职场文书
某某店铺的开业庆典主持词范本
2019/11/25 职场文书