
爬蟲、反爬蟲和反反爬蟲是網(wǎng)絡(luò)爬蟲工作過程中一直伴隨的問題。
在現(xiàn)實生活中,網(wǎng)絡(luò)爬蟲的程序并不像之前介紹的爬取博客那么簡單,運行效果不如意者十有八九。首先需要理解一下“反爬蟲”這個概念,其實就是“反對爬蟲”。根據(jù)網(wǎng)絡(luò)上的定義,網(wǎng)絡(luò)爬蟲為使用任何技術(shù)手段批量獲取網(wǎng)站信息的一種方式?!胺磁老x”就是使用任何技術(shù)手段阻止批量獲取網(wǎng)站信息的一種方式。
01、為什么會被反爬蟲
對于一個經(jīng)常使用爬蟲程序獲取網(wǎng)頁數(shù)據(jù)的人來說,遇到網(wǎng)站的“反爬蟲”是司空見慣的。
那么,網(wǎng)站為什么要“反爬蟲”呢?
第一,網(wǎng)絡(luò)爬蟲浪費網(wǎng)站的流量,也就是浪費錢。爬蟲對于一個網(wǎng)站來說并不算是真正用戶的流量,而且往往能夠不知疲倦地爬取網(wǎng)站,更有甚者,使用分布式的多臺機器爬蟲,造成網(wǎng)站瀏覽量增高,浪費網(wǎng)站流量。
第二,數(shù)據(jù)是每家公司非常寶貴的資源。在大數(shù)據(jù)時代,數(shù)據(jù)的價值越來越突出,很多公司都把它作為自己的戰(zhàn)略資源。由于數(shù)據(jù)都是公開在互聯(lián)網(wǎng)上的,如果競爭對手能夠輕易獲取數(shù)據(jù),并使用這些數(shù)據(jù)采取針對性的策略,長此以往,就會導(dǎo)致公司競爭力的下降。因此,有實力的大公司便開始利用技術(shù)進行反爬蟲。反爬蟲是指使用任何技術(shù)手段阻止別人批量獲取自己網(wǎng)站信息的一種方式。
需要注意的是,大家在獲取數(shù)據(jù)時一定要注意遵守相關(guān)法律、法規(guī)。我們的爬蟲教學(xué)僅用于學(xué)習(xí)、研究用途。
02、反爬蟲的方式
在網(wǎng)站“反爬蟲”的過程中,由于技術(shù)能力的差別,因此不同網(wǎng)站對于網(wǎng)絡(luò)爬蟲的限制也是不一樣的。在實際的爬蟲過程中會遇到各種問題,可以大致將其分成以下 3 類。
(1) 不返回網(wǎng)頁,如不返回內(nèi)容和延遲網(wǎng)頁返回時間。
(2) 返回數(shù)據(jù)非目標網(wǎng)頁,如返回錯誤頁、返回空白頁和爬取多頁時均返回同一頁。
(3) 增加獲取數(shù)據(jù)的難度,如登錄才可查看和登錄時設(shè)置驗證碼。
1、不返回網(wǎng)頁
不返回網(wǎng)頁是比較傳統(tǒng)的反爬蟲手段,也就是在爬蟲發(fā)送請求給相應(yīng)網(wǎng)站地址后,網(wǎng)站返回 404 頁面,表示服務(wù)器無法正常提供信息或服務(wù)器無法回應(yīng);網(wǎng)站也可能長時間不返回數(shù)據(jù),這代表對爬蟲已經(jīng)進行了封殺。
首先,網(wǎng)站會通過 IP 訪問量反爬蟲。因為正常人使用瀏覽器訪問網(wǎng)站的速度是很慢的,不太可能一分鐘訪問 100 個網(wǎng)頁,所以通常網(wǎng)站會對訪問進行統(tǒng)計,如果單個 IP 的訪問量超過了某個閾值,就會進行封殺或要求輸入驗證碼。
其次,網(wǎng)站會通過 session 訪問量反爬蟲。session 的意思“會話控制”, session 對象存儲特定用戶會話所需的屬性和配置信息。這樣,當用戶在應(yīng)用程序的 Web 頁之間跳轉(zhuǎn)時,存儲在 session 對象中的變量將不會丟失,而是在整個用戶會話中一直存在下去。如果一個session 的訪問量過大,就會進行封殺或要求輸入驗證碼。
此外,網(wǎng)站也會通過 User-Agent 反爬蟲。User-Agent 表示瀏覽器在發(fā)送請求時,附帶將當前瀏覽器和當前系統(tǒng)環(huán)境的參數(shù)發(fā)送給服務(wù)器,可以在 Chrome 瀏覽器的審查元素中找到這些參數(shù)。圖 1 為 Windows 系統(tǒng)使用 Firefox 訪問百度首頁的請求頭。

