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