天天看點

最全反爬蟲技術介紹OUT:

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

一、通過User-Agent來控制通路:

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

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
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:http://zhuanlan.zhihu.com
Referer:Ehco - 知乎
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36
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

r.encoding = r.apparent_encoding

return r.text

except:

return “Someting Wrong!”

print(get_html(‘https://zhuanlan.zhihu.com’))

OUT:

‘’’

<html><body><h1>500 Server Error</h1>

An internal server error occured.

</body></html>

‘’‘

可以看到,這裡的請求被拒絕了,并且傳回了一個500的錯誤碼:

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

{‘Date’: ‘Tue, 09 May 2017 12:13:00 GMT’, ‘Content-Type’: ‘text/html’, ‘Transfer-Encoding’: ‘chunked’, ‘Connection’: ‘keep-alive’, ‘Set-Cookie’: ‘aliyungf_tc=AQAAAPDDXQnf6AEAHaBXcP1tHo5z1uta; Path=/; HttpOnly, acw_tc=AQAAAAM

89GeptQMAHaBXcJiyTK3l8c5g; Path=/; HttpOnly’, ‘Cache-Control’: ‘no-cache’}      

這裡面并沒有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/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.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
    r.encoding = r.apparent_encoding
    return r.status_code    
except:
    return "Someting Wrong!"
   
'''
OUT:
200
''' </pre></div><h4 style="font-size:14px;color:rgb(0,0,0);font-family:'PingFang SC', 'Helvetica Neue', Helvetica, Arial, sans-serif;">二、通過IP限制來反爬蟲:</h4><p style="color:rgb(0,0,0);font-family:'PingFang SC', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:14px;">如果一個固定的ip在短暫的時間内,快速大量的通路一個網站,那自然會引起注意,管理者可以通過一些手段把這個ip給封了,爬蟲程式自然也就做不了什麼了。</p><p style="color:rgb(0,0,0);font-family:'PingFang SC', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:14px;"><strong>解決方法:</strong></p><p style="color:rgb(0,0,0);font-family:'PingFang SC', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:14px;">比較成熟的方式是:IP代理池<br>簡單的說,就是通過ip代理,從不同的ip進行通路,這樣就不會被封掉ip了。<br>可是ip代理的擷取本身就是一個很麻煩的事情,網上有免費和付費的,但是品質都層次不齊。如果是企業裡需要的話,可以通過自己購買叢集雲服務來自建代理池。</p><p style="color:rgb(0,0,0);font-family:'PingFang SC', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:14px;">這裡實作了一個簡單的代理轉換,代碼如下:</p><div class="cnblogs_code" style="font-family:'Courier New';font-size:12px;border:1px solid rgb(204,204,204);color:rgb(0,0,0);"><pre style="font-family:'Courier New';">def get_proxy():
'''
簡答模拟代理池
傳回一個字典類型的鍵值對,
'''
proxy = ["http://116.211.143.11:80",
         "http://183.1.86.235:8118",
         "http://183.32.88.244:808",
         "http://121.40.42.35:9999",
         "http://222.94.148.210:808"]
fakepxs = {}
fakepxs['http'] = proxy[random.randint(0, len(proxy))]

return fakepxs</pre></div><h4 style="font-size:14px;color:rgb(0,0,0);font-family:'PingFang SC', 'Helvetica Neue', Helvetica, Arial, sans-serif;">三、通過JS腳本來防止爬蟲:</h4><p style="color:rgb(0,0,0);font-family:'PingFang SC', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:14px;">這個可以說是終極的辦法了,因為,爬蟲終歸隻是一段程式,它并不能像人一樣去應對各種變化,如驗證碼,滑動解鎖之類的。<br>舉個例子:如果想爬取某個網站,但是在進入網站之前,它會有一個驗證頁面來驗證你是不是機器。<br>它是怎麼驗證的呢:</p><blockquote style="background-image:none;border:2px solid rgb(239,239,239);color:rgb(51,51,51);margin-left:25px;font-family:'PingFang SC', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:14px;"><p>他會通過js代碼生成一大段随機的數字,然後要求浏覽器通過js的運算得出這一串數字的和,再傳回給伺服器.</p></blockquote><p style="color:rgb(0,0,0);font-family:'PingFang SC', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:14px;">可想而知,這麼簡單和最基礎的一個驗證步驟,會是寫的代碼完成不了的。</p><p style="color:rgb(0,0,0);font-family:'PingFang SC', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:14px;"><strong>解決方法:</strong><br>這裡就要請出一個大殺器:”PhantomJS“</p><blockquote style="background-image:none;border:2px solid rgb(239,239,239);color:rgb(51,51,51);margin-left:25px;font-family:'PingFang SC', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:14px;"><p>PhantomJS是一個Python包,他可以在沒有圖形界面的情況下,完全模拟一個”浏覽器“,js腳本驗證什麼的再也不是問題了。</p></blockquote><h4 style="font-size:14px;color:rgb(0,0,0);font-family:'PingFang SC', 'Helvetica Neue', Helvetica, Arial, sans-serif;">四、通過robots.txt來限制爬蟲:</h4><p style="color:rgb(0,0,0);font-family:'PingFang SC', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:14px;">世界上做爬蟲最大最好的就是Google了,搜尋引擎本身就是一個超級大的爬蟲,Google開發出來爬蟲24h不間斷的在網上爬取着新的資訊,并傳回給資料庫,但是這些搜尋引擎的爬蟲都遵守着一個協定:<em>robots.txt</em></p><blockquote style="background-image:none;border:2px solid rgb(239,239,239);color:rgb(51,51,51);margin-left:25px;font-family:'PingFang SC', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:14px;"><p>robots.txt(統一小寫)是一種存放于網站根目錄下的ASCII編碼的文本檔案,它通常告訴網絡搜尋引擎的漫遊器(又稱網絡蜘蛛),此網站中的哪些内容是不應被搜尋引擎的漫遊器擷取的,哪些是可以被漫遊器擷取的。因為一些系統中的URL是大小寫敏感的,是以robots.txt的檔案名應統一為小寫。robots.txt應放置于網站的根目錄下。如果想單獨定義搜尋引擎的漫遊器通路子目錄時的行為,那麼可以将自定的設定合并到根目錄下的robots.txt,或者使用robots中繼資料(Metadata,又稱中繼資料)。<br>robots.txt協定并不是一個規範,而隻是約定俗成的,是以并不能保證網站的隐私。注意robots.txt是用字元串比較來确定是否擷取URL,是以目錄末尾有與沒有斜杠“/”表示的是不同的URL。robots.txt允許使用類似"Disallow: *.gif"這樣的通配符[1][2]。</p></blockquote><p style="color:rgb(0,0,0);font-family:'PingFang SC', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:14px;">wiki上說的已經很清楚了,這實際上隻是一個”君子協定“,遵守與否,都在于爬蟲的編寫者。</p><p style="color:rgb(0,0,0);font-family:'PingFang SC', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:14px;">來看一下京東的'robots.txt':</p><div class="cnblogs_code" style="font-family:'Courier New';font-size:12px;border:1px solid rgb(204,204,204);color:rgb(0,0,0);"><pre style="font-family:'Courier New';">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協定的。

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

一、通過User-Agent來控制通路:

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

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
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:http://zhuanlan.zhihu.com
Referer:Ehco - 知乎
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36
Query String Parameters
view source
view URL encoded
      

繼續閱讀