[Python数据采集]Scrapy实现图片下载

「这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战

前言

Scrapy框架是专门用于实现爬虫的一个框架,其数据处理部分,均在Pipelines层中实现,因此,通过修改Pipelines层,就可以实现图片的保存或其他数据处理操作。

基本设置

在开始进行爬虫之前,需要先进行一些设置,例如:

  1. 设置默认请求头;
  2. 设置下载路径(需要自行添加IMAGES_STORE字段,setting.py中原来是没有的);
  3. 启动Pilelines(把原本的注释取消掉即可)

代码如下:

# setting.py
# 关闭爬虫协议验证
ROBOTSTXT_OBEY = False
# 设置默认请求头
DEFAULT_REQUEST_HEADERS = {
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'Accept-Language': 'en',
}
# 设置下载路径
# 启动pipeline
import os
IMAGES_STORE = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'images')
ITEM_PIPELINES = {
   'session_2.pipelines.Session2Pipeline': 300,
}
# 启动下载器 
DOWNLOADER_MIDDLEWARES = { 'session_2.middlewares.Session2DownloaderMiddleware': 543, }
复制代码

编写Pipeline

需要实现图片的下载,我们需要让自己的pipeline继承scrapy框架的ImagesPipeline。scrapy框架在此pipeline中封装了图片下载操作(并发下载,速度可以保证)。

由于scrapy封装十分完善,我们只需要覆写get_media_requests函数,将图片的url通过yield Request(item['url'])传递给下载操作:

# pipelines.py
from scrapy import Request
from scrapy.pipelines.images import ImagesPipeline

class Session2Pipeline(ImagesPipeline):
    # 继承ImagesPipeline
    def get_media_requests(self, item, info):
        print(item['url'])
        yield Request(item['url'])
复制代码

在scrapy爬虫框架启动后,文件会根据setting.py中设置的IMAGES_STORE,将图片保存在IMAGES_STORE/full目录下。

image.png

传递url

item中至少需要一个url参数(其他参数与本教程无关,就省略了):

# item.py
import scrapy

class Session2Item(scrapy.Item):
    # define the fields for your item here like:
    url = scrapy.Field()
复制代码

在主爬虫函数中,使用yield Session2Item(url=img)将url传递给Pipeline,解析部分,可以使用CSS、XPath或是re,可以根据自己的熟练程度和喜好自行选择,这里也就不再赘述了:

# main.py
yield Session2Item(url=img)
复制代码

image.png