1. 最常见爬取图片方法

对于图片爬取,最容易想到的是通过urllib库或者requests库实现。具体两种方法的实现如下:

1.1 urllib

使用urllib.request.urlretrieve方法,通过图片url和存储的名称完成下载。

'''
Signature: request.urlretrieve(url, filename=None, reporthook=None, data=None)
Docstring:
Retrieve a URL into a temporary location on disk.Requires a URL argument. If a filename is passed, it is used as
the temporary file location. The reporthook argument should be
a callable that accepts a block number, a read size, and the
total file size of the URL target. The data argument should be
valid URL encoded data.If a filename is passed and the URL points to a local resource,
the result is a copy from local file to new file.Returns a tuple containing the path to the newly created
data file as well as the resulting HTTPMessage object.
File:      ~/anaconda/lib/python3.6/urllib/request.py
Type:      function
'''
  • 参数 finename 指定了保存本地路径(如果参数未指定,urllib会生成一个临时文件保存数据。)

  • 参数 reporthook 是一个回调函数,当连接上服务器、以及相应的数据块传输完毕时会触发该回调,我们可以利用这个回调函数来显示当前的下载进度。

  • 参数 data 指 post 到服务器的数据,该方法返回一个包含两个元素的(filename, headers)元组,filename 表示保存到本地的路径,header 表示服务器的响应头。

使用示例:

request.urlretrieve('https://img3.doubanio.com/view/photo/photo/public/p454345512.jpg', 'kids.jpg')

但很有可能返回403错误(Forbidden),如:http://www.qnong.com.cn/uploa...。Stack Overflow指出原因:This website is blocking the user-agent used by urllib, so you need to change it in your request.

给urlretrieve加上User-Agent还挺麻烦,方法如下:

import urllibopener = request.build_opener()
headers = ('User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:53.0) Gecko/20100101 Firefox/53.0')
opener.addheaders = [headers]
request.install_opener(opener)
request.urlretrieve('http://www.qnong.com.cn/uploadfile/2016/0416/20160416101815887.jpg', './dog.jpg')

1.2 requests

使用requests.get()获取图片,但要将参数stream设为True

import requestsreq = requests.get('http://www.qnong.com.cn/uploadfile/2016/0416/20160416101815887.jpg', stream=True)with open('dog.jpg', 'wb') as wr:for chunk in req.iter_content(chunk_size=1024):if chunk:wr.write(chunk)wr.flush()

requests添加User-Agent也很方便,使用headers参数即可。


2. Scrapy 支持的方法

2.1 ImagesPipeline

Scrapy 自带 ImagesPipeline 和 FilePipeline 用于图片和文件下载,最简单使用 ImagesPipeline 只需要在 settings 中配置。

# settings.py
ITEM_PIPELINES = {'scrapy.pipelines.images.ImagesPipeline': 500
}IMAGES_STORE = 'pictures'  # 图片存储目录
IMAGES_MIN_HEIGHT = 400  # 小于600*400的图片过滤
IMAGES_MIN_WIDTH = 600
# items.py
import scrapyclass PictureItem(scrapy.Item):image_urls = scrapy.Field()
# myspider.py
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rulefrom ..items import BeePictureclass PicSpider(CrawlSpider):name = 'pic'allowed_domains = ['qnong.com.cn']start_urls = ['http://www.qnong.com.cn/']rules = (Rule(LinkExtractor(allow=r'.*?', restrict_xpaths=('//a[@href]')), callback='parse_item', follow=True),)def parse_item(self, response):for img_url in response.xpath('//img/@src').extract():item = PictureItem()item['image_urls'] = [response.urljoin(img_url)]yield item

2.2 自定义 Pipeline

默认情况下,使用ImagePipeline组件下载图片的时候,图片名称是以图片URL的SHA1值进行保存的。

如:
图片URL: http://www.example.com/image.jpg
SHA1结果:3afec3b4765f8f0a07b78f98c07b83f013567a0a
则图片名称:3afec3b4765f8f0a07b78f98c07b83f013567a0a.jpg

想要以自定义图片文件名需要重写 ImagesPipeline 的file_path方法。参考:https://doc.scrapy.org/en/lat...。

