向aspx页面提交发布请求
问题内容:
我在https://searchlight.cluen.com/E5/CandidateSearch.aspx上有一个ASPX页面,上面有一个表单,我想提交和解析该表单以获得信息。
使用Python的urllib和urllib2,我创建了带有正确标头和用户代理的发布请求。但是生成的html响应不包含预期的结果表。我是误会还是缺少明显的细节?
import urllib
import urllib2
headers = {
'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13',
'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml; q=0.9,*/*; q=0.8',
'Content-Type': 'application/x-www-form-urlencoded'
}
# obtained these values from viewing the source of https://searchlight.cluen.com/E5/CandidateSearch.aspx
viewstate = '/wEPDwULLTE3NTc4MzQwNDIPZBYCAg ... uJRWDs/6Ks1FECco='
eventvalidation = '/wEWjQMC8pat6g4C77jgxg0CzoqI8wgC3uWinQQCwr/ ... oPKYVeb74='
url = 'https://searchlight.cluen.com/E5/CandidateSearch.aspx'
formData = (
('__VIEWSTATE', viewstate),
('__EVENTVALIDATION', eventvalidation),
('__EVENTTARGET',''),
('__EVENTARGUMENT',''),
('textcity',''),
('dropdownlistposition',''),
('dropdownlistdepartment',''),
('dropdownlistorderby',''),
('textsearch',''),
)
# change user agent
from urllib import FancyURLopener
class MyOpener(FancyURLopener):
version = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11'
myopener = MyOpener()
# encode form data in post-request format
encodedFields = urllib.urlencode(formData)
f = myopener.open(url, encodedFields)
print f.info()
try:
fout = open('tmp.htm', 'w')
except:
print('Could not open output file\n')
fout.writelines(f.readlines())
fout.close()
关于此主题有几个有用的问题(例如如何在python中将查询提交到.aspx页),但我坚持这样做,并寻求其他帮助(如果可能)。
出现的html页面说我可能需要登录,但是aspx页面显示在我的浏览器中,而没有任何登录。
这是info()的结果:
连接:关闭日期:2011年6月7日星期二17:05:26 GMT服务器:Microsoft-IIS / 6.0 X-Powered-由:ASP.NET
X-AspNet-版本:2.0.50727缓存控制:私有内容类型: text / html; charset = utf-8内容长度:1944年
问题答案:
我尝试了机械化和urllib2,并且机械化可以更好地处理cookie。我可以简单地通过机械化指定来提交表单:
browser= mechanize.Browser()
browser.select_form(form_name)
browser.set_value("Page$Next", name="pagenumber")
无需手动复制发布请求,并且在这种情况下机械化能够处理依赖javascript的表单。