爬蟲(chóng)和反爬蟲(chóng)
有的時(shí)候,當(dāng)我們的爬蟲(chóng)程序完成了,并且在本地測(cè)試也沒(méi)有問(wèn)題,爬取了一段時(shí)間之后突然就發(fā)現(xiàn)報(bào)錯(cuò)無(wú)法抓取頁(yè)面內(nèi)容了。這個(gè)時(shí)候,我們很有可能是遇到了網(wǎng)站的反爬蟲(chóng)攔截。
我們知道,網(wǎng)站一方面想要爬蟲(chóng)爬取網(wǎng)站,比如讓搜索引擎爬蟲(chóng)去爬取網(wǎng)站的內(nèi)容,來(lái)增加網(wǎng)站的搜索排名。另一方面,由于網(wǎng)站的服務(wù)器資源有限,過(guò)多的非真實(shí)的用戶(hù)對(duì)網(wǎng)站的大量訪問(wèn),會(huì)增加運(yùn)營(yíng)成本和服務(wù)器負(fù)擔(dān)。
因此,有些網(wǎng)站會(huì)設(shè)置一些反爬蟲(chóng)的措施。我們只有認(rèn)識(shí)了主要的反爬蟲(chóng)措施,才能識(shí)別反爬蟲(chóng)措施,從而進(jìn)行反反爬蟲(chóng)。當(dāng)然,從道德和法律的角度來(lái)講,開(kāi)發(fā)者應(yīng)該把爬蟲(chóng)控制在合理合法的用途上,切勿非法地使用爬蟲(chóng)。如果,需要將爬取的內(nèi)容用作商業(yè)用途的時(shí)候,需要額外關(guān)注相應(yīng)網(wǎng)站對(duì)數(shù)據(jù)的聲明。
1. 反爬蟲(chóng)常見(jiàn)方式:
- 請(qǐng)求頭識(shí)別
這是一種最基本的反爬蟲(chóng)方式,網(wǎng)站運(yùn)營(yíng)者通過(guò)驗(yàn)證爬蟲(chóng)的請(qǐng)求頭的 User-agent,accep-enconding 等信息來(lái)驗(yàn)證請(qǐng)求的發(fā)出宿主是不是真實(shí)的用戶(hù)常用瀏覽器或者一些特定的請(qǐng)求頭信息。
- 動(dòng)態(tài)加載
通過(guò) Ajax,或 者javascript 來(lái)動(dòng)態(tài)獲取和加載數(shù)據(jù),加大爬蟲(chóng)直接獲取數(shù)據(jù)的難度。
- 驗(yàn)證碼
這個(gè)相信大多數(shù)讀者非常熟悉了吧,當(dāng)我們輸錯(cuò)多次密碼的時(shí)候,很多平臺(tái)都會(huì)彈出各種二維碼讓我們識(shí)別,或者搶火車(chē)票的時(shí)候,會(huì)出現(xiàn)各種復(fù)雜的驗(yàn)證碼,驗(yàn)證碼是反爬蟲(chóng)措施中,運(yùn)用最廣,同時(shí)也是最有效直接的方式來(lái)阻止爬蟲(chóng)的措施之一。
- 限制IP
在識(shí)別到某些異常的訪問(wèn)的時(shí)候,網(wǎng)站運(yùn)營(yíng)者會(huì)設(shè)置一個(gè)黑名單,把一些判定為爬蟲(chóng)的IP進(jìn)行限制或者封殺。
- 賬號(hào)限制
有些網(wǎng)站,沒(méi)有游客模式,只有通過(guò)注冊(cè)后才可以登錄看到內(nèi)容,這個(gè)就是典型的使用賬號(hào)限制網(wǎng)站,一般可以用在網(wǎng)站用戶(hù)量不多,數(shù)據(jù)安全要求嚴(yán)格的網(wǎng)站中。
2. 反反爬蟲(chóng)策略:
- 更改 UserAgent
我們可以在請(qǐng)求頭中替換我們的請(qǐng)求媒介,讓網(wǎng)站誤認(rèn)為是我們是通過(guò)移動(dòng)端的訪問(wèn),運(yùn)行下面的代碼后,當(dāng)我們打開(kāi) hupu.html,我們會(huì)發(fā)現(xiàn)返回的是移動(dòng)端的虎撲的頁(yè)面而不是網(wǎng)頁(yè)端的。
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'))
- 減少爬取頻率,設(shè)置間隔時(shí)間
比如,我們可以設(shè)置一個(gè)隨機(jī)的間隔時(shí)間,來(lái)模擬用戶(hù)的行為,減少訪問(wèn)的次數(shù)和頻率。
我們可以在我們爬蟲(chóng)的程序中,加入如下的代碼,讓爬蟲(chóng)休息3秒左右,再進(jìn)行爬取,可以有效地避開(kāi)網(wǎng)站的對(duì)爬蟲(chóng)的檢測(cè)和識(shí)別。
import time
import random
sleep_time = random.randint(0.,2) + random.random()
time.sleep(sleep_time)
- 運(yùn)用代理機(jī)制
代理就是通過(guò)訪問(wèn)第三方的機(jī)器,然后通過(guò)第三方機(jī)器的 IP 進(jìn)行訪問(wèn),來(lái)隱藏自己的真實(shí)IP地址。
import requests
link = "http://www.baidu.com/"
proxies = {'http':'XXXXXXXXXXX'} //代理地址,可以自己上網(wǎng)查找,這里就不做推薦了
response = requests.get(link, proxies=proxies)
由于第三方代理良莠不齊,而且不穩(wěn)定,經(jīng)常出現(xiàn)斷線的情況,爬取速度也會(huì)慢許多,如果對(duì)爬蟲(chóng)質(zhì)量有嚴(yán)格要求的話,不建議使用此種方法進(jìn)行爬取。
- 變換IP進(jìn)行爬取
可以通過(guò)動(dòng)態(tài)的 IP 撥號(hào)服務(wù)器來(lái)變換 IP,也可以通過(guò) Tor 代理服務(wù)器來(lái)變換 IP。
小結(jié)
反反爬蟲(chóng)的策略,一直是在變換的,我們應(yīng)該具體問(wèn)題具體分析,通過(guò)不斷的試錯(cuò)來(lái)完善我們的爬蟲(chóng)爬取,千萬(wàn)不要以為,爬蟲(chóng)程序在本機(jī)調(diào)試之后,沒(méi)有問(wèn)題,就可以高枕無(wú)憂了。線上的問(wèn)題,總是千變?nèi)f化,我們需要根據(jù)我們的具體反爬措施,來(lái)針對(duì)的寫(xiě)一些反反爬蟲(chóng)的代碼,這樣才能保證線上環(huán)境的萬(wàn)無(wú)一失。