在Python中验证aspx页面的错误问题
这里有几个相关的问题,但我看了他们的回答还是没能解决我的问题,所以我想试试自己发个帖。
简单来说,我想从一个需要用户名和密码的网站下载一些 *.zip 文件。这是网站的登录页面:
http://data.theice.com/MyAccount/Login.aspx
一旦登录成功(在正常的浏览器会话中),我可以通过点击下载链接来下载我需要的 *.zip 文件,比如:
http://data.theice.com/MyAccount/Download.aspx?PUID=41483&PDS=2&PRODID=3744&TS=2014
到目前为止,我尝试使用了 cookielib
、urllib
、urllib2
和 HTMLParser
这些库。我用 HTMLParser 来读取 __VIEWSTATE
和 __EVENTVALIDATION
的值,因为我看到在表单中重新提交相同的值是很重要的。然而,当我尝试用正确的登录信息打开登录页面时,我只得到了(未认证的)登录页面。我真的不确定我哪里做错了,但任何帮助都会非常感激。
谢谢 :)
附言:我意识到我在这里粘贴了很多代码。我这样做只是为了完整性,但我很确定获取 __VIEWSTATE
和 __EVENTVALIDATION
值的代码是返回了正确的值。
import cookielib
import urllib
import urllib2
from HTMLParser import HTMLParser
class IceConnection(object):
def __init__(self, username, password):
self.username = username
self.password = password
self.url = "http://data.theice.com/MyAccount/Login.aspx"
self.headers = [
('user-agent','Mozilla/5.0 (Windows NT 6.3; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0'),
('accept','text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'),
('accept-language','en-US,en;q=0.5'),
('accept-encoding','gzip, deflate'),
('accept-charset','iso-8859-1,utf-8;q=0.7,*;q=0.7'),
('connection','keep-alive'),
('content-type','application/x-www-form-urlencoded')
]
self.cookies = cookielib.CookieJar()
self.opener = urllib2.build_opener(
urllib2.HTTPRedirectHandler(),
urllib2.HTTPHandler(debuglevel=0),
urllib2.HTTPSHandler(debuglevel=0),
urllib2.HTTPCookieProcessor(self.cookies)
)
self.opener.addheaders = self.headers
#Extract view_state and event_validation variables:
field_names = [r'__VIEWSTATE', r'__EVENTVALIDATION']
field_values = self.extractFields(field_names)
view_state = field_values[0]
event_validation = field_values[1]
self.fields = (
(r'__EVENTTARGET', r''),
(r'__EVENTARGUMENT', r''),
(r'__LASTFOCUS',r''),
(r'__VIEWSTATE', view_state),
(r'__EVENTVALIDATION', event_validation),
(r'ctl00$ContentPlaceHolder1$LoginControl$m_userName', username),
(r'ctl00$ContentPlaceHolder1$LoginControl$m_password', password)
)
login_data = urllib.urlencode(self.fields)
print response = self.opener.open(self.url, login_data)
def extractFields(self, field_names):
response = self.opener.open(self.url)
html = ''.join(response.readlines())
ret = list()
for field in field_names:
parser = PageParser(field)
parser.feed(html)
ret.append(parser.value)
return ret
class PageParser(HTMLParser):
def __init__(self, field_name):
HTMLParser.__init__(self)
self.field = field_name
def handle_starttag(self, tag, attrs):
if tag == 'input':
#Create dictionary of attributes
attributes = dict()
for attr in attrs:
attributes[attr[0]] = attr[1]
if attributes.has_key('name'):
if attributes['name'] == self.field:
self.value = attributes['value']
1 个回答
0
我其实是通过我的浏览器(谷歌浏览器)查看发送到服务器的POST
头信息,成功解决了我的问题。我注意到了这一行:
__EVENTTARGET:ctl00$ContentPlaceHolder1$LoginControl$LoginButton
所以我把我代码中的空字符串替换成了上面那一行,现在它可以正常工作了!