繁体   English   中英

Scrapy 是单线程还是多线程?

[英]Is Scrapy single-threaded or multi-threaded?

Scrapy 中的并发设置很少,例如CONCURRENT_REQUESTS 这是否意味着,Scrapy 爬虫是多线程的? 因此,如果我运行scrapy crawl my_crawler它实际上会并行触发多个同时请求? 我问是因为,我读过 Scrapy 是单线程的。

Scrapy 是单线程的,除了交互式 shell 和一些测试,请参阅 源代码

它建立在Twisted之上,它也是单线程的,并利用了它自己的异步并发功能,例如twisted.internet.interfaces.IReactorThreads.callFromThread ,请参阅源代码

Scrapy 同步完成大部分工作。 但是,请求的处理是异步完成的。

如果您还没有看过,我建议您使用此页面。

http://doc.scrapy.org/en/latest/topics/architecture.html

编辑:我现在意识到问题是关于线程的,不一定是异步的。 该链接仍然是一个很好的阅读:)

关于您关于 CONCURRENT_REQUESTS 的问题。 这个设置改变了twisted一次延迟的请求数。 一旦启动了这么多请求,它将等待其中一些请求完成,然后再开始更多请求。

Scrapy 是单线程框架,我们不能在一个蜘蛛中同时使用多个线程。 但是,我们可以同时创建多个蜘蛛和管道以使进程并发。 Scrapy 不支持multi-threading ,因为它建立在Twisted之上,这是一个Asynchronous http protocol framework

Scrapy 是一个单线程框架,但是我们可以在一个蜘蛛中同时使用多个线程

请阅读这篇文章。

https://levelup.gitconnected.com/how-to-run-scrapy-spiders-in-your-program-7db56792c1f7#:~:text=We%20use%20the%20CrawlerProcess%20class,custom%20settings%20for%20the %20蜘蛛

我们可以使用子进程来运行蜘蛛。

import subprocess
subprocess.run(["scrapy", "crawl", "quotes", "-o", "quotes_all.json"])

或者

使用CrawlerProcess在同一进程中运行多个蜘蛛。

如果您想在每个进程中运行多个爬虫,或者想直接在程序中获取和使用抓取的项目,则需要使用 Scrapy 的内部 API。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM