欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

scrapy中Pipeline的使用

程序员文章站 2022-03-03 07:58:41
...

scrapy中Pipeline的使用

Pipeline模块的作用:

  • 清理HTML数据
  • 验证抓取的数据(检查项目是否包含某些字段)
  • 检查重复项(并将其删除)
  • 将刮擦的物品存储在数据库中

过滤与存储实例:

将数据修改过滤,之后保存至本地

# -*- coding: utf-8 -*-
# Define your item pipelines here
# 
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
class XiaohuaPipeline(object):

    # 爬虫开始执行一次
    def open_spider(self, spider):
        self.fp = open('joke.txt', mode='w', encoding='utf-8')

    # 爬虫关闭时执行一次
    def close_spider(self, spider):
        self.fp.close()

    # 交给优先级低的继续执行
    def process_item(self, item, spider):
        item['time'] = u'4月'+item['time']
        self.fp.write('%s, %s, %s\n' % (item['title'], item['href'], item['time']))
        if item['time']=='4月25日':
            #返回的结果给下一级,如果没有那么就会报错
            return item

根据模块里的提示:请不要忘记配置setting

scrapy中Pipeline的使用

(数值0~1000,越小优先级越高)

setting里的ITEM_PIPELINES解释:
里面是以字典的形式进行存放

xiaohua:代表爬虫项目名

pipelines:代表模块名

xiaohuaPipeline:代表类名

里面的  点   :代表下一级的意思

去重实例:

from scrapy.exceptions import DropItem
class DuplicatesPipeline(object):
    #初始化数据,定义一个空集合,这里需注意集合的特性,无序不重复
    def __init__(self):
        self.ids_seen = set()
    def process_item(self, item, spider):
        #判断这个数据是否已经在集合里了,如果在抛出自定义异常,如果不在添加此数据,并返回数据给下一级
        if item['time'] in self.ids_seen:
            raise DropItem('Duplicate item found: %s'% item)
        else:
            self.ids_seen.add(item['time'])
            return item