python爬蟲 - 反爬之關於headers頭的accept-encoding的問題


復制瀏覽器的請求數據產生的問題

 

在爬取某網站時,我們習慣於直接在瀏覽器里復制headers和請求參數,粘貼到自己的代碼里進行調試

 

 

 

 

 

 對了這個也是用的httpx處理的,因為這個網站跟上一篇 python爬蟲 - 爬蟲之針對http2.0的某網站爬取 - 修復版   是同一個網站

 

但是,在爬取某網站時網站時,發現了一個問題:

 

 

 

 

 

 

解碼失敗

運行:

 

 

無論怎么調試,就是說解碼失敗

 

后面發現是請求頭里的'accept-encoding': 'gzip, deflate, br'

 

關鍵點

 

把其中的br刪除掉就可以正常拿到數據:

 

 

 

 

 

 

 

有關accpt-encoding的,可以看這篇博客:

 

 

https://blog.csdn.net/weixin_40414337/article/details/88561066

 

精簡的意思就是,accpet-encoding的作用是以客戶端的身份告訴服務端,我支持那些數據壓縮類型的,如果指定的話,服務端就會按指定好的格式返回,如果不指定的話就會不壓縮,而以源數據返回

其中gzip和deflare兩種類型的壓縮,requests和httpx等主流的爬蟲庫都是可以自己解壓縮數據的,而就是br不行,因為br是目前來說比較新的一種數據壓縮格式,無損壓縮,壓縮比極高,比前兩個都好,進而減少傳輸數據的大小,節省時間,所以目前的都支持br,瀏覽器也自然支持的,這就是問題所在

 

這也就是我上面把br刪了就可以正常解析的原因

 

直面問題並解決

 

另外,針對br的,假如有的網站就支持br呢?咋辦?   所以在代碼層面也是要解決的,而不是逃避問題的把br刪除掉

 

解決辦法就是需要用brotli庫(第三方庫,需要安裝)來解壓,上面的博客里的案例

 

 

 

 

安裝完brotli后執行:

 

 

那么,用這種brotli壓縮還可以一定程度上達到反爬的效果,反正如果不知道這個的話,拿到返回的數據后你用各種編碼方式(utf-8,gbk,gb18030,bt5)啥啥的,怎么解碼都解不了,是不是可以防止一些初級的爬蟲了啊

 

20211028補充

 

據悉,requests最新版已經支持br的解析,但只支持python3.7+的版本

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM