ポストリクエストを送るPythonリクエストに関する疑問

1 Star2 Stars3 Stars4 Stars5 Stars (まだ評価されていません)
Loading...

序文

Pythonクローラーでは、要求を使用して特定のWebサイトにアクセスする要求を送信するのが一般的です。 一般的には、GET要求やPOST要求が送信されます.GET要求については何も言わず、POST要求が送信されます。POSTを送信する方法を混同やすいため、多くの友人はあまり明確ではありません。 今日、WeChatの交換グループでは、この種の問題に遭遇した友人がいます。

HTTPプロトコルでは、投稿によって提出されたデータはメッセージの本文に配置されなければならないが、プロトコルはどの符号化方法を使用しなければならないかを指定しない。 サーバーは、要求ヘッダーのContent-Typeフィールドに従って、要求内のメッセージ本文がどのようにエンコードされているかを認識してから、メッセージ本文を解析します。 具体的なコーディング方法には次のものがあります。

Application / x-www-form-urlencoded:フォームの形式でデータを提出します。最も一般的で最もよく知られています。
Application / json:json文字列でデータを送信します。

以下は、上記の3つのエンコードされたPOSTリクエストを送信する要求を使用しています。

1.フォームフォームを送信する

通常、Webサイトのログインフォームフォームを送信するリクエストは、ユーザー名とパスワードの送信に使用されました。 http://httpbin.org/postを例に取ってください。リクエストでは、フォームフォームとして投稿リクエストを送信します。リクエストパラメータを辞書に作成し、それをrequests.post()のdataパラメータに渡すだけです。 コードは次のとおりです。


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

出力は次のとおりです。

{
"args":{}、
"data": ""、
"ファイル":{}、
"form":{"key1": "value1"、 "key2": "value2"}、
"ヘッダー":{"Accept": "* / *"、 "Accept-Encoding": "gzip、deflate"、
"接続": "閉じる"、
"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のウェブサイトでは、リクエストの内容を表示することができます。 "Content-Type"の出力に注意してください: "application / x-www-form-urlencoded"、これはフォームを送信する方法であることを証明します。 Webサイトにログインすると、Content-Typeの内容を確認できます。

2. json文字列を送信する

json文字列を送信するために、主にajaxリクエストを送信し、データを動的にロードするために使用されます。 例えば、多くのウェブサイトを例に取ると、商品を積み込む方法はajaxであり、製品の内容は応答しています。

リクエストヘッダとリクエストエンティティをリストアップしましょう:

いくつかの初心者は、要求に基づいて爬虫類を書き、要求の使用に間違いを起こします。

間違った文章


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)

印刷内容は次のとおりです。

{"成功":false、 "errorCode":4000000、 "errorMsg": "システムエラー"、 "結果":null}

エラーが返されましたが、私は理解できませんが、リクエストヘッダーは私の 'Content-Type'と一致しています: 'application / json; charset = UTF-8'が追加されました。

答えは、リクエストエンティティの形式が間違っていて、サーバーがそれをデコードできないということです。

正しい書込み1

正しいコードは、データをjsonして送信することです。 コードは次のとおりです。


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

このとき、印刷された内容をもう一度見て、製品の内容を正しく返してください。

{"成功":true、 "errorCode":1000000、 "errorMsg":null、 "result":{"合計":2271278、 "goodsList":[{"goodsId":998422995、 "goodsName": "[4液体+1]皎電動電気蚊取線液体妊娠中の女性の赤ちゃんの蚊の忌避の子供赤ちゃんの無臭の抗蚊の液体 "、" goodsImageUrl ":" http://t11img.yangkeduo.com/images/2018-04-12/0292b5e75053dfa748b9762d3f3e74ef.jpeg "、"soldQuantity "couponMinOrderAmount":5000、 "couponDiscount":5000、 "couponTotalQuantity":5000、 "couponMinOrderAmount":5000、 "couponDiscount":5000、 couponRemainQuantity ":3940、" couponStartTime ":1525762800、" couponEndTime ":1527782399、" promotionRate ":280}、

2を修正する

jsonにデータを積極的にエンコードすることに加えて、リクエストはjsonを使用して自動的に送信されるjsonパラメータも提供し、 '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.ファイルをアップロードする

ファイルのアップロードは、クローラではほとんど使用されませんが、使用方法を説明する要求を使用します。 Content-Typeタイプはmultipart / form-dataで、postリクエストはmultipart形式で送信されます。ファイルをrequests.post()のfilesパラメーターに渡すだけです。 またはhttp://httpbin.org/postを例に取ると、コードは次のようになります。


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

1 Star2 Stars3 Stars4 Stars5 Stars (まだ評価されていません)
Loading...
      この投稿は審査処理中  | 元のサイトへ