Item Pipeline(项目管道)。Spider解析完Response就会产生Item,Item就会被Engine传递到Item Pipeline,被定义的Item Pipeline组件就会顺次被调用,完成一连串的处理过程:
- 清洗HTML数据
- 验证爬取数据,检查爬取字段
- 查重并丢弃重复内容
- 将爬取结果存储到数据库中
核心方法
必须实现的方法:
- process_item(item, spider)
可选实现的方法:
- open_spider(spider)
- close_spider(spider)
- from_crawler(cls, crawler)
- process_item(item, spider)
被定义的Item Pipeline会默认调用这个方法对Item进行处理,比如进行数据处理或者将数据写入数据库等操作。
参数:
- item:Item对象,即被处理的Item
- spider:Spider对象,即生成该Item的Spider
返回值:Item对象/抛出DropItem异常
不同返回值的效果:
- Item对象——接着调用低优先级的Item Pipeline的process_item方法,直到所有方法被调用完毕
- 抛出DropItem异常——Item会被丢弃,不再进行处理
- open_spider(spider)
在Spider开启的时候被自动调用,可以进行初始化操作,如开启数据库连接等。
参数:spider,即被开启的Spider对象
- close_spider(spider)
在Spider关闭时候被自动调用,可以进行一些收尾工作,如关闭数据库连接等。
参数:spider,即被关闭的Spider对象
- from_crawler(cls, crawler)
是一个类方法,用@classmethod标识,通过crawler对象,拿到Scrapy的所有核心组件,如全局配置的每个信息。然后可以在这个方法里面创建一个Pipeline实例。
参数:
- crawler:即Crawler对象
- cls:就是Class,最后返回一个Class实例
实战
爬取目标:爬取网站,将每部电影的名称、类别、评分、简介、导演、演员的信息以及相关图片爬取下来。
数据保存:把每部电影的完整数据保存在MongoDB和Elasticsearch中,同时将导演、演员的相关图片保存成一个文件夹。(会使用Pipeline分别实现MongoDB存储、Elasticsearch存储、Image图片存储)
需要环境:
- 软件:MongoDB和Elasticsearch
- Python包:PyMongo、Elasticsearch、Scrapy
新建项目&Spider
新建一个项目:scrapy startproject scrapyitempipelinedemo
新建一个Spider:scrapy genspider scrape ssr1.scrape.center
构建索引页URL,拿到索引页的Response
(定义的翻页数量是X,就执行X次)
在Spider中,定义start_requests方法,向所有索引页发出Request,接收到的Response提交parse_index进一步处理:
import scrapy
class ScrapeSpider(scrapy.Spider):
name = 'scrape'
allowed_domains = ['ssr1.scrape.center']
base_url = 'http://ssr1.scrape.center'
# 定义域名
max_page = 10
# 定义最大的翻页数量
def start_requests(self):
#定义一个新的方法
for i in range(1, self.max_page+1):
# 逐一输出页面编号(1到10)
url = f'{self.base_url}/page/{i}'
# 构造页面的链接