1. 程式人生 > Python爬蟲入門教學 >15 爬蟲與反爬蟲

15 爬蟲與反爬蟲

有的時候,當我們的爬蟲程式完成了,並且在本地測試也沒有問題,爬取了一段時間之後突然就發現報錯無法抓取頁面內容了。這個時候,我們很有可能是遇到了網站的反爬蟲攔截。

我們知道,網站一方面想要爬蟲爬取網站,比如讓搜尋引擎爬蟲去爬取網站的內容,來增加網站的搜尋排名。另一方面,由於網站的伺服器資源有限,過多的非真實的使用者對網站的大量訪問,會增加運營成本和伺服器負擔。

因此,有些網站會設定一些反爬蟲的措施。我們只有認識了主要的反爬蟲措施,才能識別反爬蟲措施,從而進行反反爬蟲。當然,從道德和法律的角度來講,開發者應該把爬蟲控制在合理合法的用途上,切勿非法地使用爬蟲。如果,需要將爬取的內容用作商業用途的時候,需要額外關注相應網站對資料的宣告。

1. 反爬蟲常見方式:

  • 請求頭識別

這是一種最基本的反爬蟲方式,網站運營者通過驗證爬蟲的請求頭的 User-agent,accep-enconding 等資訊來驗證請求的發出宿主是不是真實的使用者常用瀏覽器或者一些特定的請求頭資訊。

  • 動態載入

通過 Ajax,或 者javascript 來動態獲取和載入資料,加大爬蟲直接獲取資料的難度。

  • 驗證碼

這個相信大多數讀者非常熟悉了吧,當我們輸錯多次密碼的時候,很多平臺都會彈出各種二維碼讓我們識別,或者搶火車票的時候,會出現各種複雜的驗證碼,驗證碼是反爬蟲措施中,運用最廣,同時也是最有效直接的方式來阻止爬蟲的措施之一。

  • 限制IP

在識別到某些異常的訪問的時候,網站運營者會設定一個黑名單,把一些判定為爬蟲的IP進行限制或者封殺。

  • 賬號限制

有些網站,沒有遊客模式,只有通過註冊後才可以登入看到內容,這個就是典型的使用賬號限制網站,一般可以用在網站使用者量不多,資料安全要求嚴格的網站中。

2. 反反爬蟲策略:

  • 更改 UserAgent

我們可以在請求頭中替換我們的請求媒介,讓網站誤認為是我們是通過移動端的訪問,執行下面的程式碼後,當我們開啟 hupu.html,我們會發現返回的是移動端的虎撲的頁面而不是網頁端的。

import requests
from bs4 import BeautifulSoup

header_data = {
'User-Agent': 'Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; SCH-I535 Build/KOT49H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30'
} re = requests.get('https://www.hupu.com/', headers=header_data) bs = BeautifulSoup(re.content) with open('hupu.html', 'wb') as f: f.write(bs.prettify(encoding='utf8'))
  • 減少爬取頻率,設定間隔時間

比如,我們可以設定一個隨機的間隔時間,來模擬使用者的行為,減少訪問的次數和頻率。
我們可以在我們爬蟲的程式中,加入如下的程式碼,讓爬蟲休息3秒左右,再進行爬取,可以有效地避開網站的對爬蟲的檢測和識別。

import time
import random

sleep_time = random.randint(0.,2) + random.random()
time.sleep(sleep_time)
  • 運用代理機制

代理就是通過訪問第三方的機器,然後通過第三方機器的 IP 進行訪問,來隱藏自己的真實IP地址。

import requests

link = "http://www.baidu.com/"
proxies = {'http':'XXXXXXXXXXX'} //代理地址,可以自己上網查詢,這裡就不做推薦了
response = requests.get(link, proxies=proxies)

由於第三方代理良莠不齊,而且不穩定,經常出現斷線的情況,爬取速度也會慢許多,如果對爬蟲質量有嚴格要求的話,不建議使用此種方法進行爬取。

  • 變換IP進行爬取

可以通過動態的 IP 撥號伺服器來變換 IP,也可以通過 Tor 代理伺服器來變換 IP。

小結

反反爬蟲的策略,一直是在變換的,我們應該具體問題具體分析,通過不斷的試錯來完善我們的爬蟲爬取,千萬不要以為,爬蟲程式在本機除錯之後,沒有問題,就可以高枕無憂了。線上的問題,總是千變萬化,我們需要根據我們的具體反爬措施,來針對的寫一些反反爬蟲的程式碼,這樣才能保證線上環境的萬無一失。