最全的反爬蟲技術

2021-08-20 21:17:16 字數 4755 閱讀 1251

反爬蟲 的技術大概分為四個種類:

注:文末有福利!

傳統反爬蟲手段

1、後台對訪問進行統計,如果單個ip訪問超過閾值,予以封鎖。

這個雖然效果還不錯,但是其實有兩個缺陷,乙個是非常容易誤傷普通使用者,另乙個就是,ip其實不值錢,幾十塊錢甚至有可能買到幾十萬個ip。所以總體來說是比較虧的。不過針對三月份呢爬蟲,這點還是非常有用的。

2、後台對訪問進行統計,如果單個session訪問超過閾值,予以封鎖。

這個看起來更高階了一些,但是其實效果更差,因為session完全不值錢,重新申請乙個就可以了。

3、後台對訪問進行統計,如果單個useragent訪問超過閾值,予以封鎖。

這個是大招,類似於抗生素之類的,效果出奇的好,但是殺傷力過大,誤傷非常嚴重,使用的時候要非常小心。至今為止我們也就只短暫**過mac下的火狐。

4、以上的組合

一、通過user-agent來控制訪問:

無論是瀏覽器還是爬蟲程式,在向伺服器發起網路請求的時候,都會發過去乙個標頭檔案:headers,比如知乎的requests headers:

accept-encoding:gzip, deflate, sdch, br

accept-language:zh-cn,zh;q=0.8,en;q=0.6,zh-tw;q=0.4,da;q=0.2,la;q=0.2

cache-control:max-age=0

connection:keep-alive

cookie: **********

host:

referer:ehco - 知乎

upgrade-insecure-requests:1

query string parameters

view source

view url encoded

這裡面的大多的數的字段都是瀏覽

這裡面的大多數的字段都是瀏覽器向伺服器」表明身份「用的

對於爬蟲程式來說,最需要注意的字段就是:user-agent

很多**都會建立 user-agent白名單,只有屬於正常範圍的user-agent才能夠正常訪問。

比如知乎:

import requests

import bs4

import random

def get_html(url):

try:

r = requests.get(url, timeout=30)

r.raise_for_status

return r.text

except:

return "someting wrong!"

print(get_html(''))

# out:

'''an internal server error occured.

'''

可以看到,這裡的請求被拒絕了,並且返回了乙個500的錯誤碼:

這裡就是因為requests庫本身的headers是這樣的:

這裡面並沒有user-agent欄位,自然不被知乎的伺服器所接受了。

解決方法:

可以自己設定一下user-agent,或者更好的是,可以從一系列的user-agent裡隨機挑出乙個符合標準的使用,**如下:

def get_agent():

'''模擬header的user-agent欄位,

返回乙個隨機的user-agent字典型別的鍵值對

'''agents = ['mozilla/5.0 (compatible; msie 9.0; windows nt 6.1; trident/5.0;',

'mozilla/5.0 (macintosh; intel mac os x 10.6; rv,2.0.1) gecko/20100101 firefox/4.0.1',

'opera/9.80 (macintosh; intel mac os x 10.6.8; u; en) presto/2.8.131 version/11.11',

'mozilla/4.0 (compatible; msie 7.0; windows nt 5.1; 360se)']

fakeheader = {}

fakeheader['user-agent'] = agents[random.randint(0, len(agents))]

return fakeheader

# 注意看新的請求函式:

def get_html(url):

try:

r = requests.get(url, timeout=30,headers=get_agent())

r.raise_for_status

return r.status_code

except:

return "someting wrong!"

'''out:

200'''

二、通過ip限制來反爬蟲:

如果乙個固定的ip在短暫的時間內,快速大量的訪問乙個**,那自然會引起注意,管理員可以通過一些手段把這個ip給封了,爬蟲程式自然也就做不了什麼了。

解決方法:

比較成熟的方式是:ip**池

簡單的說,就是通過ip**,從不同的ip進行訪問,這樣就不會被封掉ip了。

可是ip**的獲取本身就是乙個很麻煩的事情,網上有免費和付費的,但是質量都層次不齊。如果是企業裡需要的話,可以通過自己購買集群雲服務來自建**池。

這裡實現了乙個簡單的**轉換,**如下:

def get_proxy():