■ 圖 1 百度首頁請求頭
2、返回數(shù)據(jù)非目標網(wǎng)頁
除了不返回網(wǎng)頁外,還有爬蟲返回非目標網(wǎng)頁,也就是網(wǎng)站會返回假數(shù)據(jù),如返回空白頁或爬取多頁的時候返回同一頁。當你的爬蟲順利地運行起來,但不久后,如果你發(fā)現(xiàn)爬取的每一頁的結(jié)果都一樣,那么這就是獲取了假的網(wǎng)站。
3、獲取數(shù)據(jù)變難
網(wǎng)站也會通過增加獲取數(shù)據(jù)的難度反爬蟲,一般要登錄才可以查看數(shù)據(jù),而且會設(shè)置驗證碼。為了限制爬蟲,無論是否是真正的用戶,網(wǎng)站都可能會要求你登錄并輸入驗證碼才能訪問。例如,12306 為了限制自動搶票就采用了嚴格的驗證碼功能,需要用戶在 8 張圖片中選擇正確的選項。
03、怎樣“反反爬蟲”
網(wǎng)站利用“反爬蟲”阻止別人批量獲取自己的網(wǎng)站信息。但是“道高一尺,魔高一丈”,負責寫網(wǎng)站爬蟲程序的人又針對網(wǎng)站的“反爬蟲”進行了“反反爬蟲”,也就是突破網(wǎng)站的“反爬蟲”限制,讓爬蟲程序能夠運行下去。
對于如何讓爬蟲順利運行,其中心思想是讓爬蟲程序看起來更像正常用戶的瀏覽行為。正常用戶是使用一臺計算機的一個瀏覽器瀏覽,而且速度比較慢,不會在短時間瀏覽過多的頁面。對于一個爬蟲程序而言,就需要讓爬蟲運行得像正常用戶一樣。常見的反爬蟲的原理有:
檢查 User-Agent ;檢驗訪問頻率次數(shù),封掉異常 IP ;設(shè)置驗證碼;Ajax 異步加載等。下面介紹相應(yīng)的對策。
1、修改請求頭
為了被反爬蟲,可以修改請求頭,從而實現(xiàn)順序獲取網(wǎng)頁的目的。
如果不修改請求頭,header 就會是 python-requests ,例如:
import requests
r = requests get('http://www.baidu.com')
print(r.request.headers)
運行程序,輸出如下:
["User - Agent": 'python - requests/2.19.1,'Accept - Encoding':'gzip,deflate',
'Accept':'*/*',
Connection': keep - alive"]
最簡單的方法是將請求頭改成真正瀏覽器的格式,例如:
import requests
link = "http://www.baidu.comheaders = ('User - Agent': 'Mozilla/5.0(Windows;U; Windows NT6.1; en - US; rv:1.9.1.6)Gecko/
20230529 Firfox/3.5.6'}
r = requests.get(link,headers = headers)
print(r.request.headers)
運行程序,輸出如下:
('User - Agent': 'Mozilla/5.0(Windows;U; Windows NT6.1;en - US;rv:1.9.1.6)
Gecko/20230529.Firfox/3.5.6',Accept-Encoding': 'gzip,deflate','Accept':'*/*Connection': 'keepalive}
由結(jié)果可以看到,header 已經(jīng)變成使用瀏覽器的 header 。
此外,也可以做一個 User-Agent 的池,并且隨機切換 User-Agent 。但是,在實際爬蟲中,針對某個 User-Agent 的訪問量進行封鎖的網(wǎng)站比較少,所以只將 User-Agent 設(shè)置為正常的瀏覽器 User-Agent 就可以了。
除了 User-Agent ,還需要在 header 中寫上 Host 和 Referer。
2、修改爬蟲訪問周期
爬蟲訪問太密集,一方面對網(wǎng)站的瀏覽極不友好;另一方面十分容易招致網(wǎng)站的反爬蟲。因此,當訪問程序時應(yīng)有適當間隔;爬蟲訪問間隔相同也會被識別,應(yīng)該具有隨機性。
import time
t1=time.time()
time.sleep(3)
t2=time.time()
total_time=t2-t1
print(total_time)
運行程序,輸出如下:
3.0006399154663086
你的結(jié)果可能和這個不一樣,但是應(yīng)該約等于 3 秒。也就是說,可以使用 time.sleep (3 )讓程序休息 3 秒,括號中間的數(shù)字代表秒數(shù)。
如果使用一個固定的數(shù)字作為時間間隔,就可能使爬蟲不太像正常用戶的行為,因為真正的用戶訪問不太可能出現(xiàn)如此精準的秒數(shù)間隔。所以還可以用 Python 的 random 庫進行隨機數(shù)設(shè)置,代碼為:
import time
import random
sleep_time=random.randint(1,5)+random.random()
print(sleep_time)
total=time.sleep(sleep_time)
運行程序,輸出如下:
3.361699347950341
你的結(jié)果可能和這個不一樣,但是應(yīng)該在 0~5 秒。這里 random.randint ( 0 , 5 )的結(jié)果是 0 、1 、 2 、 3 、 4 或 5 ,而 random.random ()是一個 0~1 的隨機數(shù)。這樣獲得的時間非常隨機,更像真正用戶的行為。
3、使用代理
代理(Proxy )是一種網(wǎng)絡(luò)服務(wù),允許一個網(wǎng)絡(luò)終端(客戶端)與另一個網(wǎng)絡(luò)終端(服務(wù)器)間接連接。形象地說,代理就是網(wǎng)絡(luò)信息的中轉(zhuǎn)站。代理服務(wù)器就像一個大的緩沖,這樣能夠顯著提高瀏覽速度和效率。可以維護一個代理的 IP 池,從而讓爬蟲隱藏自己真實的 IP 。雖然有很多代理,但良莠不齊,需要篩選。維護代理 IP 池比較麻煩,而且十分不穩(wěn)定。以下是使用代理 IP 獲取網(wǎng)頁的方法:
import requests
link='http://santostang.com'
proxies={'http':'http://xxx.xxx.xxx.xxx'}
resp=requests.get(link,proxies=proxies)
由于代理 IP 很不穩(wěn)定,這里就不放出代理 IP 的地址了。其實不推薦使用代理 IP 方法,一方面,雖然網(wǎng)絡(luò)上有很多免費的代理 IP ,但是都很不穩(wěn)定,可能一兩分鐘就失效了;另一方面,通過代理 IP 的服務(wù)器請求爬取速度很慢。
03、文末送書

《深入理解計算機系統(tǒng)(原書第3版)》 作者:蘭德爾 E. 布萊恩特 大衛(wèi) R. 奧哈拉倫

《算法導(dǎo)論(原書第3版)》 作者:Thomas H.Cormen, Charles E.Leiserson, Ronald L.Rivest, Clifford Stein

《數(shù)據(jù)庫系統(tǒng)概念(原書第7版)》 作者:亞伯拉罕·西爾伯沙茨 亨利·科思 S. 蘇達爾尚

《計算機網(wǎng)絡(luò):自頂向下方法(原書第7版)》 作者:詹姆斯·F. 庫羅斯、基思·W. 羅斯

《編譯原理(原書第2版)》 作者:Alfred V. Aho, Monica S. Lam 等

《現(xiàn)代操作系統(tǒng)(原書第4版)》 作者:安德魯 S. 塔嫩鮑姆、赫伯特·博斯

《數(shù)據(jù)結(jié)構(gòu)與算法分析:C語言描述(原書第2版)典藏版》 作者:馬克·艾倫·維斯

《TCP/IP詳解》 作者:Kevin R. Fall, W. Richard Stevens, Gary R. Wright

《計算機組成與設(shè)計:硬件/軟件接口(原書第5版)》 作者:戴維·A. 帕特森 約翰·L. 亨尼斯

《C程序設(shè)計語言(第2版·新版)典藏版》 作者:[美]布萊恩· W.克尼漢,丹尼斯· M.里奇

《C++程序設(shè)計語言(原書第4版)》 作者:(美)本賈尼·斯特勞斯特魯普

《設(shè)計模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)(典藏版)》 作者:[美] 埃里克·伽瑪、 理查德·赫爾姆、 拉爾夫·約翰遜、 約翰·威利斯迪斯
了解更多秒殺神書點擊:http://h5.dangdang.com/mix_gys_04001_xs0h文章來源:http://www.zghlxwxcb.cn/news/detail-492924.html
參與方式:文章三連并評論,“按時下班,拒絕內(nèi)卷!”參與抽獎,48小時后,程序自動抽取6位小伙伴獲得技術(shù)圖書一本【以上圖書任選】,歡迎大家積極參與!文章來源地址http://www.zghlxwxcb.cn/news/detail-492924.html
到了這里,關(guān)于Python進階 │反爬蟲和怎樣反反爬蟲的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!