# Run the spider with the internal API of Scrapy:
from scrapy.crawler import Crawler, CrawlerProcess
from scrapy.utils.project import get_project_settings
def crawler_func(spider, url):
crawler_process = CrawlerProcess(settings)
crawler_process.crawl(spider, url)
crawler_process.start()
def start_spider(spider, urls):
p = multiprocessing.Pool(100)
return p.map(partial(crawler_func, spider), urls)
4条答案
按热度按时间kyxcudwk1#
Scrapy是单线程的,除了交互式环境和一些测试,参见source。
它构建在Twisted之上,Twisted也是单线程的,并利用它自己的异步并发功能,如
twisted.internet.interfaces.IReactorThreads.callFromThread
,请参见source。xqnpmsa82#
Scrapy的大部分工作都是同步完成的,但是,请求的处理是异步完成的。
如果你还没有看过这个页面,我建议你看一下。
http://doc.scrapy.org/en/latest/topics/architecture.html
编辑:我现在意识到问题是关于线程的,而不一定是异步的。尽管如此,这个链接仍然是一个很好的读物:)
关于您的CONCURRENT_REQUESTS问题。此设定会变更Twisted一次延迟的要求数目。一旦启动了如此多的要求,它会等待其中一些要求完成,然后再启动更多的要求。
z3yyvxxp3#
Scrapy是单线程框架,我们不能在一个spider中同时使用多个线程。但是,我们可以同时创建多个spider和管道,使进程并发。Scrapy不支持
multi-threading
,因为它构建在Twisted
之上,而Twisted
是Asynchronous http protocol framework
。qyyhg6bp4#
Scrapy是一个单线程框架,但我们可以在一个蜘蛛中同时使用多个线程。
请阅读本文。
使用爬行器进程类,自定义设置蜘蛛程序
我们可以使用子进程来运行spider。
或
使用CrawlerProcess在同一进程中运行多个蜘蛛。
如果您希望每个进程运行多个spider,或者希望直接在程序中获取和使用Scrapy项目,则需要使用Scrapy的内部API。