崔庆才老师爬虫的学习笔记。

一、基本使用

1、Item Pipeline中文文档0.24.0

http://scrapy-chs.readthedocs.io/zh_CN/latest/topics/item-pipeline.html

2、Item Pipeline的一些典型应用

  • 清理HTML数据

  • 验证爬取的数据(检查item包含某些字段)

  • 查重(并丢弃)

  • 将爬取结果保存到数据库中

3、Item Pipeline

  • process_item() 每个item pipeline组件都需要调用该方法,这个方法必须返回一个 Item (或任何继承类)对象, 或是抛出 DropItem 异常。

  • open_spider() 当spider被开启时,这个方法被调用。

  • close_spider() 当spider被关闭时,这个方法被调用。

  • from_crawler() 可以获取项目settings中的一些配置信息。

4、Item Pipeline样例

  • 将item写入JSON文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import json

class JsonWriterPipeline(object):

def open_spider(self, spider):
self.file = open('items.jl', 'w')

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

def process_item(self, item, spider):
line = json.dumps(dict(item)) + "\n"
self.file.write(line)
return item
  • 将item写入MongoDB数据库:
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
import pymongo

class MongoPipeline(object):

collection_name = 'scrapy_items'

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.settings.get('MONGO_URI'),
mongo_db=crawler.settings.get('MONGO_DATABASE', 'items')
)

def open_spider(self, spider):
self.client = pymongo.MongoClient(self.mongo_uri)
self.db = self.client[self.mongo_db]

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

def process_item(self, item, spider):
self.db[self.collection_name].insert_one(dict(item))
return item
  • 截取item网页截图:
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
import scrapy
import hashlib
from urllib.parse import quote


class ScreenshotPipeline(object):
"""Pipeline that uses Splash to render screenshot of
every Scrapy item."""

SPLASH_URL = "http://localhost:8050/render.png?url={}"

def process_item(self, item, spider):
encoded_item_url = quote(item["url"])
screenshot_url = self.SPLASH_URL.format(encoded_item_url)
request = scrapy.Request(screenshot_url)
dfd = spider.crawler.engine.download(request, spider)
dfd.addBoth(self.return_item, item)
return dfd

def return_item(self, response, item):
if response.status != 200:
# Error happened, return item.
return item

# Save screenshot to file, filename will be hash of url.
url = item["url"]
url_hash = hashlib.md5(url.encode("utf8")).hexdigest()
filename = "{}.png".format(url_hash)
with open(filename, "wb") as f:
f.write(response.body)

# Store filename in item.
item["screenshot_filename"] = filename
return item
  • 去重:
1
2
3
4
5
6
7
8
9
10
11
12
13
from scrapy.exceptions import DropItem

class DuplicatesPipeline(object):

def __init__(self):
self.ids_seen = set()

def process_item(self, item, spider):
if item['id'] in self.ids_seen:
raise DropItem("Duplicate item found: %s" % item)
else:
self.ids_seen.add(item['id'])
return item

5、启用一个Item Pipeline组件:

在settings的ITEM_PIPELINES选项里填写:pipline名称:数字优先级。通常将这些数字定义在0-1000范围内,数字越小优先级越高。例如:

1
2
3
4
ITEM_PIPELINES = {
'myproject.pipelines.PricePipeline': 300,
'myproject.pipelines.JsonWriterPipeline': 800,
}

持续更新…

最后更新: 2018年08月16日 13:05

原始链接: http://pythonfood.github.io/2018/07/05/Scrapy中Item-Pipeline的用法/

× 多少都行~
打赏二维码