3

我有一个项目,我必须在其中抓取大量不同的站点。所有这些网站的爬行都可以使用同一个蜘蛛,因为我不需要从它的正文页面中提取项目。我认为的方法是在蜘蛛文件中参数化要爬取的域,并调用scrapy crawl命令传递域和启动url作为参数,这样我就可以避免为每个站点生成一个蜘蛛(站点列表会增加时间)。这个想法是将它部署到运行scrapyd的服务器上,所以我遇到了几个问题:

  • 这是我能采取的最好方法吗?
  • 如果是这样,如果我安排多次传递不同参数的同一个蜘蛛,是否有任何并发​​问题?
  • 如果这不是最好的方法,最好为每个站点创建一个蜘蛛......我将不得不经常更新项目。项目更新会影响正在运行的蜘蛛吗?
4

1 回答 1

4

蜘蛛设计

有 2 种方法来构建域蜘蛛

  1. 将 url 列表作为参数发送给单个蜘蛛
  2. 使用不同的 start_url 作为参数运行同一蜘蛛的多个实例

第一种方法是最直接且易于测试的(您可以使用 scrapy crawl 运行),并且在许多情况下都可以。第二种方法使用起来不太方便,但更容易编写代码:

  1. 将 url 列表作为参数发送给单个蜘蛛:
    • 最小的 CPU 占用:为所有 url 启动 1 个单一进程
    • 用户友好:可以作为 scrapy crawl 或 scrapyd 运行
    • 更难调试:没有域限制
  2. 为每个 start_url 运行 1 个实例
    • 大量资源占用:为每个 url 启动 1 个专用进程
    • 对用户不友好:需要创建一个外部脚本来启动蜘蛛和提要 url。
    • 更容易调试:编写代码一次运行 1 个域

.

from urlparse import urlparse
...
class .....(Spider):
    def __init__(*args, *kwargs):
        ...
        self.start_urls = ....
        ...
        self.allowed_domains = map(lambda x: urlparse(x).netloc, self.start_urls)

仅当您遇到编程挑战时,我才会推荐第二种方法。否则,为了简单和可扩展性,坚持选项 1

并发

settings.py您可以通过添加 CONCURRENT_REQUESTS_BY_DOMAIN 变量来控制并发。

项目更新

两种架构都只需要编写 1 个单一的蜘蛛。您只实例化蜘蛛一次(选项 1 )或每个 url 一次(选项 2 )。你不需要写多个蜘蛛。

仅供参考:更新项目不会影响正在运行的蜘蛛。

于 2014-07-05T00:33:43.617 回答