Home

Y's Blog

Salted fish without dreams

Home Notes About Github

2018-10-30
Scrapy框架中Pipeline用法

当Item 在Spider中被收集之后,就会被传递到Item Pipeline中进行处理

每个item pipeline组件是实现了简单的方法的python类,负责接收到item并通过它执行一些行为,同时也决定此Item是否继续通过pipeline,或者被丢弃而不再进行处理

item pipeline的主要作用:

  1. 清理html数据
  2. 验证爬取的数据
  3. 去重并丢弃
  4. 讲爬取的结果保存到数据库中或文件中

自己编写pipeline

process_item(self,item,spider)

每个item piple组件是一个独立的pyhton类,必须实现以process_item(self,item,spider)方法

每个item pipeline组件都需要调用该方法,这个方法必须返回一个具有数据的dict,或者item对象,或者抛出DropItem异常,被丢弃的item将不会被之后的pipeline组件所处理

下面的方法也可以选择实现

open_spider(self,spider):表示当spider被开启的时候调用这个方法

close_spider(self,spider):spider结束的时候这个方法被调用

from_crawler(cls,crawler):这个和我们在前面说spider的时候的用法是一样的,可以用于获取settings配置文件中的信息

自己编写了TextPipeline和MongoPipeLine

TextPipeline:用来出来返回的Item,对Item[‘text’]进行长度限制

MongoPipeline:将数据插入到MongoDB中,同时,也演示了from_crawler如何从settings中回去配置数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53


# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html


import pymongo
from scrapy.exceptions import DropItem

# item 的处理
class TextPipeline(object):
def __init__(self):
self.limit=50
def process_item(self, item, spider):
if item['text']:
if len(item['text'])>self.limit:
item['text'] = item['text'][0:self.limit].rstrip()+'...'
return item['text']
else :
return DropItem('Missing Text')

# 保存到MongoDB


class MongoPipeLine(object):
def __init__(self,mongo_uri,mongo_db):
self.mongo_uri = mongo_uri
self.mongo_db =mongo_db

@classmethod
def from_crawler(cls,crawler):
return cls(
mongo_uri = crawler.setting.get('MONGO_URI'),
mongo_db = crawler.setting.get('MONGO_DB')
)

# 爬虫启动时进行的相关操作
def open_spider(self,spider):
self.client = pymongo.MongoClient(self.mongo_uri)
self.db = self.client[self.mongo_db]

# item插入到MongoDB
def process_item(self,item,spider):
name = item.__class__.__name__
self.db[name].insert(dict(item))
return item

def close_spider(self,spider):
self.client.close()

启用一个item Pipeline组件

1
2
3
4
5
6
7
# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
'quote.pipelines.TextPipeline': 300,
'quote.pipelines.MongoPipeline': 400,

}

每个pipeline后面有一个数值,这个数组的范围是0-1000,这个数值确定了他们的运行顺序,数字越小优先级遇高


Y's Blog

scribble

Home Notes About Github