案例: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?