大叔的學生正在自學Python。自學程式語言總會有卡關的時候,所以當他遇到不懂的地方就會跑來問我。雖然大叔的Python功力也沒多厲害,但初學者的問題基本上還是能應付的。
他目前的進度已經學到使用「BeautifulSoup」這支爬蟲模組(★註一)去網站抓取資料回來分析。但當他練習爬某個網站的時候,卻被伺服器擋下來,於是問我有沒有辦法可以避開。
之所以會被阻擋,是因為有些網站並不喜歡太多爬蟲程式來抓取資料而造成流量增加,或是不爽自己網站的內容被人輕鬆地就拿去用,於是在伺服器裡設定一些爬蟲程式的阻擋機制。
我教他將爬蟲程式偽裝成一般的瀏覽器,看能不能騙過伺服器。偽裝成瀏覽器的方法有很多種,其中最簡單的一招就是送出假的User Agents(★註二),讓伺服器誤判為一般的瀏覽器。
這招簡單歸簡單,卻已經能騙過大部分的伺服器,但若是遇到更厲害的阻擋機制可能也會沒用,只能另尋其他更高竿的方法了;不過這已經超出我學生目前的程度,以後有機會再說。
1. 我們先來看一下我學生寫的原始Python爬蟲程式,如下圖所見,執行之後就被伺服器阻擋並告知勿用非真人造訪的方式查詢網站。
2. 開啟瀏覽器(Chrome和新版Edge都可以)然後按一下鍵盤上的「F12」,這時Chrome右邊會出現「開發者工具」;隨便連到一個網站;將「開發者工具」切換至「Network」標籤後按一下「All」,接著於「Name」下方隨便點選一個檔案,再將右邊「Headers」拉到最下方,把「User-Agents」開頭的那行複製下來。
3. 現在返回爬蟲程式裡(放在import與主程式碼之間)新增一行程式碼「headers = {‘User-Agent’:’複製的程式碼貼在這裡’}」,然後將剛剛複製的User Agents貼到值的位置,也就是冒號後面的單引號裡。(如果你是直接複製這行程式碼,一定要將所有引號從全形改回半形,否則會執行錯誤。)
4. 接著,再於「requests.get(‘網址’)」後面加上「,headers=headers」
5. 再重新執行一次Python爬蟲程式,果然成功騙過阻擋機制、順利抓取到網頁原始碼,可以進行分析囉。
★註一:網路爬蟲(web crawler),泛指可以對特定網站進行頁面索引或資料抓取的程式。而Python的模組(Module)請參考這篇文章:「Windows 10建置Python執行環境與安裝模組教學」。
★註二:當瀏覽器對網站提出request的時候,會傳遞header告訴伺服器關於自己的信息,其中包含User Agents,也就是瀏覽器的識別碼。