今天不管如何都要留下一些什麼東西。。。javascript
能夠說今天學到一個新的一個東西,也須要分享出來,給更多的人去使用。java
今天爬取的數據裏面是客戶端向服務器端發送加密過的token和一些頁碼之類的一個數據。(我主要是想經過翻頁獲取每一頁的數據,該網頁是經過post去獲取的請求,因此須要帶一堆的嵾數纔會出來數據)。json
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',
}app
d=requests.post(url,data=payload,headers=headers)curl
print(d)post
而後服務器報錯,可是同樣的數據在filder裏面倒是對的,這是什麼緣由呢?編碼
後來經過requests的官方文檔發現,有這麼一句話:加密
不少時候你想要發送的數據並不是編碼爲表單形式的。若是你傳遞一個 string
而不是一個 dict
,那麼數據會被直接發佈出去。url
經過抓包軟件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錯誤,開始還去找這是什麼緣由,後來在網上看到是這樣子說的:
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之類的呢,看來東西須要不斷的去發現的 。