成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

爬蟲攻防實(shí)踐

wanglu1209 / 2703人閱讀

摘要:之前在學(xué)校曾經(jīng)用過(guò)的方法做過(guò)一些爬蟲腳本來(lái)玩,從正式轉(zhuǎn)前端之后,出于興趣,我對(duì)爬蟲和反爬蟲又做了一些了解,并且做了一些爬蟲攻防的實(shí)踐。爬蟲腳本通常會(huì)很頻繁的進(jìn)行網(wǎng)絡(luò)請(qǐng)求,比如要爬取豆瓣排行榜的電影,就會(huì)連續(xù)發(fā)送個(gè)網(wǎng)絡(luò)請(qǐng)求。

之前在學(xué)校曾經(jīng)用過(guò)request+xpath的方法做過(guò)一些爬蟲腳本來(lái)玩,從ios正式轉(zhuǎn)前端之后,出于興趣,我對(duì)爬蟲和反爬蟲又做了一些了解,并且做了一些爬蟲攻防的實(shí)踐。
我們?cè)谂廊【W(wǎng)站的時(shí)候,都會(huì)遵守 robots 協(xié)議,在爬取數(shù)據(jù)的過(guò)程中,盡量不對(duì)服務(wù)器造成壓力。但并不是所有人都這樣,網(wǎng)絡(luò)上仍然會(huì)有大量的惡意爬蟲。對(duì)于網(wǎng)絡(luò)維護(hù)者來(lái)說(shuō),爬蟲的肆意橫行不僅給服務(wù)器造成極大的壓力,還意味著自己的網(wǎng)站資料泄露,甚至是自己刻意隱藏在網(wǎng)站的隱私的內(nèi)容也會(huì)泄露,這也就是反爬蟲技術(shù)存在的意義。
下面開始我的攻防實(shí)踐。

開始

先從最基本的requests開始。requests是一常用的http請(qǐng)求庫(kù),它使用python語(yǔ)言編寫,可以方便地發(fā)送http請(qǐng)求,以及方便地處理響應(yīng)結(jié)果。這是一段抓取豆瓣電影內(nèi)容的代碼。

import requests
from lxml import etree

url = "https://movie.douban.com/subject/1292052/"
data = requests.get(url).text
s=etree.HTML(data)
film=s.xpath("http://*[@id="content"]/h1/span[1]/text()")
print(film)

代碼的運(yùn)行結(jié)果,會(huì)輸出

["肖申克的救贖 The Shawshank Redemption"]

這就是最簡(jiǎn)單的完整的爬蟲操作,通過(guò)代碼發(fā)送網(wǎng)絡(luò)請(qǐng)求,然后解析返回內(nèi)容,分析頁(yè)面元素,得到自己需要的東西。
這樣的爬蟲防起來(lái)也很容易。使用抓包工具看一下剛才發(fā)送的請(qǐng)求,再對(duì)比一下瀏覽器發(fā)送的正常請(qǐng)求。可以看到,兩者的請(qǐng)求頭差別非常大,尤其requests請(qǐng)求頭中的user-agent,赫然寫著python-requests。這就等于是告訴服務(wù)端,這條請(qǐng)求不是真人發(fā)的。服務(wù)端只需要對(duì)請(qǐng)求頭進(jìn)行一下判斷,就可以防御這一種的爬蟲。

當(dāng)然requests也不是這么沒用的,它也支持偽造請(qǐng)求頭。以u(píng)ser-agent為例,對(duì)剛才的代碼進(jìn)行修改,就可以很容易地在請(qǐng)求頭中加入你想要加的字段,偽裝成真實(shí)的請(qǐng)求,干擾服務(wù)端的判斷。

import requests
from lxml import etree

user_agent = "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)"
headers = { "User-Agent" : user_agent }
url = "https://movie.douban.com/subject/1292052/"
data = requests.get(url,headers=headers).text
s=etree.HTML(data)
film=s.xpath("http://*[@id="content"]/h1/span[1]/text()")
print(film)
提高

