Scrapy Clusters太棒了。它可以用于使用Redis和Kafka执行巨大的连续爬行。这真的很有价值,但我仍在努力为我的特定需求找出最佳逻辑的精细细节。
在使用Scrapy Clusters时,我能够设置三个级别的蜘蛛,这些蜘蛛可以按顺序接收彼此的URL:
site_url_crawler>>> gallery_url_crawler>>> content_crawler
(site_crawler会将类似cars.com/gallery/page:1的内容提供给gallery_url_crawler。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
通过此策略,我可以将网址从一个抓取工具提供给另一个抓取工具,而无需等待后续抓取完成。然后创建一个队列。为了充分利用群集,我希望在存在瓶颈的地方添加更多爬虫。在这个工作流程中,当刮擦内容时,瓶颈就在最后。所以我试验了这个:
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
所以我尝试使用单独的蜘蛛来接收最终队列。
不幸的是,我无法试验这个,因为我无法像gallery_url_crawler.py
中那样将kafka消息传递给demo.inbound:
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
(注意额外的蜘蛛)上面没有用,因为我觉得它不能给两个不同的蜘蛛分配一条消息...... 和
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
我觉得没办法,因为dupefilter踢了第二个,因为它把它视为一个骗局。
无论如何,我只希望最终以一种允许我随时启动多个蜘蛛实例的方式使用Clusters,从队列中拉出来并重复。
答案 0 :(得分:0)
事实证明,分发网址是基于IP地址的。一旦我在不同的机器上站起来,即。每个蜘蛛都有不同的机器,网址流动,并且都从队列中取出。
http://scrapy-cluster.readthedocs.org/en/latest/topics/crawler/controlling.html
Scrapy Cluster有两个控制方式的主要策略 快你的蜘蛛池击中不同的域名。这是由 蜘蛛类型和/或IP地址,但都作用于不同的域 队列。