復制瀏覽器的請求數據產生的問題
在爬取某網站時,我們習慣於直接在瀏覽器里復制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+的版本
