0

我正在尝试在此处下载 .txt 文件:http: //www.namejet.com/Pages/Downloads.aspx

但是下载链接是我以前从未见过的格式...

<a id="ctl00_ContentPlaceHolder1_hlPreRelease0" class="sIcoTxt" rel="nofollow" href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$hlPreRelease0','')">Wednesday, September 19, 2012</a>

我不知道从哪里开始,我需要一个脚本来访问下载页面并下载并存储此链接后面的文件?

4

1 回答 1

0

此处的链接是对 javascript 函数的调用__doPostBack

自动处理此问题的唯一方法是下载脚本并__doPostBack在具有适当环境的 JS 解释器中运行该函数。最简单的方法是在浏览器环境中编写脚本——例如,使用 Greasemonkey。

但是,您可以通过下载和阅读脚本来半自动地处理这个问题,弄清楚是做什么__doPostBack的,看看您是否可以使用您拥有的信息在 Python 中实现相同的逻辑,这样您就可以转换javascript:__doPostBack('ctl00$ContentPlaceHolder1$hlPreRelease0','')为您可以实际下载的 URL。

举一个非常简单的例子,假设你发现了这个:

function __doPostBack(name, callback) {
  var url = 'http://' + window.location.hostname + '/postbacks/' + name + ".xml";
  var xhr = new XMLHttpRequest();
  xhr.open("POST", url, false);
  xhr.send();
  var xml = xhr.responseXML;
  if (callback) callback(xml);
}

所以,你会做这样的事情:

r = re.compile(r"javascript:__doPostBack\('(.*?)','')")

现在,当您获得与此正则表达式匹配的 href 时,您可以执行以下操作:

nexturl = 'http://' + urlparse.urlparse(lasturl).netloc + '/postbacks/' + m.groups(1) + '.xml'
u = urllib2.urlopen(nexturl, '')
xml = u.read()

如果 JS 非常复杂且难以理解,则使用浏览器的 Web 开发工具查看单击链接时下载的 URL,然后对转换进行逆向工程可能会更简单。(当然,如果你只是抓取几个文件,你也可以从同一个地方在缓存中找到它们,然后你就完成了。)

于 2012-09-19T19:28:56.927 回答