scrapy框架处理多爬虫

酥酥 发布于 2021-09-18 121 次阅读


scrapy框架处理多爬虫

一、创建多爬虫

业务需求:scrapy强大的功能使得他往往是爬取多个网站进行数据汇总,所以多爬虫是scrapy框架所必要的

cd 到项目目录下

scrapy genspider 爬虫名

执行多次创建多个爬虫在项目–spider目录下

二、技术关键

法一:在spider parse方法 中给item加一个字段”come_from”用于标识爬取的是那个网站
在pipeline 中对process_item传来的item进行判断
				
					if item["come_from"]=="..."
        elif:
				
			
以这种方式把管道内的来自不同网站的爬取数据过滤后递交给不同的方法

为了区分,可以把if语句分配到多管道,有层次的,有筛选的进行加工

法二:我们注意到pipeline的process_item有三个参数

还有一个spider 这个其实可以看作是所有spider的父类,而在spider文件中也就是子类的spider有name属性,一个多态的实现,所以也可以通过在pipeline中

多个spider—一个pipeline

				
					if spider.name =="...":
				
			

来判断是哪个爬虫爬来的信息,进而知道是哪个网站的信息

法三:一个管道多个item

				
					from scrapy_shiyan.items import ScrapyShiyanItem, ScrapyShiyanItem_2
# 注意一定要在pipelines.py中导入items.py文件中的类
class ScrapyShiyanPipeline(object):
    def process_item(self, item, spider):
        if isinstance(item, ScrapyShiyanItem):

            print("第一个管道类")
            print("第一个items模型类的输出:")
            print(item['name'])
            print(item['age'])

        elif isinstance(item, ScrapyShiyanItem_2):
            print("第一个管道类")
            print("第二个items模型类的输出:")
            print(item['name2'])
            print(item['age2'])


        return item

				
			

以上方法可以混合使用

				
					
from scrapy_shiyan.items import ScrapyShiyanItem, ScrapyShiyanItem_2
# 注意一定要在pipelines.py中导入items.py文件中的类
class ScrapyShiyanPipeline(object):
    def process_item(self, item, spider):
        if isinstance(item, ScrapyShiyanItem):

            print("第一个管道类")
            print("第一个items模型类的输出:")
            print(item['name'])
            print(item['age'])

        elif isinstance(item, ScrapyShiyanItem_2):
            print("第一个管道类")
            print("第二个items模型类的输出:")
            print(item['name2'])
            print(item['age2'])


        return item



class ScrapyShiyanPipeline_2(object):
    def process_item(self, item, spider):
        if isinstance(item, ScrapyShiyanItem):

            print("第2个管道类")
            print("第一个items模型类的输出:")
            print(item['name'])
            print(item['age'])

        elif isinstance(item, ScrapyShiyanItem_2):
            print("第2个管道类")
            print("第二个items模型类的输出:")
            print(item['name2'])
            print(item['age2'])


        return item