'''簡答模擬**池

返回乙個字典型別的鍵值對,

三、通過js指令碼來防止爬蟲:

這個可以說是終極的辦法了,因為,爬蟲終歸只是一段程式,它並不能像人一樣去應對各種變化,如驗證碼,滑動解鎖之類的。

舉個例子:如果想爬取某個**,但是在進入**之前,它會有乙個驗證頁面來驗證你是不是機器。

它是怎麼驗證的呢:

他會通過js**生成一大段隨機的數字,然後要求瀏覽器通過js的運算得出這一串數字的和,再返回給伺服器.

可想而知,這麼簡單和最基礎的乙個驗證步驟,會是寫的**完成不了的。

解決方法:

這裡就要請出乙個大殺器:」phantomjs「

phantomjs是乙個python包,他可以在沒有圖形介面的情況下,完全模擬乙個」瀏覽器「,js指令碼驗證什麼的再也不是問題了。

四、通過robots.txt來限制爬蟲:

世界上做爬蟲最大最好的就是google了,搜尋引擎本身就是乙個超級大的爬蟲,google開發出來爬蟲24h不間斷的在網上爬取著新的資訊,並返回給資料庫,但是這些搜尋引擎的爬蟲都遵守著乙個協議:robots.txt

robots.txt(統一小寫)是一種存放於**根目錄下的ascii編碼的文字檔案,它通常告訴網路搜尋引擎的漫遊器(又稱網路蜘蛛),此**中的哪些內容是不應被搜尋引擎的漫遊器獲取的,哪些是可以被漫遊器獲取的。因為一些系統中的url是大小寫敏感的,所以robots.txt的檔名應統一為小寫。robots.txt應放置於**的根目錄下。如果想單獨定義搜尋引擎的漫遊器訪問子目錄時的行為,那麼可以將自定的設定合併到根目錄下的robots.txt,或者使用robots元資料(metadata,又稱元資料)。

robots.txt協議並不是乙個規範,而只是約定俗成的,所以並不能保證**的隱私。注意robots.txt是用字串比較來確定是否獲取url,所以目錄末尾有與沒有斜槓「/」表示的是不同的url。robots.txt允許使用類似"disallow: *.gif"這樣的萬用字元[1][2]。

wiki上說的已經很清楚了,這實際上只是乙個」君子協議「,遵守與否,都在於爬蟲的編寫者。

來看一下京東的'robots.txt':

user-agent: * 

disallow: /?*

disallow: /pop/*.html

disallow: /pinpai/*.html?*

user-agent: etaospider

disallow: /

user-agent: huihuispider

disallow: /

user-agent: gwdangspider

disallow: /

user-agent: wochachaspider

disallow: /

可以看到,京東的robots協議裡明確的指出四個」user-agent」是禁止訪問的,

事實上,這四個user-agent也是四個臭名昭著的惡性爬蟲。

所以最好遵守這個規則!,網際網路上的很多資源都是免費的,但是如果因為個人的利益,而損害到別人,這是很不對的!

當然有種情況是例外的,比如說我們爬蟲的獲取網頁的速度,和人類瀏覽網頁是差不多的,這並不會給伺服器造成太大的效能損失,在這種情況下,我們是可以不用恪守 robots協議的。

反爬蟲技術和爬蟲特點

防爬規則 1.按照ip段聚合,5分鐘內的ip段 前兩位訪問量 2.按照ip段聚合,某個ip,5分鐘訪問總量 3.按照ip段聚合,某個ip,5分鐘內的關鍵頁面訪問總量 4.按照ip段聚合,某個ip,5分鐘內的ua種類統計 5.按照ip位址聚合,某個ip,5分鐘內頁面查詢不同行程的次數。6.按照ip位址...

python爬蟲六 反爬蟲技術種類

zhuanlan.zhihu.com referer ehco 知乎 很多 都會建立 user agent白名單,只有屬於正常範圍的user agent才能夠正常訪問。模擬header的user agent欄位,返回乙個隨機的user agent字典型別的鍵值對 agents mozilla 5.0...

反爬蟲中技術點的定義

是乙個分布式的,容錯的,高效的訊息通到。主要用於做實時的資料流 構建實時應用等。設計目標 為處理實時資料提供乙個統 一 高吞吐量 低延遲的平台。kafka是乙個分布式訊息佇列 生產者 消費者的功能。啟動 先保證zk集群啟動 再啟動kafka root hadoop01 kafka 2.11 1.1....