2010-05-13 80 views
10

正在尋找在Python中編寫一個小網頁爬蟲。我開始調查將其編寫爲多線程腳本,一個線程池下載和一個池處理結果。由於GIL它實際上會同時下載嗎? GIL如何影響網絡爬蟲?每個線程都會從套接字中選擇一些數據,然後移動到下一個線程,讓它從套接字中選擇一些數據等。Python中的多線程爬蟲真的可以加快速度嗎?

基本上我問的是在python中做一個多線程的爬蟲真的會給我買很多的性能vs單線程?

謝謝!

回答

1

當涉及到抓取時,您最好使用基於事件的事件,如Twisted,它使用非阻塞異步套接字操作來獲取並返回數據,而不是每個數據都阻塞。

異步網絡操作很容易,通常是單線程的。網絡I/O幾乎總是比CPU有更高的延遲,因爲你真的不知道頁面要返回多長時間,而這正是異步發光的地方,因爲異步操作比線程輕得多。

編輯:這是一個simple example如何使用Twisted的getPage創建一個簡單的網絡爬蟲。

+0

請勿使用Twisted。使用gevent。它在封面下使用async io,但允許您以簡單明瞭的多線程方式進行編碼。 – 2012-05-02 11:35:33

8

在執行網絡操作時,Python解釋器不支持GIL。如果您正在進行網絡綁定的工作(如抓取工具),則可以放心地忽略GIL的影響。

另一方面,如果您創建大量正在執行處理的線程(下載後),則可能需要測量性能。限制線程數量會減少GIL對性能的影響。

6

看看scrapy是如何工作的。它可以幫助你很多。它不使用線程,但可以在同一個線程中進行多個「同時」下載。

如果你考慮一下,你只有一張網卡,所以按照定義,並行處理無法幫到你。

什麼scrapy做的是只是不等待左右一個請求的迴應,然後再發送另一個請求。全部在一個單獨的線程中。

1

另一個考慮因素:如果你正在拼湊一個網站,並且服務器限制了你可以從你的IP地址發送的請求的頻率,那麼添加多個線程可能沒有什麼區別。

0

是的,多線程抓取可顯着提高處理速度。 GIL不是一個問題。您正在失去大量空閒的CPU和未使用的帶寬,等待請求完成。如果您正在抓取的網頁位於您的本地網絡中(一種罕見的刮擦情況),那麼多線程與單線程抓取之間的差異可能會更小。

你可以嘗試自己玩一個「n」線程的基準。我在Discovering Web Resources上寫了一個簡單的多線程爬蟲,並且我寫了一篇關於Automated Discovery of Blog Feeds and Twitter, Facebook, LinkedIn Accounts Connected to Business Website的相關文章。您可以選擇在FocusedWebCrawler中更改NWORKERS類變量的線程數。