爬蟲和反爬蟲
有的時候,當我們的爬蟲程序完成了,并且在本地測試也沒有問題,爬取了一段時間之后突然就發現報錯無法抓取頁面內容了。這個時候,我們很有可能是遇到了網站的反爬蟲攔截。
我們知道,網站一方面想要爬蟲爬取網站,比如讓搜索引擎爬蟲去爬取網站的內容,來增加網站的搜索排名。另一方面,由于網站的服務器資源有限,過多的非真實的用戶對網站的大量訪問,會增加運營成本和服務器負擔。
因此,有些網站會設置一些反爬蟲的措施。我們只有認識了主要的反爬蟲措施,才能識別反爬蟲措施,從而進行反反爬蟲。當然,從道德和法律的角度來講,開發者應該把爬蟲控制在合理合法的用途上,切勿非法地使用爬蟲。如果,需要將爬取的內容用作商業用途的時候,需要額外關注相應網站對數據的聲明。
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。
小結
反反爬蟲的策略,一直是在變換的,我們應該具體問題具體分析,通過不斷的試錯來完善我們的爬蟲爬取,千萬不要以為,爬蟲程序在本機調試之后,沒有問題,就可以高枕無憂了。線上的問題,總是千變萬化,我們需要根據我們的具體反爬措施,來針對的寫一些反反爬蟲的代碼,這樣才能保證線上環境的萬無一失。