日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Python爬蟲遇到Request-Payload怎么辦?

系統(tǒng) 1909 0

前言

最近想用 Python 自動地爬取某個站點里的圖片,沒想到其請求數(shù)據(jù)是以 request payload 格式傳輸給后端進(jìn)行處理的。博主還是第一次遇到這種情況,寫下這篇文章記錄一下解決過程。

博主瀏覽器使用的是 Chrome,下文說的瀏覽器一律指的是 Chrome瀏覽器。

POST提交數(shù)據(jù)常見的幾種Content-Type

在網(wǎng)絡(luò)請求中常用的Content-Type有很多,但是在POST請求下我們常用的Content-Type大約有3種。

1.application/x-www-form-urlencoded

這應(yīng)該是我們最常見到的POST數(shù)據(jù)提交方式,原生的表單默認(rèn)提交方式就是這個,

我用站長工具模擬原生的POST請求,如圖1-1:

Python爬蟲遇到Request-Payload怎么辦?_第1張圖片

圖1-1

第一個紅框可以看到請求的 Content-Type 確實是 application/x-www-form-urlencoded ,第二個紅框展示的是向后端請求的數(shù)據(jù),它是經(jīng)過瀏覽器解碼然后展示給我們看的,實際上數(shù)據(jù)編碼格式如圖1-2:

圖1-2

可以看到,我們請求的數(shù)據(jù)變成了鍵值對的形式,并且中間用 & 分隔,形如 key1=val1&key2=val2 。

2.multipart/form-data

使用表單傳數(shù)文件時,Content-Type必須是 multipart/form-data ,傳輸?shù)奈募环指畛啥鄠€部分,每部分使用–boundary分割。

大體如圖2-1:

圖2-1

第二個紅框數(shù)據(jù)也是經(jīng)過瀏覽器解碼的,原始數(shù)據(jù)如圖2-2:

圖2-2

3.application/json

一般情況下,我們遇到的POST請求數(shù)據(jù)編碼格式都是 application/x-www-form-urlencoded ,但是這種格式有局限性,如果想向后端傳輸復(fù)雜的數(shù)據(jù),如:

            
              
                {
              
              
                "info"
              
              
                :
              
              
                [
              
              
                {
              
              
                "name"
              
              
                :
              
              
                "Kelvin"
              
              
                ,
              
              
                "age"
              
              
                :
              
              
                18
              
              
                }
              
              
                ]
              
              
                }
              
            
          

這個時候,采用 application/x-www-form-urlencoded 對數(shù)據(jù)進(jìn)行編碼的話,就不是很方便。

對于像這種復(fù)雜的數(shù)據(jù),一般都是以json格式直接傳給后端進(jìn)行解析。

博主在爬蟲時遇到的就是 Content-Type:application/json 的情況,如圖3-1:

圖3-1

第二個紅框也不像前兩個一樣是 Form Data 而是變成了 Request Payload ,其中的數(shù)據(jù)也是經(jīng)過瀏覽器解析的,原始數(shù)據(jù)如圖3-2:

圖3-2

圖3-2

可以看出來,數(shù)據(jù)確實是以json格式進(jìn)行傳輸?shù)摹?

如果我們想模擬這種請求,如下代碼是不行的:

            
              
                import
              
               requests


headers 
              
                =
              
              
                {
              
              
                'Content-Type'
              
              
                :
              
              
                'application/json'
              
              
                ,
              
              
                .
              
              
                .
              
              
                .
              
              
                .
              
              
                .
              
              
                .
              
              
                }
              
              

data 
              
                =
              
              
                {
              
              
                "n"
              
              
                :
              
              
                "測試logo"
              
              
                ,
              
              
                "s"
              
              
                :
              
              
                "TEST LOGO"
              
              
                ,
              
              
                "descr"
              
              
                :
              
              
                "this is demo"
              
              
                ,
              
              
                "data"
              
              
                :
              
              
                [
              
              
                ]
              
              
                ,
              
              
                "p"
              
              
                :
              
              
                1
              
              
                ,
              
              
                "dataPage"
              
              
                :
              
              
                0
              
              
                ,
              
              
                "icon_lists"
              
              
                :
              
              
                [
              
              
                ]
              
              
                ,
              
              
                "icon_page"
              
              
                :
              
              
                1
              
              
                }
              
              

url 
              
                =
              
              
                'https://www.logosc.cn/api/getAllInfo'
              
              
response 
              
                =
              
               requests
              
                .
              
              post
              
                (
              
              url
              
                =
              
              url
              
                ,
              
               data
              
                =
              
              data
              
                ,
              
               headers
              
                =
              
              headers
              
                )
              
              
                print
              
              
                (
              
              response
              
                .
              
              json
              
                (
              
              
                )
              
              
                )
              
            
          

根據(jù)請求的URL不同,報錯信息也會一樣,但無一例外的請求失敗,如圖3-3:

圖3-3

