这是我这几天一直在努力解决的问题。我正在尝试自动从该网站下载文件,并希望其他具有类似结构的网站。我知道该网站是 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 的四个字段来模拟发布请求。它们是 eventtarget、eventargument、viewstate(具有默认值)和 eventvalidaiton(也具有默认值)。这也不起作用——我最终重新获得了 Ginnie Mae 网站。
我假设我可以以某种方式获取 doPostBack 函数并使用 JavaScript 解释器直接运行它,但我只是不知道该怎么做。到目前为止,我有 mechanize、selenium 和 phantomJS 为我工作,但我不确定是否可以利用其中任何一个来运行代码并下载文件。