案例:pchome24h 爬蟲 - 搜索功能 多線程爬蟲

本文請先參考 前一則

案例:pchome24h 爬蟲 - 搜索功能 多頁搜索

為什麼要用多線程呢?

假設我們的工作量一共有100頁,每爬行一頁就需要1秒鐘

那麼如果你要爬完 理論時間是 100秒(約二分鐘),聽起還可以接受

那麼5000頁呢?那就是5000秒(83分鐘),在大量的頁面爬行中,只有一個線程,

可以理解成一個循環幹到底,是不切實際的…

所以這時候多線程的功效就出來了,從一個機器人員工變為100個機器人員工

5000頁的工作 花費的時間理論值會變為 5000/100/60 = 50/60 約1分鐘內搞定

那會不會很花資源呢?

完全不會,以我自己在做測試的小型文書機電腦(八年前汰舊下來的),在跑爬蟲的時候,可以用到5000個線程全速前進!

詳細的資源計算,就不在此詳述,總之很夠用!

相關資訊:什麼是多線程

本篇

在上一篇 多頁搜索的程式碼最後是長這樣

那麼我們要編輯的位置27行開始 ,將工作的方式從一個迴圈做到底 改為多個線程做到底。

1. 引用 隊列(佇列、線程池、進程池)

在Python 中 有一個公有的引用模組,叫queue(注意一定要全小寫)這個模組

專門做為任務分發用的模組,用比較好記的方式來描述功能就是

queue像是排隊看電影進場前的服務人員,負責發放3D眼鏡,驗票,放人進去用的。

這個功能其實也可以自己做,不過既然queue已經做好了就直接就用吧!

常用的queue功能

2. 初始化線程(執行緒) Thread

Python 提供了公用的模組 叫 threading 可以進行線程的開啟引用

新手要注意的幾點如下

  • 線程的引用是從 threading裡面的Thread來使用,不是直接用 threading

  • 線程啟用後,要記得啟動它start()如

  • 每個線程 都記得要告訴它 是負責運作什麼函式,也就是說 target這個參數記得要填,新手很容易沒想清楚,以為是一種魔法般的功能沒給它函式就使用

最終程式碼

預期的輸出

會看到爬取35頁的速度非常之快,不過在27頁開始,就出現被擋ip的訊息

多線程爬行的方案,到這裡就算告一段落

下回再來解說,如果解決擋ip的問題

Last updated

Was this helpful?