(1条消息) Scrapy用ImagePipeline爬取网页图片

https://blog.csdn.net/Wilson_Iceman/article/details/79200796之前的那个系列文章只是讲到了如何使用Scrapy来爬取文本数据,今天我们来介绍如何用Scrapy来爬取图片数据。

Scrapy爬取图片数据需要用到ImagePipeline这个类,此类提供一种方便的方式来下载和存储图片,待会大家看例子的时候就可以看到爬取图片要比爬取文本简单的多,这当然要归功于ImagePipeline这个类。

这个类的主要特征如下:

  • 将下载图片转换成通用的JPG和RGB文件格式
  • 避免重复下载
  • 可以生成缩略图
  • 图片大小可以实现自动过滤
下面我们来看一下ImagePipeline的工作流程
  • 爬取一个item,将图片的urls存入image_urls字段
  • 从Spider返回的item,传递到Item Pipeline,
当Item传递到ImagePipeline后,将调用Scrapy调度器和下载器完成image_urls中的URL的调度和下载。ImagePipeline会自动高优先级抓取这些url,与此同时,item会被锁定直到图片抓取完毕才解锁。
  • 这些图片下载完成后,图片下载路径、url和校验等信息会被填充到images字段中。
好了,让我们赶紧开始吧。
启动一个项目,项目名称为douban_img
scrapy startproject douban_img

首先我们来看items.py

  1. # -*- coding: utf-8 -*-
  2. # Define here the models for your scraped items
  3. #
  4. # See documentation in:
  5. # https://doc.scrapy.org/en/latest/topics/items.html
  6. import scrapy
  7. class DoubanImgItem(scrapy.Item):
  8. # define the fields for your item here like:
  9. # name = scrapy.Field()
  10. image_urls = scrapy.Field()
  11. image_paths = scrapy.Field()

爬取图片一定需要image_urls这个字段,否则无法完成图片的抓取。

接下看最主要的spider文件,新建一个文件download_douban.py。
  1. from scrapy.spider import Spider
  2. import re
  3. from scrapy import Request
  4. from douban_img.items import DoubanImgItem
  5. class download_douban(Spider):
  6. name = 'download-douban'
  7. default_headers = {
  8. 'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
  9. 'Accept' : 'gzip, deflate, sdch, br',
  10. 'Accept-Language': 'zh-CN,zh;q=0.8,en;q=0.6',
  11. 'Cache-Control' : 'max-age=0',
  12. 'Connection' : 'keep-alive',
  13. 'Host' : 'www.douban.com',
  14. 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
  15. }
  16. def __init__(self, url='1656889999', *args, **kwargs):
  17. self.allowed_domains = ['douban.com']
  18. self.start_urls = ['https://www.douban.com/photos/album/%s/' % (url)]
  19. # self.url = url
  20. def start_requests(self):
  21. for url in self.start_urls:
  22. yield Request(url = url, headers = self.default_headers, callback = self.parse)
  23. def parse(self, response):
  24. list_imgs = response.xpath('//div[@class="photolst clearfix"]//img/@src').extract()#注意这里不能再使用extract()[0]
  25. # print (list_imgs)
  26. if list_imgs:
  27. item = DoubanImgItem()
  28. item['image_urls'] = list_imgs
  29. yield item

这里一开始还是引包,看过我之前scrapy系列文章的朋友这里应该很熟悉了。接下来定义一个类download_douban,在里面定义我们的爬虫名称,以及开始爬虫的urls。这里建立了一个default_headers,由于我们只是爬取几张图片,因此简单伪装一下即可,并不需要登录。在parse解析函数中,最主要的就是把得到图片的urls传入item的image_urls字段。这里需要提醒一下大家,ImagePipeline要求['image_urls']字段必须是一个列表,就算只有一个url,也必须是一个列表,因此这里使用extract()而不是extract().[0],我在这里卡了好长时间。

接下来看pipelines.py文件
  1. # -*- coding: utf-8 -*-
  2. # Define your item pipelines here
  3. #
  4. # Don't forget to add your pipeline to the ITEM_PIPELINES setting
  5. # See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
  6. from scrapy.pipelines.images import ImagesPipeline
  7. from scrapy.exceptions import DropItem
  8. from scrapy import Request
  9. from scrapy import log
  10. class DoubanImgPipeline(object):
  11. def process_item(self, item, spider):
  12. return item
  13. class DoubanDownImgloadPipeline(ImagesPipeline):
  14. """docstring for DoubanDownloadPipeline"""
  15. default_headers = {
  16. 'accept' : 'image/webp,image/*,*/*;q=0.8',
  17. 'accept-encoding' : 'gzip, deflate, sdch, br',
  18. 'accept-language' : 'zh-CN,zh;q=0.8,en;q=0.6',
  19. 'cookie' : 'bid=yQdC/AzTaCw',
  20. 'referer' : 'https://www.douban.com/photos/photo/2370443040/',
  21. 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
  22. }
  23. def get_media_requests(self, item, info):
  24. for image_url in item['image_urls']:
  25. self.default_headers['referer'] = image_url
  26. yield Request(image_url, headers = self.default_headers)
  27. def item_completed(self, results, item, info):
  28. image_paths = [x['path'] for ok, x in results if ok]
  29. if not image_paths:
  30. raise DropItem("Item contains no images")
  31. item['image_paths'] = image_paths
  32. return item

