2016-04-07 10 views
2

を使用してPOSTリクエストを行います、フォームのいずれかを記入せずに「検索」ボタンをクリックしてシミュレートするためにhttp://search.cpsa.ca/PhysicianSearchPythonの - 私は、次のページへのPOSTリクエストしようとしていますPythonの3 urllibは

をページにデータを追加します。 Chromeの開発者ツールのネットワークタブを見ながら、ボタンをクリックしてPOSTヘッダー情報を取得しました。他の同様の問題からソリューションをコピーするのではなく、私がこれを投稿している理由は、正しいヘッダー情報が得られていない可能性があるということです。正しくフォーマットされていて、適切な情報を取得しましたか?私は前に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')) 

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

+0

POSTデータは、送信するフォームの入力要素の名前属性と値に対応する必要があります。フォームのhtmlを調べることで、名前属性を取り出すことができます。要求ヘッダーをPOSTデータとして使用しています。これは動作しません。また、リクエストpackage(http://docs.python-requests.org/ja/master/)を使用することを検討してください。これはurllib2よりも面白いです。 – snakecharmerb

+0

フォームを指定するにはどうすればよいですか?または、データを指定するキーと値のペアが必要ですか? –

+0

クロムでは、先ほどと同じように、ネットワークタブのPOSTリクエストを見て、ヘッダタブの一番下に行くと、POSTリクエストであるか、クエリパラメータであるGETリクエストであるかの名前と値が表示されます – snakecharmerb

答えて

22

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

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) 
0

ありがとう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)