欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python requests發(fā)送post請(qǐng)求的一些疑點(diǎn)

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

前言

在Python爬蟲(chóng)中,使用requests發(fā)送請(qǐng)求,訪問(wèn)指定網(wǎng)站,是常見(jiàn)的做法。一般是發(fā)送GET請(qǐng)求或者POST請(qǐng)求,對(duì)于GET請(qǐng)求沒(méi)有什么好說(shuō)的,而發(fā)送POST請(qǐng)求,有很多朋友不是很清楚,主要是因?yàn)槿菀谆煜?POST提交的方式 。今天在微信交流群里,就有朋友遇到了這種問(wèn)題,特地講解一下。

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

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

下面使用requests來(lái)發(fā)送上述三種編碼的POST請(qǐng)求。

1.提交Form表單

requests提交Form表單,一般存在于網(wǎng)站的登錄,用來(lái)提交用戶名和密碼。以http://httpbin.org/post 為例,在requests中,以form表單形式發(fā)送post請(qǐng)求,只需要將請(qǐng)求的參數(shù)構(gòu)造成一個(gè)字典,然后傳給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)站可以顯示你提交請(qǐng)求的內(nèi)容,大家注意一下輸出的"Content-Type":"application/x-www-form-urlencoded",證明這是提交Form的方式。大家在登錄一個(gè)網(wǎng)站時(shí),可以觀察一下Content-Type是什么。

2.提交json串

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

下面把請(qǐng)求頭和請(qǐng)求實(shí)體列舉一下:

 

一些初學(xué)者根據(jù)請(qǐng)求頭寫(xiě)爬蟲(chóng),就會(huì)犯requests的使用錯(cuò)誤。

錯(cuò)誤寫(xiě)法

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)

打印的內(nèi)容如下:

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

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

答案在于,你的請(qǐng)求實(shí)體的格式錯(cuò)了,服務(wù)端無(wú)法解碼。

正確寫(xiě)法1

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

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

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

{"success":true,"errorCode":1000000,"errorMsg":null,"result":{"total":2271278,"goodsList":[{"goodsId":998422995,"goodsName":"【4液+1器】皎潔電熱蚊香液 孕婦寶寶驅(qū)蚊兒童嬰無(wú)味防蚊液體","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},
...

正確寫(xiě)法2

處理將data主動(dòng)編碼為json發(fā)送之外,requests還提供了一個(gè)json參數(shù),自動(dòng)使用json方式發(fā)送,而且在請(qǐng)求頭中也不用顯示聲明'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.上傳文件

上傳文件在爬蟲(chóng)中使用的很少,不過(guò)還是使用requests講解一下使用方式。Content-Type類(lèi)型為multipart/form-data,以multipart形式發(fā)送post請(qǐng)求,只需將一文件傳給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)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 在Python中執(zhí)行異常處理的基本步驟

    在Python中執(zhí)行異常處理的基本步驟

    異常處理是編寫(xiě)健壯、可靠和易于調(diào)試的Python代碼中不可或缺的一部分,下面這篇文章主要給大家介紹了關(guān)于在Python中執(zhí)行異常處理的基本步驟,需要的朋友可以參考下
    2024-08-08
  • Python數(shù)據(jù)分析庫(kù)pandas高級(jí)接口dt的使用詳解

    Python數(shù)據(jù)分析庫(kù)pandas高級(jí)接口dt的使用詳解

    這篇文章主要介紹了Python數(shù)據(jù)分析庫(kù)pandas高級(jí)接口dt的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Python?6種基本變量操作技巧總結(jié)

    Python?6種基本變量操作技巧總結(jié)

    這篇文章主要為大家總結(jié)了Python必備的6種基本變量操作技巧,文中通過(guò)圖片合示例詳細(xì)為大家進(jìn)行了介紹,感興趣的小伙伴可以了解一下
    2022-03-03
  • Python中的單繼承與多繼承實(shí)例分析

    Python中的單繼承與多繼承實(shí)例分析

    這篇文章主要介紹了Python中的單繼承與多繼承,結(jié)合實(shí)例詳細(xì)分析了Python面向?qū)ο蟪绦蛟O(shè)計(jì)中單繼承與多繼承的概念、原理、實(shí)現(xiàn)方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2018-05-05
  • python列表逆序排列的4種方法

    python列表逆序排列的4種方法

    python中的列表是可以直接進(jìn)行逆序排列的,本文主要介紹了python列表逆序排列的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2023-05-05
  • Python標(biāo)準(zhǔn)庫(kù)筆記struct模塊的使用

    Python標(biāo)準(zhǔn)庫(kù)筆記struct模塊的使用

    這篇文章主要介紹了Python標(biāo)準(zhǔn)庫(kù)筆記struct模塊的使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • pycharm+django創(chuàng)建一個(gè)搜索網(wǎng)頁(yè)實(shí)例代碼

    pycharm+django創(chuàng)建一個(gè)搜索網(wǎng)頁(yè)實(shí)例代碼

    這篇文章主要介紹了pycharm+django創(chuàng)建一個(gè)搜索網(wǎng)頁(yè)實(shí)例代碼,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • 快速上手Python Kafka庫(kù)安裝攻略

    快速上手Python Kafka庫(kù)安裝攻略

    想要在Python中使用Kafka庫(kù)嗎?不用擔(dān)心,我們的安裝指南將幫助你快速上手,無(wú)論你是初學(xué)者還是有經(jīng)驗(yàn)的開(kāi)發(fā)者,這篇指南都能滿足你的需求,跟著我們一起來(lái)探索如何輕松安裝Python Kafka庫(kù)吧!
    2023-12-12
  • Pytorch使用MNIST數(shù)據(jù)集實(shí)現(xiàn)基礎(chǔ)GAN和DCGAN詳解

    Pytorch使用MNIST數(shù)據(jù)集實(shí)現(xiàn)基礎(chǔ)GAN和DCGAN詳解

    今天小編就為大家分享一篇Pytorch使用MNIST數(shù)據(jù)集實(shí)現(xiàn)基礎(chǔ)GAN和DCGAN詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-01-01
  • pycharm: 恢復(fù)(reset) 誤刪文件的方法

    pycharm: 恢復(fù)(reset) 誤刪文件的方法

    今天小編就為大家分享一篇pycharm: 恢復(fù)(reset) 誤刪文件的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10

最新評(píng)論