我想使用python urllib2来模拟登录操作,我使用Fiddler捕获数据包并得到登录操作只是一个ajax请求,用户名和密码作为json数据发送,但我不知道如何使用urllib2发送json数据,帮助...
答案 0 :(得分:20)
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对象。
答案 1 :(得分:20)
请注意以下
在Python 3.x中,urllib
和urllib2
模块已经合并。该模块名为urllib
。所以,请记住Python 2.x中的urllib
和Python 3.x中的urllib
是不同的模块。
Python 3中urllib.request.Request
的POST数据不接受字符串(str
) - 您必须传递bytes
对象(或bytes
的可迭代对象1}})
在Python 3.x中使用POST传递json
数据
import urllib.request import json json_dict = { 'name': 'some name', 'value': 'some value' } # convert json_dict to JSON json_data = json.dumps(json_dict) # convert str to bytes (ensure encoding is OK) post_data = json_data.encode('utf-8') # we should also say the JSON content type header headers = {} headers['Content-Type'] = 'application/json' # now do the request for a url req = urllib.request.Request(url, post_data, headers) # send the request res = urllib.request.urlopen(req) # res is a file-like object # ...
最后请注意,如果您要发送一些数据,则只能发送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)
答案 2 :(得分:5)
您可以根据要求指定数据:
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()
答案 3 :(得分:3)
您可以使用'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)
当您尝试发送JSON而不是urlencoded数据时,似乎python没有设置好的标头。