網絡反爬技術有哪些?

網絡反爬技術有哪些?

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

'''

500 Server Error

An internal server error occured.

'''

解決方法:

可以自己設置一下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代碼生成一大段隨機的數字,然後要求瀏覽器通過js的運算得出這一串數字的和,再返回給服務器。爬蟲遇到這種難關就無法翻越了。


解決方法:

PhantomJS是一個Python包,他可以在沒有圖形界面的情況下,完全模擬一個”瀏覽器“,js腳本驗證什麼的再也不是問題了。


四、通過robots.txt來限制爬蟲:


世界最大的爬蟲就是Google,每個搜索引擎本身就是一個超級大爬蟲,Google的爬蟲24小時不間斷的爬取網上的新信息,並返回給數據庫,但是這些搜索引擎的爬蟲都遵守著一個協議:robots.txt


robots.txt(統一小寫)是一種存放於網站根目錄下的ASCII編碼的文本文件,它通常告訴網絡搜索引擎的漫遊器(又稱網絡蜘蛛),此網站中的哪些內容是不應被搜索引擎的漫遊器獲取的,哪些是可以被漫遊器獲取的。因為一些系統中的URL是大小寫敏感的,所以robots.txt的文件名應統一為小寫。robots.txt應放置於網站的根目錄下。如果想單獨定義搜索引擎的漫遊器訪問子目錄時的行為,那麼可以將自定的設置合併到根目錄下的robots.txt,或者使用robots元數據(Metadata,又稱元數據)。robots.txt協議並不是行業規範,只是約定俗成的‘規矩’,所以並不能保證網站的隱私。注意robots.txt是用字符串比較來確定是否獲取URL,所以目錄末尾有與沒有斜槓“/”表示的是不同的URL。robots.txt允許使用類似"Disallow: *.gif"這樣的通配符。robots.txt只是一個”君子協議“,遵守與否,都在於爬蟲的編寫者。


京東的'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協議也可以不被遵守。


分享到:


相關文章: