次のページに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リクエストから取得したいデータは出力しません。
これがあなたのやり方です。
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)
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)
上記のコードは、多くの問題を引き起こした余分な\ "を含む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())