簡單反爬蟲技術介紹

2022-09-15 19:36:09 字數 4605 閱讀 3462

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

注:文末有福利!

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

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

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

bs4import

random

defget_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

#注意看新的請求函式:

defget_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協議的。

it資源社-qq***:601357554

裡面基本什麼資料都有,基礎到高階到專案實戰,如果覺得不夠還可以**跟群主要,最重要的是全部免費!

爬蟲的簡單介紹

絡爬 被稱為 蜘蛛,絡機器 就是模擬客戶端傳送 絡請求,接收請求響應,種按照 定的規則,動地抓取互聯 資訊的程式。只要是瀏覽器能做的事情,原則上,爬 都能夠做 12306搶票 上的投票 簡訊轟炸 三 特徵 1 都有 唯 的url 2 都是html來描述 資訊 3 都使 http https協議來傳輸...

簡單反射例項

今天中午吃飯,突然有同事談到不知道程式集名是否也可以呼叫dll的公開方法。當時啞了,好久沒弄過反射,印象模糊了。回來試了一下,其實只要知道dll的命名空間和要呼叫的方法的類名就可以呼叫該方法了 注 非同一命名空間下,該dll的類和方法必須是公開的 示例 如下 建立乙個類庫,名稱為demolb,建立乙...

Python開發簡單爬蟲之爬蟲介紹(一)

本部落格來自慕課網 python開發簡單爬蟲 爬蟲主要場景 不需要登入的靜態網頁 使用ajax非同步載入的內容 需要使用者登入才可以訪問的網頁 以下主要介紹不需要登入的靜態網頁。3中實現方式 python中已經存在關鍵字class,故當屬性為class時,用class 代替。coding utf 8...