遇到Request Payload的解決辦法

碰到問題,我們首先求助的應(yīng)該是官方文檔,文檔建議如下圖4-1:

Python爬蟲遇到Request-Payload怎么辦?_第2張圖片

圖4-1

官方提供了兩種方法讓我們以 application/json 格式編碼數(shù)據(jù)進(jìn)行傳輸。

1.使用json.dumps()方法

json.dumps()方法將字典數(shù)據(jù)轉(zhuǎn)化成json類型然后傳給data參數(shù),代碼如下:

            
              
                import
              
               requests

              
                import
              
               json

 headers 
              
                =
              
              
                {
              
              
                'Content-Type'
              
              
                :
              
              
                'application/json'
              
              
                ,
              
              
                .
              
              
                .
              
              
                .
              
              
                .
              
              
                .
              
              
                .
              
              
                }
              
              
 data 
              
                =
              
              
                {
              
              
                "n"
              
              
                :
              
              
                "測試logo"
              
              
                ,
              
              
                "s"
              
              
                :
              
              
                "TEST LOGO"
              
              
                ,
              
              
                "descr"
              
              
                :
              
              
                "this is demo"
              
              
                ,
              
              
                "data"
              
              
                :
              
              
                [
              
              
                ]
              
              
                ,
              
              
                "p"
              
              
                :
              
              
                1
              
              
                ,
              
              
                "dataPage"
              
              
                :
              
              
                0
              
              
                ,
              
              
                "icon_lists"
              
              
                :
              
              
                [
              
              
                ]
              
              
                ,
              
              
                "icon_page"
              
              
                :
              
              
                1
              
              
                }
              
              
 url 
              
                =
              
              
                'https://www.logosc.cn/api/getAllInfo'
              
              
 response 
              
                =
              
               requests
              
                .
              
              post
              
                (
              
              url
              
                =
              
              url
              
                ,
              
               data
              
                =
              
              json
              
                .
              
              dumps
              
                (
              
              data
              
                )
              
              
                ,
              
               headers
              
                =
              
              headers
              
                )
              
              
                print
              
              
                (
              
              response
              
                .
              
              json
              
                (
              
              
                )
              
              
                )
              
            
          

2.將數(shù)據(jù)傳給json參數(shù)

requests.post方法里有個json參數(shù),當(dāng)我們把數(shù)據(jù)傳給json參數(shù)時,Content-Type會被自動的設(shè)置成application/json,代碼如下:

            
              
                import
              
               requests
 headers 
              
                =
              
              
                {
              
              
                'Content-Type'
              
              
                :
              
              
                'application/json'
              
              
                ,
              
              
                .
              
              
                .
              
              
                .
              
              
                .
              
              
                .
              
              
                .
              
              
                }
              
              
 data 
              
                =
              
              
                {
              
              
                "n"
              
              
                :
              
              
                "測試logo"
              
              
                ,
              
              
                "s"
              
              
                :
              
              
                "TEST LOGO"
              
              
                ,
              
              
                "descr"
              
              
                :
              
              
                "this is demo"
              
              
                ,
              
              
                "data"
              
              
                :
              
              
                [
              
              
                ]
              
              
                ,
              
              
                "p"
              
              
                :
              
              
                1
              
              
                ,
              
              
                "dataPage"
              
              
                :
              
              
                0
              
              
                ,
              
              
                "icon_lists"
              
              
                :
              
              
                [
              
              
                ]
              
              
                ,
              
              
                "icon_page"
              
              
                :
              
              
                1
              
              
                }
              
              
 url 
              
                =
              
              
                'https://www.logosc.cn/api/getAllInfo'
              
              
 response 
              
                =
              
               requests
              
                .
              
              post
              
                (
              
              url
              
                =
              
              url
              
                ,
              
               json
              
                =
              
              data
              
                ,
              
               headers
              
                =
              
              headers
              
                )
              
              
                print
              
              
                (
              
              response
              
                .
              
              json
              
                (
              
              
                )
              
              
                )
              
            
          

結(jié)尾語

今天又爬出了一個小坑,很是開心,如果本文對你有所幫助,歡迎關(guān)注下方公眾號「猿天罡」,不定期更新Python和算法相關(guān)的文章。see you!
Python爬蟲遇到Request-Payload怎么辦?_第3張圖片


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!?。?/p>

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 广德县| 洪泽县| 岢岚县| 灌云县| 荥经县| 英超| 建水县| 四会市| 新田县| 应城市| 修武县| 旅游| 许昌市| 昂仁县| 滦平县| 金山区| 新巴尔虎右旗| 峨眉山市| 晋州市| 孟津县| 会理县| 象州县| 焉耆| 万全县| 瑞安市| 平和县| 南溪县| 麻江县| 莎车县| 温宿县| 吴忠市| 高邑县| 三江| 开平市| 突泉县| 富平县| 东源县| 务川| 即墨市| 库尔勒市| 邹平县|