日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python网络爬虫系列(八)——常见的反爬手段和解决方法

發(fā)布時間:2024/7/5 python 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python网络爬虫系列(八)——常见的反爬手段和解决方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

常見的反爬手段和解決思路

學(xué)習(xí)目標(biāo)
  • 了解 服務(wù)器反爬的原因
  • 了解 服務(wù)器常反什么樣的爬蟲
  • 了解 反爬蟲領(lǐng)域常見的一些概念
  • 了解 反爬的三個方向
  • 了解 常見基于身份識別進(jìn)行反爬
  • 了解 常見基于爬蟲行為進(jìn)行反爬
  • 了解 常見基于數(shù)據(jù)加密進(jìn)行反爬

  • 1 服務(wù)器反爬的原因

    • 爬蟲占總PV(PV是指頁面的訪問次數(shù),每打開或刷新一次頁面,就算做一個pv)比例較高,這樣浪費(fèi)錢(尤其是三月份爬蟲)。

      三月份爬蟲是個什么概念呢?每年的三月份我們會迎接一次爬蟲高峰期,有大量的碩士在寫論文的時候會選擇爬取一些往網(wǎng)站,并進(jìn)行輿情分析。因?yàn)槲逶路萁徽撐?#xff0c;所以嘛,大家都是讀過書的,你們懂的,前期各種DotA,LOL,到了三月份了,來不及了,趕緊抓數(shù)據(jù),四月份分析一下,五月份交論文,就是這么個節(jié)奏。

    • 公司可免費(fèi)查詢的資源被批量抓走,喪失競爭力,這樣少賺錢。

      數(shù)據(jù)可以在非登錄狀態(tài)下直接被查詢。如果強(qiáng)制登陸,那么可以通過封殺賬號的方式讓對方付出代價(jià),這也是很多網(wǎng)站的做法。但是不強(qiáng)制對方登錄。那么如果沒有反爬蟲,對方就可以批量復(fù)制的信息,公司競爭力就會大大減少。競爭對手可以抓到數(shù)據(jù),時間長了用戶就會知道,只需要去競爭對手那里就可以了,沒必要來我們網(wǎng)站,這對我們是不利的。

    • 狀告爬蟲成功的幾率小

      爬蟲在國內(nèi)還是個擦邊球,就是有可能可以起訴成功,也可能完全無效。所以還是需要用技術(shù)手段來做最后的保障。

    2 服務(wù)器常反什么樣的爬蟲

    • 十分低級的應(yīng)屆畢業(yè)生

      應(yīng)屆畢業(yè)生的爬蟲通常簡單粗暴,根本不管服務(wù)器壓力,加上人數(shù)不可預(yù)測,很容易把站點(diǎn)弄掛。

    • 十分低級的創(chuàng)業(yè)小公司

      現(xiàn)在的創(chuàng)業(yè)公司越來越多,也不知道是被誰忽悠的然后大家創(chuàng)業(yè)了發(fā)現(xiàn)不知道干什么好,覺得大數(shù)據(jù)比較熱,就開始做大數(shù)據(jù)。分析程序全寫差不多了,發(fā)現(xiàn)自己手頭沒有數(shù)據(jù)。怎么辦?寫爬蟲爬啊。于是就有了不計(jì)其數(shù)的小爬蟲,出于公司生死存亡的考慮,不斷爬取數(shù)據(jù)。

    • 不小心寫錯了沒人去停止的失控小爬蟲

      有些網(wǎng)站已經(jīng)做了相應(yīng)的反爬,但是爬蟲依然孜孜不倦地爬取。什么意思呢?就是說,他們根本爬不到任何數(shù)據(jù),除了httpcode是200以外,一切都是不對的,可是爬蟲依然不停止這個很可能就是一些托管在某些服務(wù)器上的小爬蟲,已經(jīng)無人認(rèn)領(lǐng)了,依然在辛勤地工作著。

    • 成型的商業(yè)對手

      這個是最大的對手,他們有技術(shù),有錢,要什么有什么,如果和你死磕,你就只能硬著頭皮和他死磕。

    • 抽風(fēng)的搜索引擎

      大家不要以為搜索引擎都是好人,他們也有抽風(fēng)的時候,而且一抽風(fēng)就會導(dǎo)致服務(wù)器性能下降,請求量跟網(wǎng)絡(luò)攻擊沒什么區(qū)別。

    3 反爬蟲領(lǐng)域常見的一些概念

    因?yàn)榉磁老x暫時是個較新的領(lǐng)域,因此有些定義要自己下:

    • 爬蟲:使用任何技術(shù)手段,批量獲取網(wǎng)站信息的一種方式。關(guān)鍵在于批量。

    • 反爬蟲:使用任何技術(shù)手段,阻止別人批量獲取自己網(wǎng)站信息的一種方式。關(guān)鍵也在于批量。

    • 誤傷:在反爬蟲的過程中,錯誤的將普通用戶識別為爬蟲。誤傷率高的反爬蟲策略,效果再好也不能用。

    • 攔截:成功地阻止爬蟲訪問。這里會有攔截率的概念。通常來說,攔截率越高的反爬蟲策略,誤傷的可能性就越高。因此需要做個權(quán)衡。

    • 資源:機(jī)器成本與人力成本的總和。

    這里要切記,人力成本也是資源,而且比機(jī)器更重要。因?yàn)?#xff0c;根據(jù)摩爾定律,機(jī)器越來越便宜。而根據(jù)IT行業(yè)的發(fā)展趨勢,程序員工資越來越貴。因此,通常服務(wù)器反爬就是讓爬蟲工程師加班才是王道,機(jī)器成本并不是特別值錢。

    4 反爬的三個方向

    • 基于身份識別進(jìn)行反爬

    • 基于爬蟲行為進(jìn)行反爬

    • 基于數(shù)據(jù)加密進(jìn)行反爬

    5 常見基于身份識別進(jìn)行反爬

    1 通過headers字段來反爬

    headers中有很多字段,這些字段都有可能會被對方服務(wù)器拿過來進(jìn)行判斷是否為爬蟲

    1.1 通過headers中的User-Agent字段來反爬

    • 反爬原理:爬蟲默認(rèn)情況下沒有User-Agent,而是使用模塊默認(rèn)設(shè)置
    • 解決方法:請求之前添加User-Agent即可;更好的方式是使用User-Agent池來解決(收集一堆User-Agent的方式,或者是隨機(jī)生成User-Agent)

    1.2 通過referer字段或者是其他字段來反爬

    • 反爬原理:爬蟲默認(rèn)情況下不會帶上referer字段,服務(wù)器端通過判斷請求發(fā)起的源頭,以此判斷請求是否合法
    • 解決方法:添加referer字段

    1.3 通過cookie來反爬

    • 反爬原因:通過檢查cookies來查看發(fā)起請求的用戶是否具備相應(yīng)權(quán)限,以此來進(jìn)行反爬
    • 解決方案:進(jìn)行模擬登陸,成功獲取cookies之后在進(jìn)行數(shù)據(jù)爬取

    2 通過請求參數(shù)來反爬

    請求參數(shù)的獲取方法有很多,向服務(wù)器發(fā)送請求,很多時候需要攜帶請求參數(shù),通常服務(wù)器端可以通過檢查請求參數(shù)是否正確來判斷是否為爬蟲

    2.1 通過從html靜態(tài)文件中獲取請求數(shù)據(jù)(github登錄數(shù)據(jù))

    • 反爬原因:通過增加獲取請求參數(shù)的難度進(jìn)行反爬
    • 解決方案:仔細(xì)分析抓包得到的每一個包,搞清楚請求之間的聯(lián)系

    2.2 通過發(fā)送請求獲取請求數(shù)據(jù)

    • 反爬原因:通過增加獲取請求參數(shù)的難度進(jìn)行反爬
    • 解決方案:仔細(xì)分析抓包得到的每一個包,搞清楚請求之間的聯(lián)系,搞清楚請求參數(shù)的來源

    2.3 通過js生成請求參數(shù)

    • 反爬原理:js生成了請求參數(shù)
    • 解決方法:分析js,觀察加密的實(shí)現(xiàn)過程,通過js2py獲取js的執(zhí)行結(jié)果,或者使用selenium來實(shí)現(xiàn)

    2.4 通過驗(yàn)證碼來反爬

    • 反爬原理:對方服務(wù)器通過彈出驗(yàn)證碼強(qiáng)制驗(yàn)證用戶瀏覽行為
    • 解決方法:打碼平臺或者是機(jī)器學(xué)習(xí)的方法識別驗(yàn)證碼,其中打碼平臺廉價(jià)易用,更值得推薦

    6 常見基于爬蟲行為進(jìn)行反爬

    1 基于請求頻率或總請求數(shù)量

    爬蟲的行為與普通用戶有著明顯的區(qū)別,爬蟲的請求頻率與請求次數(shù)要遠(yuǎn)高于普通用戶

    1.1 通過請求ip/賬號單位時間內(nèi)總請求數(shù)量進(jìn)行反爬

    • 反爬原理:正常瀏覽器請求網(wǎng)站,速度不會太快,同一個ip/賬號大量請求了對方服務(wù)器,有更大的可能性會被識別為爬蟲
    • 解決方法:對應(yīng)的通過購買高質(zhì)量的ip的方式能夠解決問題/購買個多賬號

    1.2 通過同一ip/賬號請求之間的間隔進(jìn)行反爬

    • 反爬原理:正常人操作瀏覽器瀏覽網(wǎng)站,請求之間的時間間隔是隨機(jī)的,而爬蟲前后兩個請求之間時間間隔通常比較固定同時時間間隔較短,因此可以用來做反爬
    • 解決方法:請求之間進(jìn)行隨機(jī)等待,模擬真實(shí)用戶操作,在添加時間間隔后,為了能夠高速獲取數(shù)據(jù),盡量使用代理池,如果是賬號,則將賬號請求之間設(shè)置隨機(jī)休眠

    1.3 通過對請求ip/賬號每天請求次數(shù)設(shè)置閾值進(jìn)行反爬

    • 反爬原理:正常的瀏覽行為,其一天的請求次數(shù)是有限的,通常超過某一個值,服務(wù)器就會拒絕響應(yīng)
    • 解決方法:對應(yīng)的通過購買高質(zhì)量的ip的方法/多賬號,同時設(shè)置請求間隨機(jī)休眠

    2 根據(jù)爬取行為進(jìn)行反爬,通常在爬取步驟上做分析

    2.1 通過js實(shí)現(xiàn)跳轉(zhuǎn)來反爬

    • 反爬原理:js實(shí)現(xiàn)頁面跳轉(zhuǎn),無法在源碼中獲取下一頁url
    • 解決方法: 多次抓包獲取條狀url,分析規(guī)律

    2.2 通過蜜罐(陷阱)獲取爬蟲ip(或者代理ip),進(jìn)行反爬

    • 反爬原理:在爬蟲獲取鏈接進(jìn)行請求的過程中,爬蟲會根據(jù)正則,xpath,css等方式進(jìn)行后續(xù)鏈接的提取,此時服務(wù)器端可以設(shè)置一個陷阱url,會被提取規(guī)則獲取,但是正常用戶無法獲取,這樣就能有效的區(qū)分爬蟲和正常用戶
    • 解決方法: 完成爬蟲的編寫之后,使用代理批量爬取測試/仔細(xì)分析響應(yīng)內(nèi)容結(jié)構(gòu),找出頁面中存在的陷阱

    2.3 通過假數(shù)據(jù)反爬

    • 反爬原理:向返回的響應(yīng)中添加假數(shù)據(jù)污染數(shù)據(jù)庫,通常家屬劇不會被正常用戶看到
    • 解決方法: 長期運(yùn)行,核對數(shù)據(jù)庫中數(shù)據(jù)同實(shí)際頁面中數(shù)據(jù)對應(yīng)情況,如果存在問題/仔細(xì)分析響應(yīng)內(nèi)容

    2.4 阻塞任務(wù)隊(duì)列

    • 反爬原理:通過生成大量垃圾url,從而阻塞任務(wù)隊(duì)列,降低爬蟲的實(shí)際工作效率
    • 解決方法: 觀察運(yùn)行過程中請求響應(yīng)狀態(tài)/仔細(xì)分析源碼獲取垃圾url生成規(guī)則,對URL進(jìn)行過濾

    2.5 阻塞網(wǎng)絡(luò)IO

    • 反爬原理:發(fā)送請求獲取響應(yīng)的過程實(shí)際上就是下載的過程,在任務(wù)隊(duì)列中混入一個大文件的url,當(dāng)爬蟲在進(jìn)行該請求時將會占用網(wǎng)絡(luò)io,如果是有多線程則會占用線程
    • 解決方法: 觀察爬蟲運(yùn)行狀態(tài)/多線程對請求線程計(jì)時/發(fā)送請求錢

    2.6 運(yùn)維平臺綜合審計(jì)

    • 反爬原理:通過運(yùn)維平臺進(jìn)行綜合管理,通常采用復(fù)合型反爬蟲策略,多種手段同時使用
    • 解決方法: 仔細(xì)觀察分析,長期運(yùn)行測試目標(biāo)網(wǎng)站,檢查數(shù)據(jù)采集速度,多方面處理

    7 常見基于數(shù)據(jù)加密進(jìn)行反爬

    1 對響應(yīng)中含有的數(shù)據(jù)進(jìn)行特殊化處理

    通常的特殊化處理主要指的就是css數(shù)據(jù)偏移/自定義字體/數(shù)據(jù)加密/數(shù)據(jù)圖片/特殊編碼格式等

    1.1 通過自定義字體來反爬
    下圖來自貓眼電影電腦版

    - 反爬思路: 使用自有字體文件 - 解決思路:切換到手機(jī)版/解析字體文件進(jìn)行翻譯

    1.2 通過css來反爬
    下圖來自貓眼去哪兒電腦版

    - 反爬思路:源碼數(shù)據(jù)不為真正數(shù)據(jù),需要通過css位移才能產(chǎn)生真正數(shù)據(jù) - 解決思路:計(jì)算css的偏移

    1.3 通過js動態(tài)生成數(shù)據(jù)進(jìn)行反爬

    • 反爬原理:通過js動態(tài)生成
    • 解決思路:解析關(guān)鍵js,獲得數(shù)據(jù)生成流程,模擬生成數(shù)據(jù)

    1.4 通過數(shù)據(jù)圖片化反爬

    • 58同城短租](https://baise.58.com/duanzu/38018718834984x.shtml)
    • 解決思路:通過使用圖片解析引擎從圖片中解析數(shù)據(jù)

    1.5 通過編碼格式進(jìn)行反爬

    • 反爬原理: 不適用默認(rèn)編碼格式,在獲取響應(yīng)之后通常爬蟲使用utf-8格式進(jìn)行解碼,此時解碼結(jié)果將會是亂碼或者報(bào)錯
    • 解決思路:根據(jù)源碼進(jìn)行多格式解碼,或者真正的解碼格式

    小結(jié)

    • 掌握 常見的反爬手段、原理以及應(yīng)對思路

    總結(jié)

    以上是生活随笔為你收集整理的python网络爬虫系列(八)——常见的反爬手段和解决方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。