在这个py文件中,我们定义了DoubanDownImgloadPipeline这个类,这个类继承于ImagesPipeline。在这里定义了两个函数,一个是根据传入的urls来发起请求,请求完成后直接调用item_completed函数来处理得到的图片。get_media_requests函数中,发起请求的时候,不需要指定回调函数,ImagePipeline会自动调用item_completed函数来处理。

最后我们看一个settings.py文件,对该项目进行一些配置。
首先还是配置一个User-agent

USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'

使用我们自己定义的pipeline

  1. ITEM_PIPELINES = {
  2. 'douban_img.pipelines.DoubanDownImgloadPipeline': 300,
  3. }

设置图片存放的目录以及有效期

  1. IMAGES_STORE = 'D:\\doubanimgs'
  2. IMAGES_EXPIRES = 90

配置结束后保存,返回到命令行运行一下

scrapy crawl download-douban

下面是运行结果截图

这个程序比较简单,我们只是抓取了某个相册中第一页的图片,有兴趣的朋友可以试试把该相册中的所有图片都抓取下来,可以用到上一篇文章提到的结构,当然这种情况就需要登录豆瓣了。

好了,以上就是今天的全部内容。
与您共勉!
(0)

相关推荐

  • 初识scrapy爬虫框架

    框架是为了解决特定的业务场景而开发的一套高质量代码,通过框架避免了重复造轮子的低效模式,可以更加专注于具体业务相关的代码.在python中,scrapy就是一个主流的爬虫框架,可以通过如下方式进行安装 ...

  • 第76天:Scrapy 模拟登陆

    想爬取网站数据?先登录网站!对于大多数大型网站来说,想要爬取他们的数据,第一道门槛就是登录网站.下面请跟随我的步伐来学习如何模拟登陆网站. 为什么进行模拟登陆? 互联网上的网站分两种:需要登录和不需要 ...

  • 抓取了《大秦赋》所有数据,我发现了这些秘密

    前言 最近大火的电视剧<大秦赋>,给朋友圈的小伙伴都拉回到那个风云激荡的春秋战国时期,大家都在热情的讨论着大秦一统,秦始皇嬴政.商人吕不韦的那些尔虞我诈.恩怨情仇.那到底小伙伴们都在讨论什 ...

  • 想要利用Python快速爬取整站图片?速进(附完整代码)

    目录 一. 爬取前的准备 二. 查看网页 三. 分析与实现 1. 先确定我们所要爬取内容的具体位置2. 存储的具体实现 (`在pipelines中处理`)3. 更新完善源码 四. 代码   快速爬取整 ...

  • 如何用PowerBI批量爬取网页数据?

    前面介绍PowerBI数据获取的时候,曾举了一个从网页中获取数据的例子,但当时只是爬取了其中一页数据,这篇文章来介绍如何用PowerBI批量采集多个网页的数据. 本文以智联招聘网站为例,采集工作地点在 ...

  • PowerQuery爬取网页终极攻略——Power Query网络爬取详解

    Power Query并不是一个专门的网抓或者爬虫工具,没有编程语言那么专业,实现的功能也比较有限,但其优势就是简单易学,且无缝对接excel,所见即所得. 本文将以纯新手的角度,介绍一些基础的网抓知 ...

  • 如何利用Excel批量爬取网页上不规范的数据?

    Hello~我是运营菌. 快过年了,有空可以多陪陪家人和孩子.如果有空无聊时,推荐去看看电影.这里给大家推荐的是豆瓣电影TOP250,每一部都是经典,值得再去回顾.这里就叫大家如何把这样的电影列表爬取 ...

  • python爬虫爬取网页表格数据

    https://download.csdn.net/download/weixin_38581447/12870156?utm_medium=distribute.pc_relevant_downlo ...

  • 用 Jupyter Notebook 爬取微博图片保存本地!

    来源:Python 技术「ID: pythonall」 今天咱们用 Jupyter-Notebook 并结合框架(Selenium)模拟浏览器抓取微博图片并将图片保存本地. Selenium 是一个用 ...

  • 学习学习gogogo 篇三:一分钟学会爬取网页文本内容

    创作立场声明:看到一款好软件,简单的操作可以替代繁杂的工作,推荐给大家.我也是刚刚接触,正在学习中,希望能够抛砖引玉.无利益相关. 前几天写了篇长文<一分钟学会制作网络爬虫>. 学习学习g ...

  • Python爬虫入门教程!手把手教会你爬取网页数据

    什么是爬虫? 爬虫就是自动获取网页内容的程序,例如搜索引擎,Google,Baidu 等,每天都运行着庞大的爬虫系统,从全世界的网站中爬虫数据,供用户检索时使用. 爬虫流程 其实把网络爬虫抽象开来看, ...

  • (1条消息) python3爬虫系列04之网页解析器:re正则式,BeautifulSoup库的解释

    (1条消息) python3爬虫系列04之网页解析器:re正则式,BeautifulSoup库的解释

  • python如何爬取网页数据

    少儿编程网2020-09-28 13:21:10[Python编程] 25人已围观 来源:少儿编程 -用户投稿 简介python爬取网页数据的方法:使用"import"语句导入re ...