Scrapy - 如何启动同一蜘蛛进程的多个实例?

时间:2015-11-13 10:27:17

标签: python web-scraping scrapy scrapy-spider

我在启动同一个蜘蛛的多个实例时遇到困难。我想像1个url for 1 spider实例一样运行它。我必须处理50k网址,为此我需要为每个网址启动单独的实例。在我的主蜘蛛脚本中,我设置了closepider timeut 7分钟,以确保我不会长时间爬行。请参阅以下代码:

from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
import urlparse

for start_url in all_urls:
    domain = urlparse.urlparse(start_url).netloc
    if domain.startswith('ww'):
        domain = domain.split(".",1)[1]

    process = CrawlerProcess(get_project_settings())
    process.crawl('textextractor', start_url=start_url,allowed_domains=domain)
    process.start()

它完全针对第一个url运行,之后第二个url通过时它会出现以下错误:

raise error.ReactorNotRestartable()
ReactorNotRestartable

请建议我该怎么做才能让它为同一个蜘蛛的多个实例运行。此外,我正在考虑使用线程一次启动多个scrapy实例。这会是一个很好的方法吗?

3 个答案:

答案 0 :(得分:0)

这个怎么样

process = CrawlerProcess(get_project_settings())

for start_url in all_urls:
    domain = urlparse.urlparse(start_url).netloc
    if domain.startswith('ww'):
        domain = domain.split(".",1)[1]
    process.crawl('textextractor', start_url=start_url,allowed_domains=domain)

process.start()

答案 1 :(得分:0)

您是否有特定原因要启动5万个Spider实例?默认情况下,Twisted仅允许单个实例运行(除非您杀死整个过程并重新启动)

其次,“ 1个蜘蛛实例的1个url”将导致巨大的内存开销。相反,您应该考虑将所有网址传递到同一实例。

答案 2 :(得分:0)

就我而言,不需要您的目的。因为蜘蛛抓狂,所以您产生的每个request都是异步的。无需创建多个实例。

提高蜘蛛速度的方法是Increase concurrency

处理50k网址的方法是spider-arguments