使用一个粗略的spid保持数据流分离

2024-06-02 09:42:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从三类不同的合同中搜集数据——货物、服务、建筑。你知道吗

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

我的理解是,将所有三个url都列为start_urls将导致一个数据的组合输出。你知道吗

我的spider继承自Scrapy的CrawlSpider类。你知道吗

如果你需要进一步的信息,请告诉我。你知道吗


Tags: 数据方法信息url类型目标地方urls
2条回答

在你的蜘蛛中,像这样交出你的物品。你知道吗

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']
        # ...

你还可以考虑添加多个参数,这样你就可以从一个网站的主页开始,使用这些参数,你就可以得到你需要的任何数据。例如,对于这个网站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']
        # ...

然后根据您传递的参数,您可以让爬虫程序单击网站上的这些选项,以获取要爬网的数据。 Please also see here。 我希望这有帮助!你知道吗

相关问题 更多 >