web-dev-qa-db-ja.com

Python-POST 3 urllibを使用してPythonリクエストを作成します

次のページにPOSTリクエストをしようとしています: http://search.cpsa.ca/PhysicianSearch

ページにデータを追加するフォームに入力せずに「検索」ボタンをクリックすることをシミュレートするため。 POST開発者ツールの[ネットワーク]タブを見ながらボタンをクリックしてchromeヘッダー情報を取得しました。他の同様の問題からソリューションをコピーするのではなく、これを投稿する理由は、正しいヘッダー情報を取得できなかった可能性があるためです。適切にフォーマットされており、正しい情報を取得しましたか?以前にPOSTリクエストを行ったことはありません。

これは私が一緒につなぎ合わせたものです:

import urllib.parse
import urllib.request


data = urllib.parse.urlencode({'Host': 'search.cpsa.ca', 'Connection': 'keep-alive', 'Content-Length': 23796,
                                     'Origin': 'http://search.cpsa.ca', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
                                     'Cahce-Control': 'no-cache', 'X-Requested-With': 'XMLHttpRequest',
                                     'X-MicrosoftAjax': 'Delta=true', 'Accept': '*/*',
                                     'Referer': 'http://search.cpsa.ca/PhysicianSearch',
                                     'Accept-Encoding': 'gzip, deflate',
                                     'Accept-Language': 'en-GB,en-US;q=0.8,en;q=0.6',
                                     'Cookie': 'ASP.NET_SessionId=kcwsgio3dchqjmyjtwue402c; _ga=GA1.2.412607756.1459536682; _gat=1'})


url = "http://www.musi-cal.com/cgi-bin/query?%s"

data = data.encode('ascii')
with urllib.request.urlopen("http://search.cpsa.ca/PhysicianSearch", data) as f:
    print(f.read().decode('utf-8'))

このソリューションはページのHTMLを出力しますが、POSTリクエストから取得したいデータは出力しません。

12

これがあなたのやり方です。

from urllib import request, parse
data = parse.urlencode(<your data dict>).encode()
req =  request.Request(<your url>, data=data) # this will make the method "POST"
resp = request.urlopen(req)
49
C Panda

Cパンダありがとうございます。あなたは本当に私がこのモジュールを学ぶのを簡単にしてくれました。

私が渡した辞書は私のためにエンコードしないでリリースしました。私は小さな変更をしなければなりませんでした-

from urllib import request, parse
import json

# Data dict
data = { 'test1': 10, 'test2': 20 }

# Dict to Json
# Difference is { "test":10, "test2":20 }
data = json.dumps(data)

# Convert to String
data = str(data)

# Convert string to byte
data = data.encode('utf-8')

# Post Method is invoked if data != None
req =  request.Request(<your url>, data=data)

# Response
resp = request.urlopen(req)
9
Centos Newbie

上記のコードは、多くの問題を引き起こした余分な\ "を含むJSON文字列をエンコードしました。これは、より良い方法のように見えます。

from urllib import request, parse

url = "http://www.example.com/page"

data = {'test1': 10, 'test2': 20}
data = parse.urlencode(data).encode()

req = request.Request(url, data=data)
response = request.urlopen(req)

print (response.read())
3
iphaaw