反爬蟲的一二三四

2021-09-16 12:22:49 字數 4017 閱讀 5115

一、通過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 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():

'''簡答模擬**池

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

return fakepxs

三、通過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: /

8.3.1修改請求 header

hpuoj 1039 一二三四 同餘定理

時間限制 1 sec 記憶體限制 128 mb 提交 238 解決 88 經過乙個多月的學習生活,楊八方已經愛上了這個學校。這天她行走在老體育場旁的小路上,突然聽到了一陣口號聲。一二三四,二二三四,三二三四,再來一次。那麼問題來了,同學的口號組成了乙個序列 1234 2234 3234 1234 2...

聽!IBM中國的新佇列口號 一!二!三! 四!

2015年2月2日,ibm公司宣布任命陳黎明擔任ibm大中華區董事長。7月31日,ibm宣布錢大群先生將於2015年9月30日退休,同時任命王天義女士為ibm大中華區總經理,後者向陳黎明匯報。這也預示著,ibm大中華區正式進入陳黎明時代,開啟新的篇章。8月11日,陳黎明率領部分ibm大中華區業務高管...

書單記錄。生活不只有ABCD,還有一二三四

202已看書單 1 城南舊事 2 傲慢與偏見 3 乙個陌生女人的來信 剛看完的 乙個陌生女人的來信 不需要很多的歷史背景或者文化背景去理解這本書,對於我淺顯的閱讀和理解來看,只是把它當成了乙個愛情故事來讀,覺得它放在任何背景下都能讀懂,而且這本書的翻譯也特別符合中文的表達。最初是看聲臨其境的綜藝,知...