Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Scrapy-如何启动同一spider进程的多个实例?_Python_Web Scraping_Scrapy_Scrapy Spider - Fatal编程技术网

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

Python Scrapy-如何启动同一spider进程的多个实例?,python,web-scraping,scrapy,scrapy-spider,Python,Web Scraping,Scrapy,Scrapy Spider,我在启动同一个spider的多个实例时被卡住了。我想像运行一个蜘蛛实例的url一样运行它。我必须处理50k个URL,为此,我需要为每个URL启动单独的实例。在我的主蜘蛛脚本中,我将closedpider时间设置为7分钟,以确保我不会长时间爬行。请参阅下面的代码: from scrapy.crawler import CrawlerProcess from scrapy.utils.project import get_project_settings import urlparse for s

我在启动同一个spider的多个实例时被卡住了。我想像运行一个蜘蛛实例的url一样运行它。我必须处理50k个URL,为此,我需要为每个URL启动单独的实例。在我的主蜘蛛脚本中,我将closedpider时间设置为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
请建议我应该怎么做才能使它在同一个spider的多个实例中运行。另外,我正在考虑使用线程一次启动多个scrapy实例。这是个好办法吗?

这个怎么样

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()

您希望启动50k个spider实例的具体原因是什么?Twisted默认情况下只允许运行一个实例(除非终止整个进程并重新启动)


其次,“1个蜘蛛实例的1个url”将在内存中造成巨大的开销。你应该考虑把所有的URL传递给同一个实例。

< P>我的例子是,你的目的是不需要的。因为scrapy中的spider,所以您产生的每个
请求都是异步的。这不需要创建多个实例

加速蜘蛛的方法是


处理50k个url的方法是

furas,我用您的解决方案测试了它,但它没有提供正确的结果。此解决方案确实启动了多个实例,但没有给出
ReactorNotRestartable
错误,但它只完全爬行最后传递的url,对于其他url,它确实开始爬行,但不会爬行超过1个url,并且完成蜘蛛。我已经分别检查了这些URL,它们确实返回了大量的爬网数据。另外,正如我所提到的,我必须对50k URL进行爬网。这样做意味着我将立即开始对50k URL进行爬网吗?这似乎是一个很好的方法吗?关于这个问题有任何更新吗?可能是重复的