python實現post請求


今天無論如何都要留下一些什么東西。。。

可以說今天學到一個新的一個東西,也需要分享出來,給更多的人去使用。

今天爬取的數據里面是客戶端向服務器端發送加密過的token和一些頁碼之類的一個數據。(我主要是想通過翻頁獲取每一頁的數據,該網頁是通過post去獲取的請求,所以需要帶一堆的嵾數才會出來數據)。

pyload={"token": "2280d841c47074107bb903169cd78d4d0a1345970ec6380d0909efc7e77a25cb","sign":"700eae16811bd1844e21c31c3ed0f5b0","page":"3","order":"0","limit":"12","map":""}

headers={'Host': 'usedcar.auto.sina.com.cn',
'Connection': 'keep-alive',
'Content-Length': '186',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Origin': 'http://usedcar.auto.sina.com.cn',
'X-Requested-With': 'XMLHttpRequest',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 UBrowser/6.0.1471.813 Safari/537.36',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Referer': 'http://usedcar.auto.sina.com.cn/buycar/s/%E8%AF%B7%E8%BE%93%E5%85%A5%E5%93%81%E7%89%8C%E6%88%96%E8%BD%A6%E5%9E%8B',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.8',
}

d=requests.post(url,data=payload,headers=headers)

print(d)

然后服務器報錯,但是一樣的數據在filder里面卻是對的,這是什么原因呢?

后來通過requests的官方文檔發現,有這么一句話:

很多時候你想要發送的數據並非編碼為表單形式的。如果你傳遞一個 string 而不是一個 dict,那么數據會被直接發布出去。

通過抓包軟件fillder去看看我在pycharm里面請求和在fillder里面請求的東西來看,最后返回來的數據的形式完全就是不一樣了,所以對應正確的格式,我把其轉換為string,得出結果和正確一樣的,

可以正確返回的表單的值是這樣子的:

{"token":"2280d841c47074107bb903169cd78d4d0a1345970ec6380d0909efc7e77a25cb","sign":"700eae16811bd1844e21c31c3ed0f5b0","page":"3","order":"0","limit":"12","map":""}

然后我的目的就是把那些參數化為輸出為上面的數據那樣子。

所以最后形式為以下那樣子:

payload = '{"token":'+' "2280d841c47074107bb903169cd78d4d0a1345970ec6380d0909efc7e77a25cb"'+',"sign":'+'"700eae16811bd1844e21c31c3ed0f5b0"'+',"page":'+'"3"'+',"order":'+'"0"'+',"limit":'+'"12"'+',"map":'+'""'+'}'

接下來發現又是一個很尷尬的事情,服務器直接報錯,504錯誤,開始還去找這是什么原因,后來在網上看到是這樣子說的:

wireshark抓包發現:
用reqeusts和curl發送的數據都是一樣的,但是,curl有帶一個header:"Content-Type": "application/x-www-form-urlencoded"
看來requests也需要加上這個頭:

headers = {"Content-Type": "application/x-www-form-urlencoded"}

最后我把我內容的headers換成以上headers,結果還真的是成功了。

雖然為什么是那個頭,我還真的不知道是什么一個的原因 。后續知道會陸續去更新的。

 

馬上看完文檔發現一個問題,就馬上來記下來,在新的版本的requests里面,除了對dict格式去編碼以外,還可以使用json格式直接去傳遞,然后它就會被自動編碼。這是 2.4.2 版的新加功能:

d=requests.post(url,json=data,headers=headers)
print d
print d.text

總結:這樣子是不是很簡單就可以去實現了呢,而不需要轉換為string之類的呢,看來東西需要不斷的去發現的 。


免責聲明!

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



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