我正在涉足一些網路抓取工具(總共 5 個)。所有這些網路爬蟲訪問不同的站點,其中一些使用硒,而另一些則不需要硒。有些需要 30 秒才能運行,而有些可能需要 45 分鐘。
我想做的是盡量減少運行這些刮板所需的時間。多執行緒會是解決這個問題的方法嗎?我一直在閱讀有關該主題的內容,似乎我可以創建一個執行緒池并將每個刮板傳遞到該池進行處理。
或者多處理是在最快的時間內運行所有這些爬蟲的更好方法嗎?
uj5u.com熱心網友回復:
我敢打賭,多處理是一種方式,因為多執行緒您將在所有這些行程之間共享記憶體和處理能力,而多處理您將在不同的內核之間分配負載,使其在處理大量資料時速度更快。
看看這個視頻,它提供了很多資訊和說明,這有助于理解很多: https ://www.youtube.com/watch?v=AZnGRKFUU0c
uj5u.com熱心網友回復:
這實際上取決于您的用例。
對于在本地機器上運行的正常用例,多執行緒就足夠了。請注意,大多數時候一次太多的請求不會加快你的抓取速度,因為現在大多數網路都受到 CloudFlare 的保護。將需要 selenium 的網路刮板和由于 selenium 非常慢而沒有多大幫助的網路刮板分開。
對于密集的網路抓取,尤其是大規模的網路抓取,每個抓取器應該在一個微型容器(例如 AWS EC2)上單獨運行,并且您可以控制要運行的特定抓取器的實體數。這樣做還可以讓您控制爬蟲 IP 地址以避免黑名單和請求速率限制。
對于 Python,我建議使用https://scrapy.org/
uj5u.com熱心網友回復:
我可能會為這項任務研究 asyncio,因為大部分作業都在等待站點回應,另外我建議研究一下用于處理網頁的漂亮湯,并使用 requests 模塊獲取網站本身。
它可以使你的代碼快得離譜。
如果您以更復雜的方式使用資料,我不建議使用多處理,因為記憶體不會在 python 中的不同解釋器之間共享,而且理論上全域變數也不是,您必須將資料寫入檔案或資料庫才能制作它可用,另一種方法是使用多處理佇列。它本質上是一項 I/O 繁重的任務,而不是計算量大的任務,多處理是絕對不行的。
多處理需要使用不同的 python 解釋器啟動一個全新的行程和不同的記憶體分配。這需要更長的時間,并且對于這個用例沒有任何意義。再加上在你的 CPU 開始發瘋之前你可以啟動多少個行程?
觀看此內容,了解更快的網路抓取方式:https: //www.youtube.com/watch? v= nFn4_nA_yk8
使用它來獲取所有資料并將其存盤在串列或元組中,然后使用多處理池來處理資料,應該比一起做要快一點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/467458.html
上一篇:為什么佇列不在主執行緒上更新?
