python爬蟲 - 爬蟲之針對http2.0的某網站爬取 - 修復版


題外話

說明一下為什么叫修復版,我之前發了這篇文章,發現只有我自己能看:

 

這是我自己打開的我的博客首頁:

 

 

 

點進去:

 

 

 

 

這是我換了個瀏覽器之后打開的:

 

 換了個瀏覽器,點進去:

 

 

 

 

 

很奇怪了,所以我就復制內容重新編輯了一份發布了,不去糾結了。

 

 

 

前言

需要網站的,私信我(不玩套路那種)

 

 

 

分析

 

首先打開這個網站,看到由cloudflare,心里戈登一下,不慌,接着看

 

 

 找到接口,查看返回數據

 

 

 

 

拿到數據接口單獨請求會出現如下:

 

 

發現果然有cloundflare檢測

 

 

用火狐瀏覽器打開

 

然后用重放請求功能看看,正常請求

 

 

 

而且能正常拿數據

 

 

 

 那我用postman測試:

 

 

 

 

 

很奇怪的不行

 

 

用代碼測試

 也不行

 

 

 

有朋友說,哎,你這不是有返回數據嗎,仔細看哈,狀態碼時403,那說明返回的也多半不是真實數據,我知道有些確實用403狀態來偽造,其實返回的也是真實數據,但是這種事極少數的情況,而前面我們已經用瀏覽器測試了,確實是200才會返回真實數據

 

你這不覺得很奇怪嗎?瀏覽器正常請求,然后postman和代碼就是不行,而它請求參數里又沒有什么奇怪的參數,也是get請求,都是很簡單的東西 

 

找到關鍵點

 

 這個咋整呢?

 

我們再回去一步一步看看,找到個關鍵的東西:

 

 

 

 

 http2.0啥東西呢?

 

可以看看下面兩個文字參考鏈接:

 

https://mp.weixin.qq.com/s/dFxyRYmqm5if8k-S1MjFJw

https://tding.top/archives/9bd92731.html

 

如果你覺得浪費時間的話,可以看我下面說的,精簡過的:

 

1. 現在很多爬蟲庫其實對 HTTP/2.0 支持得不好,比如大名鼎鼎的 Python 庫 —— requests,到現在為止還只支持 HTTP/1.1,啥時候支持 HTTP/2.0 還不知道。

2.Scrapy 框架最新版本 2.5.0(2021.04.06 發布)加入了對 HTTP/2.0 的支持,但是官網明確提示,現在是實驗性的功能,不推薦用到生產環境

 

 

插一句,Scrapy 中怎么支持 HTTP/2.0 呢?在 settings.py 里面換一下 Download Handlers 即可:

DOWNLOAD_HANDLERS = {
    'https': 'scrapy.core.downloader.handlers.http2.H2DownloadHandler',
}

當前 Scrapy 的 HTTP/2.0 實現的已知限制包括:

  • 不支持 HTTP/2.0 明文(h2c),因為沒有主流瀏覽器支持未加密的 HTTP/2.0。
  • 沒有用於指定最大幀大小大於默認值 16384 的設置,發送更大幀的服務器的連接將失敗。
  • 不支持服務器推送。
  • 不支持bytes_received和 headers_received信號。

關於其他的一些庫,也不必多說了,對 HTTP/2.0 的支持也不好,目前對 HTTP/2.0 支持得還可以的有 hyper 和 httpx,后者更加簡單易用一些

 

nginx也可以配置http2.0的:

if ($server_protocol !~* "HTTP/2.0") {
return 444;
}

 

 

3.目前在python中,支持http2.0的:

  • Hyper
  • Httpx

 

hyper的話,不是很適用,因為很多功能跟requests庫沒法類比,所以這里選用httpx

 

前提需要安裝:

pip install httpx[http2]    # 這樣寫才能裝上支持http2的httpx,不寫的話默認是不支持http2的

 

 

 

使用httpx:

 

配置好后使用,正常拿數據,記得要加http=True的屬性

 

 

 

關於httpx使用socks協議代理問題:

 

 

 

 

https://pypi.org/project/httpx-socks/

 

裝完httpx-scoks庫之后就支持socks協議的代理了,然后正常拿到數據

 

 

 20210603更新

 
太6了,這網站又改了,改成了http3.0的協議了
 
火狐查看:
 

 

 

 

 

谷歌查看:

 

 

 順便一說,谷歌的話,需要右鍵任意一個請求,然后勾選上如下的protocol才會顯示協議版本,不然默認是不會顯示的

 

 

 

 

 不過,我試了,用httpx暫時還是可以拿到數據,也就是上面的那套代碼

 


免責聲明!

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



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