Python Requests - 以变量形式插入凭据到FORM_DATA中
我正在尝试让用户输入用户名和密码,以便登录一个网站。我的计划是使用requests库来发送POST数据。以下是我目前写的代码:
import requests
import getpass
uname = raw_input("Username: ")
passw = getpass.getpass(prompt = "Password: ")
FORM_DATA = {
"__EVENTTARGET:",
"__EVENTARGUMENT:",
"__VIEWSTATE:/wEPDwUKMTA5NTA5ODU1MQ9kFgJmD2QWAgIGDxBkDxYFZgIBAgICAwIEF***REMAINDER REMOVED***",
"__EVENTVALIDATION:/wEdAAp4d3BHvSTs+Kv6cxGP3xEbBr8xrgRYad2tj4YCyRIw5qUAjimf****REMAINDER REMOVED****",
"jsCheck:",
"ddlEngine: REMOVED:13008",
"Username: %(uname)s" ,
"Password: %(passw)s",
"btnLogin.x: 42",
"btnLogin.y: 9",
"btnLogin: Login",
}
print FORM_DATA
这显然只是POST数据的一部分,但我想先确认输入的用户名和密码是否正确传递,然后再继续进行其他操作。使用print语句并没有显示出输入的内容已经放到我定义的位置上。
1 个回答
2
从表单提交的数据其实就是一系列的键值对。因为每个键都是独一无二的,所以可以用字典来表示这些数据:
FORM_DATA = {
'__EVENTTARGET': '',
'__EVENTARGUMENT': '',
'__VIEWSTATE': '/wEPDwUKMTA5NTA5ODU1MQ9kFgJmD2QWAgIGDxBkDxYFZgIBAgICAwIEF***REMAINDER REMOVED***',
'__EVENTVALIDATION': '/wEdAAp4d3BHvSTs+Kv6cxGP3xEbBr8xrgRYad2tj4YCyRIw5qUAjimf****REMAINDER REMOVED****',
'jsCheck': '',
'ddlEngine': 'REMOVED:13008',
'Username': uname,
'Password': passw,
'btnLogin.x': '42',
'btnLogin.y': '9',
'btnLogin': 'Login',
}
其中空值用空字符串表示。
btnLogin.x
和 btnLogin.y
这两个键通常会被服务器忽略,它们的作用是告诉服务器你在图片按钮上点击的位置。你可以直接用之前设置的 uname
和 passw
变量来设置用户名和密码的键。
然后把这个字典作为 data
参数传给 requests.post()
方法。
服务器可能会期待你返回一个cookie,这个cookie是在最初加载表单时设置的。在这种情况下,你可以使用一个 Session对象,然后在这个对象上调用 .get()
和 .post()
方法。
还有一种情况是 __VIEWSTATE
和 __EVENTVALIDATION
这两个键是在表单首次生成时动态设置的,你需要先用 requests.get()
加载它,解析HTML(可以用BeautifulSoup),然后提取表单字段,再发送数据。