Lia*_*nen 5 python scrapy redis apache-kafka apache-zookeeper
Scrapy 集群很棒。它可用于使用 Redis 和 Kafka 执行巨大的、连续的爬网。它真的很耐用,但我仍在努力找出满足我特定需求的最佳逻辑的更精细细节。
在使用 Scrapy Clusters 时,我可以设置三个级别的蜘蛛,它们依次接收彼此的 url,如下所示:
site_url_crawler >>> gallery_url_crawler >>> content_crawler
(site_crawler 会给gallery_url_crawler 提供类似cars.com/gallery/page:1 的内容。gallery_url_crawler 可能会给content_crawler 提供12 个网址,这些网址可能看起来像cars.com/car:1234、cars.com/car:1235、cars.com/ car:1236 等。 content_crawler 会收集我们想要的所有重要数据。)
我可以通过添加到 gallery_url_crawler.py
req = scrapy.Request(url)
for key in response.meta.keys():
req.meta[key] = response.meta[key]
req.meta['spiderid']= 'content_crawler1'
req.meta['crawlid'] = 'site1'
yield req
Run Code Online (Sandbox Code Playgroud)
通过这种策略,我可以将 url 从一个爬虫传送到另一个爬虫,而无需等待后续爬虫完成。然后创建一个队列。为了充分利用集群,我希望在存在瓶颈的地方添加更多爬虫。在这个工作流程中,瓶颈在最后,即抓取内容时。所以我尝试了这个:
site_url_crawler >>> gallery_url_crawler >>> content_crawler + content_crawler + content_crawler
由于缺乏更好的说明,我只是想表明我使用了最终蜘蛛的三个实例来处理更长的队列。
但似乎 content_crawler 的每个实例都在耐心等待当前 content_crawler 完成。因此,生产力没有提高。
我的最终想法是这样的:
site_url_crawler >>> gallery_url_crawler >>> content_crawler1 + content_crawler2 + content_crawler3
所以我尝试使用单独的蜘蛛来接收最终队列。
不幸的是,我无法对此进行试验,因为我无法像这样将 kafka 消息传递给 demo.inbound gallery_url_crawler.py
:
req = scrapy.Request(url)
for key in response.meta.keys():
req.meta[key] = response.meta[key]
req.meta['spiderid']= 'content_crawler1'
req.meta['spiderid']= 'content_crawler2'
req.meta['crawlid'] = 'site1'
yield req
Run Code Online (Sandbox Code Playgroud)
(注意额外的spiderid)以上不起作用,因为我认为它不能将单个消息分配给两个不同的蜘蛛......而且
req1 = scrapy.Request(url)
req2 = scrapy.Request(url)
for key in response.meta.keys():
req1.meta[key] = response.meta[key]
req1.meta['spiderid']= 'content_crawler1'
req1.meta['crawlid'] = 'site1'
for key2 in response.meta.keys():
req2.meta[key2] = response.meta[key2]
req2.meta['spiderid']= 'content_crawler2'
req2.meta['crawlid'] = 'site1'
yield req1
yield req2
Run Code Online (Sandbox Code Playgroud)
我认为没有用,因为 dupefilter 踢出了第二个,因为它认为它是一个骗子。
无论如何,我只是希望最终以一种可以让我随时启动多个蜘蛛的实例、从队列中拉出并重复的方式使用集群。
事实证明,url 的分发是基于 IP 地址的。一旦我在不同的机器上建立了集群,即。网址流向每个蜘蛛的不同机器,并且全部从队列中获取。
http://scrapy-cluster.readthedocs.org/en/latest/topics/crawler/controlling.html
Scrapy Cluster 有两种主要策略来控制蜘蛛池访问不同域的速度。这是由蜘蛛类型和/或 IP 地址决定的,但两者都作用于不同的域队列。