1. 程式人生 > >最全反爬蟲技術介紹

最全反爬蟲技術介紹

urn control ror os x 字符串比較 ext 系列 3.1 模擬

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

註:文末有福利!

一、通過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
    ‘‘‘ 

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

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

解決方法:

比較成熟的方式是:IP代理池
簡單的說,就是通過ip代理,從不同的ip進行訪問,這樣就不會被封掉ip了。
可是ip代理的獲取本身就是一個很麻煩的事情,網上有免費和付費的,但是質量都層次不齊。如果是企業裏需要的話,可以通過自己購買集群雲服務來自建代理池。

這裏實現了一個簡單的代理轉換,代碼如下:

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

三、通過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資源社】:

本公眾號致力於免費分享全網最優秀的視頻資源,學習資料,面試經驗等,前端,PHP,JAVA,算法,Python,大數據等等,你想要的這都有

IT資源社-QQ交流群:601357554

微信搜索公眾號:ITziyuanshe 或者掃描下方二維碼直接關註,

技術分享圖片

裏面基本什麽資料都有,基礎到進階到項目實戰,如果覺得不夠還可以加群跟群主要,最重要的是全部免費!

最全反爬蟲技術介紹