現(xiàn)階段,就網(wǎng)絡(luò)請(qǐng)求的內(nèi)容上來(lái)說(shuō),爬蟲腳本已經(jīng)和真人一樣了,那么服務(wù)器就要從別的角度來(lái)進(jìn)行防御。
有兩個(gè)思路,第一個(gè),分析爬蟲腳本的行為模式來(lái)進(jìn)行識(shí)別和防御。
爬蟲腳本通常會(huì)很頻繁的進(jìn)行網(wǎng)絡(luò)請(qǐng)求,比如要爬取豆瓣排行榜top100的電影,就會(huì)連續(xù)發(fā)送100個(gè)網(wǎng)絡(luò)請(qǐng)求。針對(duì)這種行為模式,服務(wù)端就可以對(duì)訪問(wèn)的 IP 進(jìn)行統(tǒng)計(jì),如果單個(gè) IP 短時(shí)間內(nèi)訪問(wèn)超過(guò)設(shè)定的閾值,就給予封鎖。這確實(shí)可以防御一批爬蟲,但是也容易誤傷正常用戶,并且爬蟲腳本也可以繞過(guò)去。
這時(shí)候的爬蟲腳本要做的就是ip代理,每隔幾次請(qǐng)求就切換一下ip,防止請(qǐng)求次數(shù)超過(guò)服務(wù)端設(shè)的閾值。設(shè)置代理的代碼也非常簡(jiǎn)單。

import requests

proxies = {
    "http" : "http://111.155.124.78:8123" # 代理ip
}
user_agent = "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)"
headers = { "User-Agent" : user_agent }
url = "https://movie.douban.com/subject/1292052/"
res = requests.get(url = http_url, headers = headers, proxies = proxies)

第二個(gè)思路,通過(guò)做一些只有真人能做的操作來(lái)識(shí)別爬蟲腳本。最典型的就是以12306為代表的驗(yàn)證碼操作。
增加驗(yàn)證碼是一個(gè)既古老又相當(dāng)有效果的方法,能夠讓很多爬蟲望風(fēng)而逃。當(dāng)然這也不是萬(wàn)無(wú)一失的。經(jīng)過(guò)多年的發(fā)展,用計(jì)算機(jī)視覺進(jìn)行一些圖像識(shí)別已經(jīng)不是什么新鮮事,訓(xùn)練神經(jīng)網(wǎng)絡(luò)的門檻也越來(lái)越低,并且有許多開源的計(jì)算機(jī)視覺庫(kù)可以免費(fèi)使用。例如可以在python中引入的tesseract,只要一行命令就能進(jìn)行驗(yàn)證碼的識(shí)別。

import pytesseract
from PIL import Image
...
#get identifying code img
...
im=Image.open("code.png")
result = pytesseract.image_to_string(im)

再專業(yè)一點(diǎn)的話,還可以加上一些圖像預(yù)處理的操作,比如降噪和二值化,提高驗(yàn)證碼的識(shí)別準(zhǔn)確率。當(dāng)然要是驗(yàn)證碼原本的干擾線, 噪點(diǎn)都比較多,甚至還出現(xiàn)了人類肉眼都難以辨別的驗(yàn)證碼(12306),計(jì)算機(jī)識(shí)別的準(zhǔn)確度也會(huì)相應(yīng)下降一些。但這種方法對(duì)于真實(shí)的人類用戶來(lái)說(shuō)實(shí)在是太不友好了,屬于是殺敵一千自損八百的做法。

進(jìn)階

驗(yàn)證碼的方法雖然防爬效果好,但是對(duì)于真人實(shí)在是不夠友好,開發(fā)人員在優(yōu)化驗(yàn)證操作的方面也下了很多工夫。如今,很多的人機(jī)驗(yàn)證操作已經(jīng)不再需要輸入驗(yàn)證碼,有些只要一下點(diǎn)擊就可以完成,有些甚至不需要任何操作,在用戶不知道的情況下就能完成驗(yàn)證。這里其實(shí)包含了不同的隱形驗(yàn)證方法。

