scrapy蜘蛛中可以使用多個線程嗎?例如,假設我已經構建了一個抓取博客主題並保存所有消息的蜘蛛。我想將每個主題都連接到池中的一個線程,並且該線程將抓取所有需要的信息。每個線程會爬的不同話題的方式..在scrapy spider中使用線程
3
A
回答
6
Scrapy本身是單線程的,並且最終你不能使用蜘蛛內的多個線程。但是,可以利用多個蜘蛛在同一時間(CONCURRENT_REQUESTS
),它可以幫助你(see Common Practices)
,因爲它是建立在Twisted,這是一個異步HTTP框架Scrapy不使用多線程。
6
標記的答案不是100%正確的。
Scrapy在Twisted上運行,它支持從管道process_item
方法返回延遲。
這意味着您可以在管道中創建延期,例如從threads.deferToThread
。這將在反應器線程池內運行你的CPU綁定代碼。在適當的地方注意正確使用callFromThread
。我使用信號量來避免耗盡線程池中的所有線程,但爲下面提到的設置設置好值也可能起作用。
http://twistedmatrix.com/documents/13.2.0/core/howto/threading.html
這裏從我的項目管道的一個方法:
def process_item(self, item, spider):
def handle_error(item):
raise DropItem("error processing %s", item)
d = self.sem.run(threads.deferToThread, self.do_cpu_intense_work, item)
d.addCallback(lambda _: item)
d.addErrback(lambda _: handle_error(item))
return d
您可能要盯緊
REACTOR_THREADPOOL_MAXSIZE
如下所述:http://doc.scrapy.org/en/latest/topics/settings.html#reactor-threadpool-maxsize
CONCURRENT_ITEMS
爲這裏描述http://doc.scrapy.org/en/latest/topics/settings.html#concurrent-items
雖然你仍然面臨Python GIL,這意味着CPU密集型任務不會真正在多CPU上並行運行,他們只會假裝這麼做。 GIL僅針對IO發佈。但是,您可以使用此方法在項目管道中使用IO阻塞第三方庫(例如webservice調用),而不會阻塞反應器線程。
相關問題
- 1. Scrapy Spider Crawl 0頁
- 2. 如何通過Django應用程序調用Scrapy Spider
- 3. Scrapy從管道傳遞對象到Spider
- 4. Scrapy Spider不返回任何信息
- 5. 使用Spider for mysql
- 6. 在Scrapy中設置線程池大小
- 7. scrapy - 在新線
- 8. 使用代理的Scrapy中的多線程
- 9. Scrapy Spider一次又一次地返回相同的元素
- 10. Python收益阻止Scrapy Web Spider Crawler的輸出/執行
- 11. 在Scrapy中使用子nth
- 12. 在scrapy中使用loginform
- 13. 在Scrapy中使用XPath
- 14. 如何使用SQLAlchemy和pyodbc將Scrapinghub上部署的Scrapy spider連接到遠程SQL服務器?
- 15. 使用Scrapy抓取命令使用基本的Spider類 - 可以多次解析()輸出?
- 16. TDD Spider Solitaire
- 17. Scrapy monster.com使用scrapy框架
- 18. 在線程中使用TWordApplication
- 19. 在類中使用線程
- 20. 在C++中使用線程
- 21. Scrapy解析管線
- 22. 在應用程序中使用scrapy爬行網站
- 23. Scrapy - 在一個scrapy腳本中颳去不同的網頁
- 24. IPMI webside的python spider
- 25. 來自Scrapy Spider的自定義JSON響應通過Scrapyd部署的
- 26. 我如何從一個頁面提取多個項目機智Portia/Scrapy Spider
- 27. Scrapy Spider返回最後一個元素時,給出一個選擇器列表
- 28. 使用scrapy
- 29. 使用scrapy
- 30. 在迭代過程中使用線程
如果我在spider代碼中創建一個python線程池,爲什麼它不能支持這些線程? – Eran
@Eran因爲蜘蛛代碼的底層框架是異步的, – miradulo