这是我几天来一直在努力解决的问题。我正在尝试自动从this网站下载文件,并希望其他具有类似结构的网站。我知道网站是ASP,我知道所有的下载链接都调用doPostBack函数,其形式如下:
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
我试过点击通过selenium和phantomjs的链接,但失败了。然后我决定尝试模拟函数调用。我使用了机械化,并执行了以下操作:
def python_func(self,url,target,argument):
br = mechanize.Browser()
br.set_handle_robots(False)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US;
rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3. 0.1')]
br.open(url)
form_num = 0
while True:
try:
inner_browser.select_form(nr=form_num)
except FormNotFoundError:
return False
br.form.set_all_readonly(False)
inner_browser["__EVENTTARGET"] = targ
inner_browser["__EVENTARGUMENT"] = arg
response = inner_browser.submit()
不幸的是,表单似乎没有提交控件,我从提交调用中得不到任何结果。我也尝试通过手动编码ASP doPostBack所具有的四个字段来模拟post请求。这些是eventtarget,eventargument,viewstate(具有默认值)和eventvalidaiton(也有默认值)。这也不起作用 - 我最终再次获得了Ginnie Mae网站。
我假设我可以以某种方式使用doPostBack函数并使用JavaScript解释器直接运行它,但我只是不知道该怎么做。到目前为止,我有机械化,selenium和phantomJS为我工作,但我不确定我是否可以利用其中任何一个来运行代码并获取文件下载。