Python 使用一个Scrapy spider保持数据流分离

Python 使用一个Scrapy spider保持数据流分离,python,python-2.7,python-3.x,web-scraping,scrapy,Python,Python 2.7,Python 3.x,Web Scraping,Scrapy,我想从货物、服务、建筑三个不同类别的合同中搜集数据 因为每种类型的契约都可以用相同的方法进行解析,所以我的目标是使用一个spider,在三个不同的URL上启动spider,然后在三个不同的流中提取数据,这些数据可以保存到不同的位置 我的理解是,仅将所有三个URL列为start_URL将导致一个数据组合输出 我的蜘蛛继承自Scrapy的爬行蜘蛛类 如果您需要更多信息,请告诉我。在您的Spider中,像这样交出您的物品 data = {'categories': {}, 'contracts':{}

我想从货物、服务、建筑三个不同类别的合同中搜集数据

因为每种类型的契约都可以用相同的方法进行解析,所以我的目标是使用一个spider,在三个不同的URL上启动spider,然后在三个不同的流中提取数据,这些数据可以保存到不同的位置

我的理解是,仅将所有三个URL列为start_URL将导致一个数据组合输出

我的蜘蛛继承自Scrapy的爬行蜘蛛类


如果您需要更多信息,请告诉我。

在您的Spider中,像这样交出您的物品

data = {'categories': {}, 'contracts':{}, 'goods':{}, 'services':{}, 'construction':{} }
其中每个项都包含一个Python字典

然后创建一个管道,在管道内部执行此操作

if 'categories' in item:
   categories = item['categories']
   # and then process categories, save into DB maybe

if 'contracts' in item:
   categories = item['contracts']
   # and then process contracts, save into DB maybe
.
.
.
# And others

我建议你从另一个角度来解决这个问题。在scrapy中,可以使用-a选项从命令行向spider传递参数,如下所示

scrapy crawl CanCrawler -a contract=goods
您只需要在类初始值设定项中包含引用的变量

class CanCrawler(scrapy.Spider):
    name = 'CanCrawler'
    def __init__(self, contract='', *args, **kwargs):
        super(CanCrawler, self).__init__(*args, **kwargs)
        self.start_urls = ['https://buyandsell.gc.ca/procurement-data/search/site']
        # ...
<>你可能会考虑添加多个参数,这样你就可以在网站的主页上开始使用参数,你可以得到任何你需要的数据。例如,对于这个网站,您可以有两个命令行参数

    scrapy crawl CanCrawler -a procure=ContractHistory -a contract=goods
所以你会得到

class CanCrawler(scrapy.Spider):
    name = 'CanCrawler'
    def __init__(self, procure='', contract='', *args, **kwargs):
        super(CanCrawler, self).__init__(*args, **kwargs)
        self.start_urls = ['https://buyandsell.gc.ca/procurement-data/search/site']
        # ...
然后,根据您传递的参数,您可以让爬虫程序单击网站上的这些选项,以获取要爬网的数据。 .
我希望这有帮助

我感谢你的答复。我对问题的描述不够清楚,所以你提供的答案不能解决问题。这是我自己的错。当然是另一种方法。。。但这是一个有效的方法。我只需要指定合同类型,因此不包括procure、*args或**kwargs参数。谢谢你的时间和洞察力。