国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

爬蟲攻防實踐

wanglu1209 / 2688人閱讀

摘要:之前在學校曾經用過的方法做過一些爬蟲腳本來玩,從正式轉前端之后,出于興趣,我對爬蟲和反爬蟲又做了一些了解,并且做了一些爬蟲攻防的實踐。爬蟲腳本通常會很頻繁的進行網絡請求,比如要爬取豆瓣排行榜的電影,就會連續發送個網絡請求。

之前在學校曾經用過request+xpath的方法做過一些爬蟲腳本來玩,從ios正式轉前端之后,出于興趣,我對爬蟲和反爬蟲又做了一些了解,并且做了一些爬蟲攻防的實踐。
我們在爬取網站的時候,都會遵守 robots 協議,在爬取數據的過程中,盡量不對服務器造成壓力。但并不是所有人都這樣,網絡上仍然會有大量的惡意爬蟲。對于網絡維護者來說,爬蟲的肆意橫行不僅給服務器造成極大的壓力,還意味著自己的網站資料泄露,甚至是自己刻意隱藏在網站的隱私的內容也會泄露,這也就是反爬蟲技術存在的意義。
下面開始我的攻防實踐。

開始

先從最基本的requests開始。requests是一常用的http請求庫,它使用python語言編寫,可以方便地發送http請求,以及方便地處理響應結果。這是一段抓取豆瓣電影內容的代碼。

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)

代碼的運行結果,會輸出

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

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

當然requests也不是這么沒用的,它也支持偽造請求頭。以user-agent為例,對剛才的代碼進行修改,就可以很容易地在請求頭中加入你想要加的字段,偽裝成真實的請求,干擾服務端的判斷。

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)
提高

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

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)

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

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

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

進階

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

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

from selenium import webdriver

browser = webdriver.Chrome()
browser.get("url")
#獲得dom節點
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()
#等待頁面加載
locator = (By.CLASS_NAME, "page-content")
try:
    WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(locator))
finally:
    driver.close()

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

更多

道高一尺,魔高一丈。事實上即使這樣的反爬手段,也還是可以繞過去。在啟動Chromedriver之前,為Chrome開啟實驗性功能參數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")

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

還有些充分利用了css進行的反爬,腦洞更大。搞兩套數據,顯示的時候用css定位將真實的覆蓋假的。或者搞一些干擾字符,顯示的時候將opacity設為0進行隱藏。甚至還有設置一個背景,讓它和顯示的內容拼接在一起,成為真正要展示的內容。這些都是非常有趣的反爬手段。
不過對于前端來說,畢竟所有的數據和代碼,都給到了客戶端,爬蟲腳本總是能想出辦法來爬到數據,各種反爬的手段,也就是加大爬數據的難度而已。主要還是要自覺,拒絕惡意爬蟲。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/54213.html

相關文章

  • 爬蟲攻防實踐

    摘要:之前在學校曾經用過的方法做過一些爬蟲腳本來玩,從正式轉前端之后,出于興趣,我對爬蟲和反爬蟲又做了一些了解,并且做了一些爬蟲攻防的實踐。爬蟲腳本通常會很頻繁的進行網絡請求,比如要爬取豆瓣排行榜的電影,就會連續發送個網絡請求。 之前在學校曾經用過request+xpath的方法做過一些爬蟲腳本來玩,從ios正式轉前端之后,出于興趣,我對爬蟲和反爬蟲又做了一些了解,并且做了一些爬蟲攻防的實踐...

    xiangzhihong 評論0 收藏0
  • 極簡爬蟲攻防戰紀要

    摘要:極簡爬蟲攻防戰紀要爬蟲是構建搜索引擎的基礎負責抓取網頁信息并對網頁識別分類及過濾。爬蟲方終于鎖定了第一場戰役的勝局由于斷崖式技術的出現,反爬方在瀏覽器識別戰役上望風披靡。經過反爬方的精心運作,逐漸有效削弱了敵方的攻勢。 極簡爬蟲攻防戰紀要 ? ??爬蟲是構建搜索引擎的基礎, 負責抓取網頁信息并對網頁識別、分類及過濾。我們熟識的電商、搜索、新聞及各大門戶網站都有強大的爬蟲集群在每...

    elliott_hu 評論0 收藏0
  • Tomcat和搜索引擎網絡爬蟲攻防

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

    cheukyin 評論0 收藏0
  • 2018先知白帽大會 | 議題解讀

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

    Hydrogen 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<