有些隱形驗(yàn)證采用了基于JavaScript的驗(yàn)證手段。這種方法主要是在響應(yīng)數(shù)據(jù)頁(yè)面之前,先返回一段帶有JavaScript 代碼的頁(yè)面,用于驗(yàn)證訪問(wèn)者有無(wú) JavaScript 的執(zhí)行環(huán)境,以確定使用的是不是瀏覽器。例如淘寶、快代理這樣的網(wǎng)站。通常情況下,這段JS代碼執(zhí)行后,會(huì)發(fā)送一個(gè)帶參數(shù)key的請(qǐng)求,后臺(tái)通過(guò)判斷key的值來(lái)決定是響應(yīng)真實(shí)的頁(yè)面,還是響應(yīng)偽造或錯(cuò)誤的頁(yè)面。因?yàn)閗ey參數(shù)是動(dòng)態(tài)生成的,每次都不一樣,難以分析出其生成方法,使得無(wú)法構(gòu)造對(duì)應(yīng)的http請(qǐng)求。
有些則更加高級(jí)一些,通過(guò)檢測(cè)出用戶的瀏覽習(xí)慣,比如用戶常用 IP 或者鼠標(biāo)移動(dòng)情況等,然后自行判斷人機(jī)操作。這樣就用一次點(diǎn)擊取代了繁瑣的驗(yàn)證碼,而且實(shí)際效果還更好。
對(duì)于這類的反爬手段,就輪到selenium這個(gè)神器登場(chǎng)了。selenium是一個(gè)測(cè)試用的庫(kù),可以調(diào)用瀏覽器內(nèi)核,也就是說(shuō)可以打開一個(gè)真的瀏覽器,并且可以手動(dòng)進(jìn)行操作。那就完美可以完美應(yīng)對(duì)上述兩種隱形驗(yàn)證手段。
selenium的使用也很簡(jiǎn)單,可以直接對(duì)頁(yè)面元素進(jìn)行操作。配合根據(jù)頁(yè)面元素等待頁(yè)面加載完成的時(shí)延操作,基本上把人瀏覽頁(yè)面的過(guò)程整個(gè)模擬了一遍。而且因?yàn)閟elenium會(huì)打開一個(gè)瀏覽器,所以如果有點(diǎn)擊的驗(yàn)證操作,一般這種操作也就在開始的登錄頁(yè)會(huì)有,人來(lái)點(diǎn)一下就是了。

from selenium import webdriver

browser = webdriver.Chrome()
browser.get("url")
#獲得dom節(jié)點(diǎn)
node = browser.find_elements_by_id("id")
nodes = browser.find_elements_by_css_selector("css-selector")
nodelist = browser.find_elements_by_class_name("class-name")
#操作dom元素
browser.find_element_by_xpath("xpath-to-dom").send_keys("password")
browser.find_element_by_xpath("xpath-to-dom").click()
#等待頁(yè)面加載
locator = (By.CLASS_NAME, "page-content")
try:
    WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(locator))
finally:
    driver.close()