# settings.py
ITEM_PIPELINES = {'qnong.pipelines.MyImagesPipeline': 500,
}
# items.py
import scrapyclass PictureItem(scrapy.Item):image_urls = scrapy.Field()images = scrapy.Field()image_paths = scrapy.Field()
# myspider.py
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rulefrom ..items import BeePictureclass PicSpider(CrawlSpider):name = 'pic'allowed_domains = ['qnong.com.cn']start_urls = ['http://www.qnong.com.cn/']rules = (Rule(LinkExtractor(allow=r'.*?', restrict_xpaths=('//a[@href]')), callback='parse_item', follow=True),)def parse_item(self, response):for img_url in response.xpath('//img/@src').extract():item = PictureItem()item['image_urls'] = [response.urljoin(img_url)]yield item
# pipelines.py
from scrapy.exceptions import DropItem
from scrapy.pipelines.images import ImagesPipeline
import scrapyclass MyImagesPipeline(ImagesPipeline):def get_media_requests(self, item, info):for img_url in item['image_urls']:yield scrapy.Request(img_url)def item_completed(self, results, item, info):image_paths = [x['path'] for ok, x in results if ok]if not image_paths:raise DropItem('Item contains no images')item['image_paths'] = image_pathsreturn itemdef file_path(self, request, response=None, info=None):image_guid = request.url.split('/')[-1]return 'full/%s' % (image_guid)

2.3 FilesPipeline 和 ImagesPipeline 工作流程

FilesPipeline

  1. 在一个爬虫里,你抓取一个项目,把其中图片的URL放入 file_urls 组内。

  2. 项目从爬虫内返回,进入项目管道。

  3. 当项目进入 FilesPipeline,file_urls 组内的 URLs 将被 Scrapy 的调度器和下载器(这意味着调度器和下载器的中间件可以复用)安排下载,当优先级更高,会在其他页面被抓取前处理。项目会在这个特定的管道阶段保持“locker”的状态,直到完成文件的下载(或者由于某些原因未完成下载)。

  4. 当文件下载完后,另一个字段(files)将被更新到结构中。这个组将包含一个字典列表,其中包括下载文件的信息,比如下载路径、源抓取地址(从 file_urls 组获得)和图片的校验码(checksum)。 files 列表中的文件顺序将和源 file_urls 组保持一致。如果某个图片下载失败,将会记录下错误信息,图片也不会出现在 files 组中。

ImagesPipeline

  1. 在一个爬虫里,你抓取一个项目,把其中图片的 URL 放入 images_urls 组内。

  2. 项目从爬虫内返回,进入项目管道。

  3. 当项目进入 Imagespipeline,images_urls 组内的URLs将被Scrapy的调度器和下载器(这意味着调度器和下载器的中间件可以复用)安排下载,当优先级更高,会在其他页面被抓取前处理。项目会在这个特定的管道阶段保持“locker”的状态,直到完成文件的下载(或者由于某些原因未完成下载)。

  4. 当文件下载完后,另一个字段(images)将被更新到结构中。这个组将包含一个字典列表,其中包括下载文件的信息,比如下载路径、源抓取地址(从 images_urls 组获得)和图片的校验码(checksum)。 images 列表中的文件顺序将和源 images_urls 组保持一致。如果某个图片下载失败,将会记录下错误信息,图片也不会出现在 images 组中。

Scrapy 不仅可以下载图片,还可以生成指定大小的缩略图。
Pillow 是用来生成缩略图,并将图片归一化为 JPEG/RGB 格式,因此为了使用图片管道,你需要安装这个库。

Python图片爬取方法总结相关推荐

  1. python爬虫图片-Python图片爬取方法总结

    1. 最常见爬取图片方法 对于图片爬取,最容易想到的是通过urllib库或者requests库实现.具体两种方法的实现如下: 1.1 urllib 使用urllib.request.urlretrie ...

  2. python网页爬取方法_Python爬取网页的三种方法

    # Python爬取网页的三种方法之一:  使用urllib或者urllib2模块的getparam方法 import urllib fopen1 = urllib.urlopen('http://w ...

  3. Python图片爬取

    作者:刘旭濠 这个功能是在与别人讨论的时候发现的,一开始还不知道还可以这样玩,最后讨论才知道,还可以爬取这些东西,最后不仅弄了爬图片,还可以爬别的直接上代码吧 # 获取一个网址 pip install ...

  4. 「Python爬虫系列讲解」十二、基于图片爬取的 Selenium 爬虫

    本专栏是以杨秀璋老师爬虫著作<Python网络数据爬取及分析「从入门到精通」>为主线.个人学习理解为主要内容,以学习笔记形式编写的. 本专栏不光是自己的一个学习分享,也希望能给您普及一些关 ...

  5. SpiderMan:异步加载,图片爬取,数据库存储,多进程爬虫,IP代理

    1,使用API 1.1,API使用方法 API是通过Requests请求和服务端的Response回应来完成API的一次调用,所以用Python语言进行API的调用时,便可以使用Requests库来进 ...

  6. python爬虫爬取百度贴吧图片,requests方法

    每天一点点,记录学习 近期爬虫项目,看完请点赞哦---: 1:python 爬取菜鸟教程python100题,百度贴吧图片反爬虫下载,批量下载 2:python爬虫爬取百度贴吧图片,requests方 ...

  7. 使用Python爬虫爬取网络美女图片

    代码地址如下: http://www.demodashi.com/demo/13500.html 准备工作 安装python3.6 略 安装requests库(用于请求静态页面) pip instal ...

  8. Python爬虫爬取微信朋友圈的方法,感兴趣的朋友可以了解下

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 小雨 | 作者 python教程 | 来源 接下来,我们将实现微信朋友圈的 ...

  9. python爬表情包_教你用Python来爬取表情包网站的所有表情图片

    教你用Python来爬取表情包网站的所有表情图片 配置环境 安装Python 开发环境 3X系列 win + R 打开运行,输入cmd,输入python,进行验证是否安装Python win + R ...

最新文章

  1. python 比较矩阵对应位置元素大小,比较矩阵的两个元素并在不同位置填充相对值...
  2. 绘制分类界面以及性能曲面中的meshgrid函数
  3. OpenCV+Qt+CMake安装+十种踩坑
  4. 视频清晰度、色偏以及亮度异常检测
  5. 对于知识的可连接性的理解
  6. eclipse jsp没有提示_JSP+Struts2+JDBC+Mysql实现的校园宿舍管理系统
  7. python 合并word文件,在Python上的WordCloud中,我想合并两种语言
  8. 狂赌智能手机 中国互联网巨头深陷零利润困局
  9. Attribute和Property的区别
  10. LeetCode每日一题:2.两数相加
  11. android+qq底部界面,Android 高仿QQ 界面滑动效果
  12. 量化交易软件 python_我用Python做了个量化交易工具!
  13. 【神经网络】一文读懂LSTM神经网络
  14. Kali Linux上最佳安全测试工具
  15. 什么是噪声,白噪声,加性噪声,乘性噪声
  16. 【机器学习】Tensorflow:理解和实现快速风格化图像fast neural style
  17. 今晚7:30 | 连界、将门、百度、碧桂园创投四位大佬眼中的AI世界,是继续高深还是回归商业本质?...
  18. 勇敢面对人生的苦难,时光不负赶路人
  19. 机器学习做二元分类问题(二)
  20. 听新闻学英语android版,听新闻学英语

热门文章

  1. windows环境下python怎么安装mlxtend-python连接QQ实现自动回复python 机器学习库
  2. C linux 宏定义的使用
  3. 实现费用管理 mysql_移动电费房租管理系统的设计与实现(IDEA,MySQL)
  4. led灯光衰怎么解决_车灯不亮怎么办?成都车灯改装店为您带来科学合理车灯升级方案...
  5. 复旦计算机学硕分数线,复旦大学2019考研分数线公布,复旦复试经验请收好!...
  6. Pycharm中tensorflow框架下tqdm的安装
  7. “invalid index of a 0-dim tensor. Use tensor.item() to convert a 0-dim tensor to a Python”解决办法
  8. FPGA之道(60)时空变换之空域优化
  9. 纯CSS3实现GIF图片动画效果
  10. php超全局变量,魔术常量,魔术方法