所以,越來越多的網站開始偵測網頁爬蟲,將其封鎖,這時候,在開發Python網頁爬蟲時,該如何降低被偵測到的風險呢?
本文提供了以下7個方法給讀者進行參考:- 輪流切換IP位址
- 設定請求表頭(Request Headers)
- 設定使用者代理(User-Agent)
- 設定參照位址(Referer)
- 設定隨機的延遲時間
- 使用無頭瀏覽器(Headless Browser)
- 避免掉入網頁蜜罐陷阱(Honeypot Traps)
PS.提醒大家,在爬取的過程中,要尊重對方的網站及其它的使用者,避免過量的請求(Request)而破壞網站的使用體驗。
一、輪流切換IP位址
如果固定的使用同一組IP位址,在固定的時間內大量的請求(Request)網站,毫無疑問有很大的機率會被認為是網頁爬蟲,進而被封鎖請求(Request)。
因此,要利用Python網頁爬蟲爬取網站時,會建議需要擁有多組的IP位址,在每一次的請求(Request)時,輪流切換使用,來降低被偵測到的機會,可以參考使用Proxy切換服務,像是Scrapingdog等,或是IP切換服務,像是ScraperAPI等,讓Python網頁爬蟲進行請求(Request)時,能夠使用不同的IP位址。
二、設定請求表頭(Request Headers)
請求表頭(Request Headers)就是在瀏覽器發送任何一個請求(Request)時,告訴目標網頁相關的瀏覽器資訊,可以在Chrome瀏覽器開發者模式的Network頁籤下看到,如下圖:
為了讓Python網頁爬蟲在發送請求(Request)時,能夠像真實的瀏覽器一樣,最好要設定請求表頭(Request Headers)資訊,如果沒有設定,很明顯就會被認為是Python網頁爬蟲而被封鎖。
除了能夠在Chrome瀏覽器開發者模式得知自己的請求表頭(Request Headers)外,也可以利用此網站來查看,在Python網頁爬蟲的專案中,只要複製其中的headers欄位來使用即可,如下範例:
import requests headers = { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", "Accept-Encoding": "gzip, deflate, br", "Accept-Language": "zh-TW,zh;q=0.9", "Host": "example.com", #目標網站 "Sec-Fetch-Dest": "document", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-Site": "none", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36" #使用者代理 } response = requests.get(url="https://example.com", headers=headers)
三、設定使用者代理(User-Agent)
雖然設定了請求表頭(Request Headers),但是在固定時間內,有大量相同的請求表頭(Request Headers)瀏覽器進行請求(Request),也很容易被認為是Python網頁爬蟲。
在剛剛的請求表頭(Request Headers)中,有一個欄位叫做使用者代理(User-Agent),用來告訴網站您是使用什麼瀏覽器來進行請求(Request)的,為了避免被偵測到是網頁爬蟲,這時候就可以隨機的替換使用者代理(User-Agent)。
舉例來說,在Python網頁爬蟲的專案中,可以使用fake_useragent套件,在每一次的請求(Request)前,隨機產生一個使用者代理(User-Agent),並且加入到請求表頭(Request Headers)中,如下範例:
import requests from fake_useragent import UserAgent user_agent = UserAgent() response = requests.get(url="https://example.com", headers={ 'user-agent': user_agent.random })
這樣就能夠避免Python網頁爬蟲的每一次請求(Request)皆使用相同的使用者代理(User-Agent),而被偵測到。
四、設定參照位址(Referer)
請求表頭(Request Headers)中另一個重要的欄位就是參照位址(Referer),用來告訴網站這個請求(Request)是來自於哪一個網站,如下範例:
import requests headers = { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", "Accept-Encoding": "gzip, deflate, br", "Accept-Language": "zh-TW,zh;q=0.9", "Host": "example.com", #目標網站 "Sec-Fetch-Dest": "document", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-Site": "none", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36", #使用者代理 "Referer": "https://www.google.com/" #參照位址 } response = requests.get(url="https://example.com", headers=headers)
以上範例的第14行加入Referer欄位後,表示在第17行發送請求時,告訴example.com網站這個請求來源為Google網站。但是,如果在每一次的請求(Request)都使用相同的參照位址(Referer),在大型的網站中,同樣可能會被攔下來。
所以,這邊可以使用像SEMRush的工具,來顯示目標網頁的反向連結,也就是能夠到達目標網頁的其它連結,就可以在Python網頁爬蟲的每一次請求(Request)前,將不同的反向連結設定到參照位址(Referrer)中,讓每一次的來源網站都不相同,降低被網頁偵測到的風險。以下使用SEMRush工具來查看Facebook網站的反向連結,如下圖:
五、設定隨機的延遲時間
網頁爬蟲最明顯的特性就是每一次的請求(Request)間隔時間都相同,或是具有固定的模式,這是一般人類很難達到的任務,當符合這樣的條件,就很容易被偵測到。
所以,在每一次請求(Request)之間,最好設定隨機的延遲時間(Delay),這樣除了防止每一次的請求(Request)間隔時間不同之外,也沒有固定的請求模式,可以參考以下的範例:
import random import time delay_choices = [8, 5, 10, 6, 20, 11] #延遲的秒數 delay = random.choice(delay_choices) #隨機選取秒數 time.sleep(delay) #延遲
六、使用無頭瀏覽器(Headless Browser)
有些網頁為了偵測網頁爬蟲,會檢查請求(Request)的瀏覽器Cookie及JavaScript的執行細節等,所以,就可以使用無頭瀏覽器(Headless Browser)來執行網頁爬蟲。
無頭瀏覽器(Headless Browser)和一般瀏覽器不一樣的地方是,它沒有圖形化的使用者介面,通常會使用指令的方式來執行,知名的Selenium套件就可以讓開發人員利用程式碼,自動化控制瀏覽器的執行,模擬人類的操作,降低被偵測到的風險,使用的方式可以參考[Python爬蟲教學]整合Python Selenium及BeautifulSoup實現動態網頁爬蟲文章。
七、避免掉入網頁蜜罐陷阱(Honeypot Traps)
網頁蜜罐陷阱(Honeypot Traps)就是許多網頁會在HTML原始碼中埋入只有網頁爬蟲會讀取到的隱藏連結或屬性,如果在開發Python網頁爬蟲沒有注意或避開時,很容易就會被偵測到而被封鎖,舉例來說,有個隱藏的連結帶有「display:none」或「visibility: hidden」的CSS屬性等,這是正常的使用者看不到,而網頁爬蟲所能讀取到的。
要避免掉入網頁蜜罐陷阱(Honeypot Traps),除了要注意網頁的HTML原始碼之外,另一個方法就是在開發Python網頁爬蟲時,可以參考該網頁的網站地圖(Sitemap),其中會列出公開給使用者存取的網頁網址,在開發的過程中,就盡量挑選裡面的公開網址來進行爬取。
八、小結
本文所分享的7個實用技巧,希望對於您在開發Python網頁爬蟲時,能夠降低被封鎖的風險,不過也再次提醒,要有禮貌的進行資料的爬取,避免大量的請求(Request),而造成網站的困擾。如果您還有其它的實用技巧,歡迎在底下留言和我分享唷 :)
留言
張貼留言