反爬蟲 的技術大概分爲四個種類:html
注:文末有福利!前端
不管是瀏覽器仍是爬蟲程序,在向服務器發起網絡請求的時候,都會發過去一個頭文件:headers,好比知乎的requests headers:web
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代理的獲取自己就是一個很麻煩的事情,網上有免費和付費的,可是質量都層次不齊。若是是企業裏須要的話,能夠經過本身購買集羣雲服務來自建代理池。
這裏實現了一個簡單的代理轉換,代碼以下:
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的運算得出這一串數字的和,再返回給服務器.
可想而知,這麼簡單和最基礎的一個驗證步驟,會是寫的代碼完成不了的。
解決方法:
這裏就要請出一個大殺器:」PhantomJS「
PhantomJS是一個Python包,他能夠在沒有圖形界面的狀況下,徹底模擬一個」瀏覽器「,js腳本驗證什麼的不再是問題了。
世界上作爬蟲最大最好的就是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 或者掃描下方二維碼直接關注,
裏面基本什麼資料都有,基礎到進階到項目實戰,若是以爲不夠還能夠加羣跟羣主要,最重要的是所有免費!