python urllib2を使用してログインアクションをシミュレートしたいのですが、Fiddlerを使用してパケットをキャッチすると、ログインアクションは単なるajaxリクエストであり、ユーザー名とパスワードはjsonデータとして送信されます。しかし、urllib2を使用してjsonデータを送信する方法がわかりません。
import urllib2
import json
# Whatever structure you need to send goes here:
jdata = json.dumps({"username":"...", "password":"..."})
urllib2.urlopen("http://www.example.com/", jdata)
これは、HTTP POSTを使用して、ユーザー名とパスワードを含む単純なjsonオブジェクトを送信していることを前提としています。
次の点に注意してください
Python 3.xでは、urllib
モジュールとurllib2
モジュールが結合になっています。モジュールの名前はurllib
です。したがって、urllib
in Python 2.xとurllib
in Python 3.xは異なるモジュールであることに注意してください。
POST urllib.request.Request
のデータPython 3は文字列を受け入れません(str
)-を渡す必要がありますbytes
オブジェクト(またはbytes
の反復可能)
json
データをPOST in Python 3.x
import urllib.request import json json_dict = {'name': 'some name'、 'value': 'some value'} #json_dictをJSONに変換 json_data = json.dumps(json_dict) #strをバイトに変換(エンコードに問題がないことを確認) post_data = json_data.encode( 'utf-8') #JSONコンテンツタイプheader headers = {} headers [' Content-Type '] =' application/json ' #は、url req = urllib.request.Request(url、post_data、headers)[のリクエストを実行します。 ____。] #リクエストを送信 res = urllib.request.urlopen(req) #resはファイルのようなオブジェクトです #...
最後に、送信するデータがある場合にのみPOSTリクエストを送信できることに注意してください。
データを送信せずにHTTP POSTを実行する場合は、空のdictをデータとして送信する必要があります。
data_dict = {} post_data = json.dumps(data_dict).encode() req = urllib.request.Request(url、post_data) res = urllib.request.urlopen(req)
リクエストに応じてデータを指定できます。
import urllib
import urllib2
url = 'http://example.com/login'
values = YOUR_CREDENTIALS_JSON
data = urllib.urlencode(values)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
the_page = response.read()
'requests' pythonライブラリを使用してこれを実現できます:
http://docs.python-requests.org/en/latest/index.html
この例が見つかります:
http://docs.python-requests.org/en/latest/user/quickstart/#more-complicated-post-requests (より複雑なPOSTリクエスト)
>>> import requests
>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.post("http://httpbin.org/post", data=payload)
Urlencodedデータの代わりにJSONを送信しようとすると、python適切なヘッダーを設定しないようです。