嘿伙计,
我试图找出如何处理神秘的" __ VIEWSTATE" &安培;当您尝试使用Python请求(POST)页面时Cie!它是我脚本中很多问题的主要来源......我意识到,当我在寻找答案/解决方案时,你没有那么多解决方案(几乎为0!)。
在本主题中 Unable to load ASP.NET page using Python urllib2 您可以看到我提供的解决方案包括每次加载页面时解析隐藏字段的值...这样可行,但实际上这非常愚蠢: - )
for result in the_page.findAll('input', attrs={'name' : '__VIEWSTATE'}):
view_state = result['value']
for result_1 in the_page.findAll('input', attrs={'name' : '__EVENTVALIDATION'}):
event_validation = result_1['value']
for result_2 in the_page.findAll('input', attrs={'name' : '__PREVIOUSPAGE'}):
previous_page = result_2['value']
for result in the_page.findAll('input', attrs={'name' : '__EVENTTARGET'}):
event_target = result['value']
之后:
url = 'http://bandscore.ielts.org/search.aspx'
values = {
'__EVENTTARGET' : 'gdvSearchResults',
'__EVENTARGUMENT' : page,
'__VIEWSTATE' : view_state,
'__PREVIOUSPAGE' : previous_page,
'__EVENTVALIDATION' : event_validation,
'DropDownList1' : Country,
#'txtSearchInstitution' : '',
#'hdnSearchText' : '',
#'rdoFilter': '%25',
}
user_agent = 'Mozilla/5 (Solaris 10) Gecko'
headers = { 'User-Agent' : user_agent }
data = urllib.urlencode(values)
req = urllib2.Request(url, data, headers)
response = urllib2.urlopen(req)
thePage = response.read()
the_page = soup(thePage)
所以这里有更多的链接有很好的解释/有些正在提出解决方案:
What does the __VIEWSTATE hold?
http://aspalliance.com/articleViewer.aspx?aId=135&pId=
http://msdn.microsoft.com/en-us/library/system.web.ui.losformatter.aspx
http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/Truly-Understanding-Viewstate.aspx
http://msdn.microsoft.com/en-us/library/ms972976.aspx
Mechanize does not see some hidden form inputs?
Unable to load ASP.NET page using Python urllib2
我意识到很多人都在努力找到一个好方法来解决这个问题,所以让我们一起尝试找到一个好的解决方案; - )
EDIT1 :发现也可能有趣http://code.google.com/p/peekviewstate/source/browse/trunk/src/peekviewstate_example.py
(对不起,这篇文章不完美/充满了良好的信息......我非常努力,但我努力尝试)
答案 0 :(得分:1)
如何处理?只需将__VIEWSTATE
视为服务器发送给您的不透明数据。它包含给定页面的一些特定数据及其对象的状态,我不建议您修改它。
如果要使用浏览器模拟某个ASP.NET应用程序,则需要在POST
请求中包含这些应用程序,以便服务器可以重建页面的状态。
它造成的确切问题是什么?我认为你的解决方案很简单。
顺便说一句,只是旁注 - 许多ASP.NET应用程序都包含公共API,可以使用它来代替尝试解析它的页面。