scrapy 中如何自定义 pipeline 下载图片

这里以一个很简单的小爬虫为例,爬取 壹心理 网站的阅读页面第一页的所有文章及其对应的图片,文章页面如下:

创建项目

首先新建一个 scrapy 项目,安装好相关依赖(步骤可参考:scrapy 安装及新建爬虫项目并运行)。

新建一个爬虫:

scrapy genspider xinli001 ‘www.xinli001.com/info‘

此时项目工程目录与新建的爬虫如下:

爬取信息并编写图片自动下载逻辑

本次主要是记录自定义 pipeline 来爬取图片,所以只是简单的选取一些信息来爬取,包括文章标题、图片、发布时间和作者。

1.通过 xpath 提取出文章模块,就是下图中方框中的:

上图右边便是对应的代码位置,下面将先使用 xpath 提取所有 item 模组,之后在对所有 item 组块遍历分别提取其对应的相关信息。

提取 item

post_nodes = response.xpath(‘//*[@id="articleListM"]//div[@class="item"]‘)
2.遍历 post_nodes 并从中提取出相关信息:

下面给出第一个 item 中的网页结构:

对照上面结构提取相关信息:

# 图片
image_url= post_node.xpath(‘a/img/@src‘).extract_first()
# 标题
title = post_node.xpath(‘div[@class="right"]/a/text()‘).extract_first()
# 发布时间
create_date = post_node.xpath(‘div[@class="right"]/div[@class="info"]/span/text()‘).extract_first()
# 作者
writer = post_node.xpath(‘div[@class="right"]/div[@class="info"]/a[1]/span/text()‘).extract_first()
3.定义 Xinli001Item

item.py 文件中添加 xinli001 爬虫对应的 item:

class Xinli001SpiderItem(scrapy.Item):
    title = scrapy.Field()
    image_url = scrapy.Field()
    writer = scrapy.Field()
    create_date = scrapy.Field()
4.提交 item 实例
# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request
from urllib import parse
from Xinli001Spider.items import Xinli001SpiderItem
?
?
class Xinli001Spider(scrapy.Spider):
    name = ‘xinli001‘
    allowed_domains = [‘www.xinli001.com‘]
    start_urls = ["https://www.xinli001.com/info/"]
?
    def parse(self, response):
        # 提取文章 model
        post_nodes = response.xpath(‘//*[@id="articleListM"]//div[@class="item"]‘)
        for post_node in post_nodes:
            # 创建 item 实例
            article_item = Xinli001SpiderItem()
?
            # 图片
            image_url= post_node.xpath(‘a/img/@src‘).extract_first()
            # 标题
            title = post_node.xpath(‘div[@class="right"]/a/text()‘).extract_first()
            # 发布时间
            create_date = post_node.xpath(‘div[@class="right"]/div[@class="info"]/span/text()‘).extract_first()
            # 作者
            writer = post_node.xpath(‘div[@class="right"]/div[@class="info"]/a[1]/span/text()‘).extract_first()
?
            article_item[‘image_url‘] = [image_url]
            article_item[‘title‘] = title
            article_item[‘create_date‘] = create_date
            article_item[‘writer‘] = writer
?
            # 提交 item 实例给 pipeline 处理
            yield article_item
5.配置图片下载相关参数:
# 实现自动的图片下载的相关配置
IMAGES_URLS_FIELD = "image_url"     # 图片
project_dir = os.path.abspath(os.path.dirname(__file__))    # 获取当前路径
IMAGES_STORE = os.path.join(project_dir, ‘images‘)  # 将图片保存到当前项目路径下的 images 文件夹下

将上面的代码加入到 settings.pyConfigure item pipelines 相关代码的下方。

6.启用 scrapy 的图片下载

在第5步之后,需要在 settings.py 中开启图片下载的服务:

7.再次运行爬虫,便可实现图片的自动下载

获取图片存放路径

图片下载之后,若要想访问图片,则需要获得图片的存放路径,此时我们便可对上面的 ImagePipeline 实现自定义来将获取图片存放路径的逻辑填充进代码中。

1-首先,添加 ArticleImagePipeline 类:
# 自定义 ImagePipeline ,继承自 ImagesPipeline,并添加相关自定义操作
class ArticleImagePipeline(ImagesPipeline):
    # 重写 item_completed 方法
    def item_completed(self, results, item, info):
        # 默认传过来的 result 是一个list
        # ok 表示返回是否成功,value是一个dict,存放了图片保存的路径
        for ok, value in results:
            image_file_path = value["path"]
        # 将获得的文件存放路径填充到 item 中
        item["front_image_path"] = image_file_path
?
        # 返回item
        return item
2-将 ArticleImagePipeline 配置到 settings.py 文件中:
# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
   ‘Xinli001Spider.pipelines.Xinli001SpiderPipeline‘: 300,
   # ‘Xinli001Spider.pipelines.ImagesPipeline‘: 1,
   ‘Xinli001Spider.pipelines.ArticleImagePipeline‘: 1,
}

注意上面之前使用的 ImagesPipeline 不需要了,要注释掉。

3-添加相关 item 属性

Xinli001SpiderItem 中添加一个 front_image_path 属性来存储图片存放路径:

4-查看返回的图片路径

第二步中我们配置了两个 Pipeline ,一个顺序在前(ArticleImagePipeline:1),一个在后(Xinli001SpiderPipeline:300),我们可以在后面的 Pipeline 处理函数处打个断点,然后启动调试功能来运行。

打断点:

debug 一下:

可以看到执行到断点处时,已经提取到了图片存放路径:

原文地址:https://www.cnblogs.com/zishu/p/11562968.html

时间: 2024-10-30 17:08:18

scrapy 中如何自定义 pipeline 下载图片的相关文章

通过scrapy内置的ImagePipeline下载图片到本地

1.通过scrapy内置的ImagePipeline下载图片到本地 1.通过scrapy内置的ImagePipeline下载图片到本地 1)在settings.py中打开 ITEM_PIPELINES 的注释,在  ITEM_PIPELINES 中加入 ITEM_PIPELINES = { 'spider_first.pipelines.SpiderFirstPipeline': 300, 'scrapy.pipelines.images.ImagesPipeline':5, #后面的数字代表执

javaWeb中在servlet中response下载图片

package org.servlet.demo; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.net.URLEncoder; import javax.servlet.ServletException

10 UA池和代理池在Scrapy中的应用

下载中间件简介 在Scrapy中,引擎和下载器之间有一个组件,叫下载中间件(Downloader Middlewares).因它是介于Scrapy的request/response处理的钩子,所以有2方面作用: (1)引擎将请求传递给下载器过程中,下载中间件可以对Requests进行一系列处理.比如设置请求的 User-Agent,设置代理ip等 (2)在下载器完成将Response传递给引擎中,下载中间件可以对Responses进行一系列处理.比如进行gzip解压等. 爬虫中,主要使用下载中间

scrapy中下载文件和图片

下载文件是一种很常见的需求,例如当你在使用爬虫爬取网站中的图片.视频.word.pdf.压缩包等的时候 scrapy中提供了FilesPipeline和ImagesPipeline,专门用来下载文件和图片: 我们其实可以把这两个item pipeline看成是特殊的下载器,用户使用的时候只需要通过item的一个特殊的字段就可以将要下载的文件或者图片的url传递给它们,它们会自动将文件或者图片下载到本地,并将下载的结果信息存入到item的另一个特殊的字段,方便用户在导出文件的时候查阅 FilesP

scrapy (2)下载图片及存储信息

例1:scrapy项目的使用(利用item收集抓取的返回值) 1.创建scrapy项目 scrapy startproject booklist New Scrapy project 'booklist', using template directory '/usr/local/lib/python3.6/site-packages/scrapy/templates/project', created in:     /Users/yuanjicai/booklist You can star

Day3-scrapy爬虫下载图片自定义名称

学习Scrapy过程中发现用Scrapy下载图片时,总是以他们的URL的SHA1 hash值为文件名,如: 图片URL:http://www.example.com/image.jpg 它的SHA1 hash值为:3afec3b4765f8f0a07b78f98c07b83f013567a0a 则下载的图片为:3afec3b4765f8f0a07b78f98c07b83f013567a0a.jpg 目的是下载的图片为:image.jpg或者xxx.jpg 可以通过编写Pipeline来实现. 以

scrapy下载图片第一波

scrapy的图片管道,在ImagePipeline类中实现 ,提供了一个方便并具有额外特性的方法,来下载并本地存储图片: * 将所有下载的图片转换成通用的格式(JPG)和模式(RGB) * 避免重新下载最近已经下载过的图片 * 缩略图生成 * 检测图像的宽/高,确保它们满足最小的限制 这个管道也会为那些当前安排好要下载的图片保留一个内部队列,并将那些到达的包含相同图片的项目连接到那个队列中. 这可以避免多次下载几个项目共享的同一个图片. Pillow是用来生成缩略图,并将图片归一化为JPEG/

爬虫07 /scrapy图片爬取、中间件、selenium在scrapy中的应用、CrawlSpider、分布式、增量式

目录 爬虫07 /scrapy图片爬取.中间件.selenium在scrapy中的应用.CrawlSpider.分布式.增量式 1. scrapy图片的爬取/基于管道类实现 2. 中间件的使用 3. selenium在scrapy中的应用 4. CrawlSpider 5. 分布式 5. 增量式 爬虫07 /scrapy图片爬取.中间件.selenium在scrapy中的应用.CrawlSpider.分布式.增量式 1. scrapy图片的爬取/基于管道类实现 爬取流程: 爬虫类中将解析到的图片

iOS多线程自定义operation加载图片 不重复下载图片

摘要:1:ios通过抽象类NSOperation封装了gcd,让ios的多线程变得更为简单易用:   2:耗时的操作交给子线程来完成,主线程负责ui的处理,提示用户的体验   2:自定义operation继承自NSOperation,在子线程中下载图片: 3:保证图片只下载一次,还有保证下载任务不重复 ------------------------------------------------------------------------------------ 实现原理:1:图片缓存:用