這么看起來(lái)仿佛selenium就是無(wú)解的了,實(shí)際上并不是。較新的智能人機(jī)驗(yàn)證已經(jīng)把selenium列入了針對(duì)目標(biāo)中,使得即使手動(dòng)點(diǎn)擊進(jìn)行人機(jī)驗(yàn)證也會(huì)失敗。這是怎么做的呢?事實(shí)上,這是對(duì)于瀏覽器頭做了一次檢測(cè)。如果打開selenium的瀏覽器控制臺(tái)輸入window.navigator.webdriver,返回值會(huì)是“true”。而在正常打開的瀏覽器中輸入這段命令,返回的會(huì)是“undefined”。在這里,我找到了關(guān)于webdriver的描述:navigator.webdriver
)。可以看到,webdriver屬性就是用來(lái)表示用戶代理是否被自動(dòng)化控制,也就是這個(gè)屬性暴露了selenium的存在,人機(jī)驗(yàn)證就無(wú)法通過(guò)。而且,這個(gè)屬性還是只讀的,那么就不能直接修改。當(dāng)然硬要改也不是不行,通過(guò)修改目標(biāo)屬性的get方法,達(dá)到屬性修改的目的。這時(shí)的webdriver屬性就是undefined了,然后再進(jìn)行智能人機(jī)驗(yàn)證,就可以通過(guò)了。但這是治標(biāo)不治本的,此時(shí)如果瀏覽器打開了新的窗口,或者點(diǎn)擊鏈接進(jìn)入新的頁(yè)面,我們會(huì)發(fā)現(xiàn),webdriver又變回了true。當(dāng)然,在每次打開新頁(yè)面后都輸入這段命令也可以,不過(guò)事實(shí)上,雖然點(diǎn)擊驗(yàn)證可以被繞過(guò)去,但如果直接在頁(yè)面中加入檢測(cè)webdriver的JS代碼,一打開頁(yè)面就執(zhí)行,那么在你改webdriver之前,網(wǎng)站已經(jīng)知道你到底是不是爬蟲腳本了。

更多

道高一尺,魔高一丈。事實(shí)上即使這樣的反爬手段,也還是可以繞過(guò)去。在啟動(dòng)Chromedriver之前,為Chrome開啟實(shí)驗(yàn)性功能參數(shù)excludeSwitches,它的值為["enable-automation"],像這樣

from selenium.webdriver import Chrome 
from selenium.webdriver import ChromeOptions 
option = ChromeOptions() 
option.add_experimental_option("excludeSwitches", ["enable-automation"]) 
driver = Chrome(options=option)
driver.get("url")

這時(shí)候,不管怎么打開新頁(yè)面,webdriver都會(huì)是undefined。對(duì)于這個(gè)級(jí)別的爬蟲腳本,還不知道要怎么防御,檢測(cè)的成本太高了。
不過(guò),事實(shí)上,換個(gè)思路,還有一些有趣的反爬方法。比如貓眼電影的實(shí)時(shí)票房和起點(diǎn)中文網(wǎng),在瀏覽器里能看到內(nèi)容,但是打開網(wǎng)頁(yè)代碼一看,全變成了方塊。這就是一種很好地反爬方法,簡(jiǎn)單地說(shuō)就是后端搭一套字體生成接口,隨機(jī)生成一個(gè)字體,然后返回這個(gè)字體文件,以及各個(gè)數(shù)字的unicode對(duì)應(yīng)關(guān)系,前端頁(yè)面進(jìn)行數(shù)據(jù)填充,就可以隱藏敏感數(shù)據(jù)。

還有些充分利用了css進(jìn)行的反爬,腦洞更大。搞兩套數(shù)據(jù),顯示的時(shí)候用css定位將真實(shí)的覆蓋假的?;蛘吒阋恍└蓴_字符,顯示的時(shí)候?qū)pacity設(shè)為0進(jìn)行隱藏。甚至還有設(shè)置一個(gè)背景,讓它和顯示的內(nèi)容拼接在一起,成為真正要展示的內(nèi)容。這些都是非常有趣的反爬手段。
不過(guò)對(duì)于前端來(lái)說(shuō),畢竟所有的數(shù)據(jù)和代碼,都給到了客戶端,爬蟲腳本總是能想出辦法來(lái)爬到數(shù)據(jù),各種反爬的手段,也就是加大爬數(shù)據(jù)的難度而已。主要還是要自覺,拒絕惡意爬蟲。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/54213.html

