python scrapy抓取多个item 返回pipeline的处理

一个scrapy项目可能你定义了多个item抓取不同的对象,比如Atime抓取页面内容,Bitem下载图片或文件,如何在pipeline里面处理多个item的问题呢?

原理很简单在pipeline里面按item的类型判断,是Aitem就按APipeline处理,是Bitem就按Bpipeline处理。

注意:不要丢弃不能处理的item

以抓取同时页面和下载图片为例:

1、首先在settings里面设置ITEM_PIPELINES

ITEM_PIPELINES = {   
    #网页抓取 
    'douban.pipelines.doubanPipeline': 10,
    #文件下载
    'douban.pipelines.doubanFilePipeline': 100,
}
#图片下载地址
FILES_STORE   ='D:\\1'
FILES_EXPIRES = 90 #90天内抓取的都不会被重抓

2、在pipeline里面定义

import scrapy
from scrapy.pipelines.files import FilesPipeline
from scrapy.pipelines.images import ImagesPipeline
from scrapy.exceptions import DropItem
from douban.items import doubanTextItem,doubanItem
import json
class doubanPipeline(object):
    def process_item(self, item, spider):
        if isinstance(item,doubanTextItem):   #判断item是否为doubanTextItem类型
            name = item['title'] + '.txt'
            with open(name, 'a', encoding='utf-8') as f:
                text = "".join(item['text'])
                f.write(text)
        return item                         #返回item
class doubanFilePipeline(FilesPipeline):
    def file_path(self, request, response=None, info=None):
        image_guid = request.url.split('/')[-1]
        file_name = image_guid.split('.')[0] + '.jpg'
        name = request.meta['name']
        if len(name):
            file_name=name+'/'+file_name
        return 'full/%s' % (file_name)

    def get_media_requests(self, item, info):
        if isinstance(item, doubanItem):        #判断item是否为doubanItem类型
            for image_url in item['file_urls']:
                if 'http' in image_url:
                    name = item['name']
                    yield scrapy.Request(url=image_url, meta={'name': name})

    def item_completed(self, results, item, info):
        if isinstance(item, doubanItem):
            image_paths = [x['path'] for ok, x in results if ok]
            if not image_paths:
                raise DropItem("Item contains no images")
            # item['image_paths'] = image_paths
            return item

3、在spider里面实现各种item的定义

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值