最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python requests發(fā)送post請求的一些疑點

 更新時間:2018年05月20日 15:33:11   作者:七夜的故事  
在Python爬蟲中,使用requests發(fā)送請求,訪問指定網(wǎng)站,是常見的做法,這篇文章主要介紹了Python requests發(fā)送post請求的一些疑點,具有一定的參考價值,感興趣的小伙伴們可以參考一下

前言

在Python爬蟲中,使用requests發(fā)送請求,訪問指定網(wǎng)站,是常見的做法。一般是發(fā)送GET請求或者POST請求,對于GET請求沒有什么好說的,而發(fā)送POST請求,有很多朋友不是很清楚,主要是因為容易混淆 POST提交的方式 。今天在微信交流群里,就有朋友遇到了這種問題,特地講解一下。

在HTTP協(xié)議中,post提交的數(shù)據(jù)必須放在消息主體中,但是協(xié)議中并沒有規(guī)定必須使用什么編碼方式,從而導致了 提交方式 的不同。服務端根據(jù)請求頭中的 Content-Type 字段來獲知請求中的消息主體是用何種方式進行編碼,再對消息主體進行解析。具體的編碼方式包括如下:

  1. application/x-www-form-urlencoded:以form表單形式提交數(shù)據(jù),最常見也是大家最熟悉的
  2.  application/json :以json串提交數(shù)據(jù)。

下面使用requests來發(fā)送上述三種編碼的POST請求。

1.提交Form表單

requests提交Form表單,一般存在于網(wǎng)站的登錄,用來提交用戶名和密碼。以http://httpbin.org/post 為例,在requests中,以form表單形式發(fā)送post請求,只需要將請求的參數(shù)構造成一個字典,然后傳給requests.post()的data參數(shù)即可。代碼如下:

url = 'http://httpbin.org/post'
d = {'key1': 'value1', 'key2': 'value2'}
r = requests.post(url, data=d)
print r.text

輸出效果如下:

{
"args":{},
"data":"",
"files":{},
"form":{"key1":"value1","key2":"value2"},
"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate",
"Connection":"close",
"Content-Length":"23",
"Content-Type":"application/x-www-form-urlencoded",
"Host":"httpbin.org",
"User-Agent":"python-requests/2.12.3"},
"json":null,
"origin":"113.140.11.122",
"url":http://httpbin.org/post}

httpbin.org網(wǎng)站可以顯示你提交請求的內容,大家注意一下輸出的"Content-Type":"application/x-www-form-urlencoded",證明這是提交Form的方式。大家在登錄一個網(wǎng)站時,可以觀察一下Content-Type是什么。

2.提交json串

對于提交json串,主要是用于發(fā)送ajax請求中,動態(tài)加載數(shù)據(jù)。以拼多多網(wǎng)站為例,加載商品的方式為ajax,商品的內容在響應中。

下面把請求頭和請求實體列舉一下:

 

一些初學者根據(jù)請求頭寫爬蟲,就會犯requests的使用錯誤。

錯誤寫法

import requests
__author__ = 'qiye'
__date__ = '2018/5/19 21:59'

url = "http://jinbao.pinduoduo.com/network/api/common/goodsList"
data ={"pageSize":60,"pageNumber":1,"withCoupon":0,"sortType":0}
headers = {
  'Content-Type':'application/json; charset=UTF-8',
  'Host':'jinbao.pinduoduo.com',
  'Origin':'http://jinbao.pinduoduo.com',
  'Referer':'http://jinbao.pinduoduo.com/',
  'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Mobile Safari/537.36',
  'Accept': 'application/json, text/javascript, */*; q=0.01',
}
r = requests.post(url=url,data =data,headers=headers)
print(r.text)

打印的內容如下:

{"success":false,"errorCode":4000000,"errorMsg":"System Error","result":null}

返回出錯了,這時候百思不得其解,請求頭我都保持一致了呀,'Content-Type':'application/json; charset=UTF-8'都加上了,為什么會出錯呀?

答案在于,你的請求實體的格式錯了,服務端無法解碼。

正確寫法1

正確代碼是把data進行json編碼,再發(fā)送。代碼如下:

r = requests.post(url=url,data =json.dumps(data),headers=headers)

這個時候再看一下打印內容,已經(jīng)正確返回商品內容了。

