我有一个项目,我必须在其中抓取大量不同的网站。所有这些网站的爬行都可以使用相同的蜘蛛,因为我不需要从其正文页面中提取项目。我想到的方法是在蜘蛛文件中参数化要爬行的域,并调用 scrapy scrapy 命令传递域并启动 url 作为参数,这样我就可以避免为每个站点生成一个蜘蛛(站点列表将增加超过时间)。我的想法是将其部署到运行 scrapyd 的服务器上,所以我想到了几个问题:
蜘蛛设计
有两种构建域蜘蛛的方法
第一种方法是最直接且易于测试的(您可以使用 scrapy scrapy 运行),并且在许多情况下都很好。第二种方法使用起来不太方便,但更容易编写代码:
。
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)
Run Code Online (Sandbox Code Playgroud)
仅当您遇到编程挑战时,我才会推荐第二种方法。否则,为了简单性和可扩展性,请坚持选项 1
并发性
您可以通过settings.py添加 CONCURRENT_REQUESTS_BY_DOMAIN 变量来控制并发性。
项目更新
两种架构都只需要编写 1 个蜘蛛。您只需实例化蜘蛛一次(选项 1 )或每个 url 实例化一次(选项 2 )。您不需要编写多个蜘蛛。
仅供参考:更新项目不会影响正在运行的蜘蛛。