如何在Javascript链接后面下载和存储.txt文件

时间:2012-09-19 19:24:36

标签: python screen-scraping web-scraping

我正在尝试下载.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>

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

1 个答案:

答案 0 :(得分:0)

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

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

但是,你可以通过下载和阅读脚本来自动处理这个问题,找出__doPostBack做了什么,看看你是否可以用Python中的信息在Python中实现相同的逻辑,这样你就可以转换javascript:__doPostBack('ctl00$ContentPlaceHolder1$hlPreRelease0','')到您可以实际下载的网址。

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

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,然后对转换进行反向工程可能会更简单。 (或者当然,如果你只抓取一些文件,你也可以在同一个地方的缓存中找到它们,然后你就完成了。)