{"success":true,"errorCode":1000000,"errorMsg":null,"result":{"total":2271278,"goodsList":[{"goodsId":998422995,"goodsName":"【4液+1器】皎潔電熱蚊香液 孕婦寶寶驅蚊兒童嬰無味防蚊液體","goodsImageUrl":"http://t11img.yangkeduo.com/images/2018-04-12/0292b5e75053dfa748b9762d3f3e74ef.jpeg","soldQuantity":175,"minGroupPrice":24890,"categoryId":4,"categoryName":"母嬰","hasCoupon":true,"couponMinOrderAmount":5000,"couponDiscount":5000,"couponTotalQuantity":5000,"couponRemainQuantity":3940,"couponStartTime":1526572800,"couponEndTime":1527782399,"promotionRate":280},
...

正確寫法2

處理將data主動編碼為json發(fā)送之外,requests還提供了一個json參數(shù),自動使用json方式發(fā)送,而且在請求頭中也不用顯示聲明'Content-Type':'application/json; charset=UTF-8'。完整代碼如下:

import requests

__author__ = 'qiye'
__date__ = '2018/5/19 21:59'

url = "http://jinbao.pinduoduo.com/network/api/common/goodsList"
data ={"pageSize":60,"pageNumber":1,"withCoupon":0,"sortType":0}
headers = {
  'Host':'jinbao.pinduoduo.com',
  'Origin':'http://jinbao.pinduoduo.com',
  'Referer':'http://jinbao.pinduoduo.com/',
  'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Mobile Safari/537.36',
}
r = requests.post(url=url,json =data,headers=headers)
print(r.text)

3.上傳文件

上傳文件在爬蟲中使用的很少,不過還是使用requests講解一下使用方式。Content-Type類型為multipart/form-data,以multipart形式發(fā)送post請求,只需將一文件傳給requests.post()的files參數(shù)即可。還是以http://httpbin.org/post 為例,代碼如下:

url = 'http://httpbin.org/post'
files = {'file': open('upload.txt', 'rb')}
r = requests.post(url, files=files)
print(r.text)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Python學習之函數(shù)的定義與使用詳解

    Python學習之函數(shù)的定義與使用詳解

    函數(shù)是具有某種特定功能的代碼塊,可以重復使用(在前面數(shù)據(jù)類型相關章節(jié)。它使得我們的程序更加模塊化,不需要編寫大量重復的代碼。本文將詳細介紹Python中函數(shù)的定義與使用,感興趣的可以學習一下
    2022-03-03
  • python分布式計算dispy的使用詳解

    python分布式計算dispy的使用詳解

    今天小編就為大家分享一篇python分布式計算dispy的使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • PyTorch中torch.nn.Linear實例詳解

    PyTorch中torch.nn.Linear實例詳解

    torch.nn是包含了構筑神經(jīng)網(wǎng)絡結構基本元素的包,在這個包中可以找到任意的神經(jīng)網(wǎng)絡層,下面這篇文章主要給大家介紹了關于PyTorch中torch.nn.Linear的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • 基于python的文字轉圖片工具示例詳解

    基于python的文字轉圖片工具示例詳解

    這篇文章主要介紹了基于python的文字轉圖片工具,請求示例是使用?curl?命令請求示例,本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • Python中函數(shù)的返回值示例淺析

    Python中函數(shù)的返回值示例淺析

    這篇文章主要給大家介紹了關于Python中函數(shù)返回值的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Python具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-08-08
  • python3使用PyMysql連接mysql數(shù)據(jù)庫實例

    python3使用PyMysql連接mysql數(shù)據(jù)庫實例

    本篇文章主要介紹了python3使用PyMysql連接mysql數(shù)據(jù)庫實例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • python使用turtle庫繪制奧運五環(huán)

    python使用turtle庫繪制奧運五環(huán)

    turtle也叫海龜,是turtle繪圖體系的python實現(xiàn),這篇文章主要介紹了python使用turtle庫繪制奧運五環(huán),本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2020-02-02
  • python 模擬貸款卡號生成規(guī)則過程解析

    python 模擬貸款卡號生成規(guī)則過程解析

    這篇文章主要介紹了python 模擬貸款卡號生成規(guī)則過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • Python蛇形方陣的實現(xiàn)

    Python蛇形方陣的實現(xiàn)

    本文主要介紹了Python蛇形方陣的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • Python項目跨域問題解決方案

    Python項目跨域問題解決方案

    這篇文章主要介紹了Python項目跨域問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06

最新評論

宁远县| 巴彦淖尔市| 阜新市| 巴林右旗| 永胜县| 巍山| 宜州市| 德惠市| 张家港市| 东丰县| 扎兰屯市| 永清县| 澎湖县| 辽阳市| 西乌珠穆沁旗| 张北县| 和平区| 都兰县| 金秀| 江西省| 武宣县| 凤城市| 环江| 揭东县| 三台县| 鹤岗市| 鄯善县| 定日县| 梁河县| 裕民县| 铅山县| 安新县| 宁远县| 南开区| 遂昌县| 毕节市| 吕梁市| 南城县| 怀安县| 利辛县| 博客|