【问题标题】:Scrapy Clusters Distributed Crawl StrategyScrapy Clusters 分布式爬取策略
【发布时间】:2016-06-29 02:19:28
【问题描述】:

Scrapy 集群很棒。它可用于使用 Redis 和 Kafka 执行巨大的连续爬网。它确实很耐用,但我仍在努力找出满足我特定需求的最佳逻辑的更精细细节。

在使用 Scrapy Clusters 时,我可以设置三个级别的蜘蛛,它们依次接收彼此的网址,如下所示:

site_url_crawler >>> gallery_url_crawler >>> content_crawler

(site_crawler 会向 gallery_url_crawler 提供类似cars.com/gallery/page:1 的内容。gallery_url_crawler 可能会给 content_crawler 提供 12 个 url,它们可能看起来像 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   

(注意额外的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

我认为没有用,因为 dupefilter 将第二个过滤器踢出,因为它认为它是一个骗子。

无论如何,我只是希望最终以一种可以让我随时启动多个蜘蛛实例、从队列中拉出并重复的方式来使用集群。

【问题讨论】:

  • 2020年你还在用scrapy集群吗?我想知道是否有替代方案,因为该项目在过去 2 年没有收到任何提交。好像死了。
  • @Liam Hanninen - 你今天还在使用 scrapy-cluster 吗?如果没有,用什么工具?
  • 啊,太糟糕了。不,我没有使用它。但是我没有使用任何工具来刮。

标签: python redis scrapy apache-kafka apache-zookeeper


【解决方案1】:

事实证明,分发 url 是基于 IP 地址的。一旦我在不同的机器上建立了集群,即。每个蜘蛛的不同机器的 url 流动并且都从队列中获取。

http://scrapy-cluster.readthedocs.org/en/latest/topics/crawler/controlling.html

Scrapy Cluster 有两个主要的策略来控制如何 快速你的蜘蛛池击中不同的域。这是由 蜘蛛类型和/或 IP 地址,但都作用于不同的域 队列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 2014-09-01
    • 1970-01-01
    • 2019-07-27
    • 2016-05-02
    • 1970-01-01
    相关资源
    最近更新 更多