相關(guān)文章

  • 爬蟲攻防實(shí)踐

    摘要:之前在學(xué)校曾經(jīng)用過(guò)的方法做過(guò)一些爬蟲腳本來(lái)玩,從正式轉(zhuǎn)前端之后,出于興趣,我對(duì)爬蟲和反爬蟲又做了一些了解,并且做了一些爬蟲攻防的實(shí)踐。爬蟲腳本通常會(huì)很頻繁的進(jìn)行網(wǎng)絡(luò)請(qǐng)求,比如要爬取豆瓣排行榜的電影,就會(huì)連續(xù)發(fā)送個(gè)網(wǎng)絡(luò)請(qǐng)求。 之前在學(xué)校曾經(jīng)用過(guò)request+xpath的方法做過(guò)一些爬蟲腳本來(lái)玩,從ios正式轉(zhuǎn)前端之后,出于興趣,我對(duì)爬蟲和反爬蟲又做了一些了解,并且做了一些爬蟲攻防的實(shí)踐...

    xiangzhihong 評(píng)論0 收藏0
  • 極簡(jiǎn)爬蟲攻防戰(zhàn)紀(jì)要

    摘要:極簡(jiǎn)爬蟲攻防戰(zhàn)紀(jì)要爬蟲是構(gòu)建搜索引擎的基礎(chǔ)負(fù)責(zé)抓取網(wǎng)頁(yè)信息并對(duì)網(wǎng)頁(yè)識(shí)別分類及過(guò)濾。爬蟲方終于鎖定了第一場(chǎng)戰(zhàn)役的勝局由于斷崖式技術(shù)的出現(xiàn),反爬方在瀏覽器識(shí)別戰(zhàn)役上望風(fēng)披靡。經(jīng)過(guò)反爬方的精心運(yùn)作,逐漸有效削弱了敵方的攻勢(shì)。 極簡(jiǎn)爬蟲攻防戰(zhàn)紀(jì)要 ? ??爬蟲是構(gòu)建搜索引擎的基礎(chǔ), 負(fù)責(zé)抓取網(wǎng)頁(yè)信息并對(duì)網(wǎng)頁(yè)識(shí)別、分類及過(guò)濾。我們熟識(shí)的電商、搜索、新聞及各大門戶網(wǎng)站都有強(qiáng)大的爬蟲集群在每...

    elliott_hu 評(píng)論0 收藏0
  • Tomcat和搜索引擎網(wǎng)絡(luò)爬蟲攻防

    摘要:而搜索引擎如百度和微軟搜索,搜索等通過(guò)什么方式才能收錄我們的個(gè)人網(wǎng)站呢答案是搜索引擎的網(wǎng)絡(luò)爬蟲。網(wǎng)絡(luò)爬蟲是一個(gè)很形象的名詞,是屬于搜索引擎的工具,只有被這些網(wǎng)絡(luò)爬蟲爬過(guò)的內(nèi)容才有機(jī)會(huì)出現(xiàn)在對(duì)應(yīng)搜索引擎的搜索結(jié)果中。 不知道廣大程序員朋友們注意到一個(gè)現(xiàn)象么?使用百度是無(wú)法搜索到淘寶網(wǎng)的網(wǎng)頁(yè)。為什么會(huì)造成這種現(xiàn)象?這就要從網(wǎng)絡(luò)爬蟲說(shuō)起了。 咱們程序員假如自己搭設(shè)個(gè)人網(wǎng)站,在上面分享少量自己...

    cheukyin 評(píng)論0 收藏0
  • 2018先知白帽大會(huì) | 議題解讀

    摘要:摘要今年的先知白帽大會(huì),與會(huì)者將能夠親身感受到非常多有趣的技術(shù)議題,如在國(guó)際賽事中屢奪佳績(jī)的團(tuán)隊(duì),其隊(duì)長(zhǎng)將親臨現(xiàn)場(chǎng),分享穿針引線般的漏洞利用藝術(shù)。從數(shù)據(jù)視角探索安全威脅阿里云安全工程師議題解讀本議題討論了數(shù)據(jù)為安全人員思維方式帶來(lái)的變化。 摘要: 今年的先知白帽大會(huì),與會(huì)者將能夠親身感受到非常多有趣的技術(shù)議題,如HITCON在國(guó)際賽事中屢奪佳績(jī)的CTF團(tuán)隊(duì),其隊(duì)長(zhǎng)Orange將親臨現(xiàn)場(chǎng)...

    Hydrogen 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<