蜘蛛设计
有 2 种方法来构建域蜘蛛
- 将 url 列表作为参数发送给单个蜘蛛
- 使用不同的 start_url 作为参数运行同一蜘蛛的多个实例
第一种方法是最直接且易于测试的(您可以使用 scrapy crawl 运行),并且在许多情况下都可以。第二种方法使用起来不太方便,但更容易编写代码:
- 将 url 列表作为参数发送给单个蜘蛛:
- 最小的 CPU 占用:为所有 url 启动 1 个单一进程
- 用户友好:可以作为 scrapy crawl 或 scrapyd 运行
- 更难调试:没有域限制
- 为每个 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 )。你不需要写多个蜘蛛。
仅供参考:更新项目不会影响正在运行的蜘蛛。