如何从javascript链接获取下载位置?

时间:2015-11-12 16:20:53

标签: javascript python selenium web-scraping phantomjs

我尝试以编程方式从a website下载pdf,其中链接加载了一些javascript:

<a href="javascript:__doPostBack('downloadTop','')">Download</a>

看到一个wget或任何类似的机制显然会失败我决定使用selenium和Phantomjs模拟一个真正的浏览器和javascript解释器来实际看看它做了什么如果我&#34;点击&#34;在下载链接上。根据{{​​3}} Phantomjs目前不支持文件下载。问题是我甚至不需要使用Phantomjs下载文件,我只想从文件中获取直接URL,以便我可以使用类似wget的内容下载它。

所以我尝试了以下内容:

>>> from selenium import webdriver
>>> driver = webdriver.PhantomJS()
>>> link = 'https://www.yourticketprovider.nl/LiveContent/tickets.aspx?x=492449&y=8687&px=92AD8EAA22C9223FBCA3102EE0AE2899510C03E398A8A08A222AFDACEBFF8BA95D656F01FB04A1437669EC46E93AB5776A33951830BBA97DD94DB1729BF42D76&rand=a17cafc7-26fe-42d9-a61a-894b43a28046&utm_source=PurchaseSuccess&utm_medium=Email&utm_campaign=SystemMails'
>>> driver.get(link)
>>> for linkElement in driver.find_elements_by_tag_name('a'):
...    print linkElement.get_attribute('href')
...    
https://www.yourticketprovider.nl/
javascript:__doPostBack('downloadTop','')
https://www.yourticketprovider.nl/LiveContent/tickets.aspx?x=492449&y=8687&px=92AD8EAA22C9223FBCA3102EE0AE2899510C03E398A8A08A222AFDACEBFF8BA95D656F01FB04A1437669EC46E93AB5776A33951830BBA97DD94DB1729BF42D76&rand=a17cafc7-26fe-42d9-a61a-894b43a28046&utm_source=PurchaseSuccess&utm_medium=Email&utm_campaign=SystemMails#
etc. etc.

因为我需要获得第二个元素,所以我尝试了以下内容:

>>> a = driver.find_elements_by_tag_name('a')[1].click()
>>> print a
None

从这里开始,我有点卡住了。

有人知道如何点击该链接并获得最终的下载网址吗?欢迎所有提示!

1 个答案:

答案 0 :(得分:2)

tl; dr:该链接实际上触发了隐藏的表单form#form1

解决这些问题的正确方法是忘记javascript并打开控制台,特别是网络面板。所以我所做的是我打开了面板,我可以清楚地看到:

image description

这里的 POST 很重要,这意味着它使用POST HTTP使用请求,因此您无法使用wget来获取它。据我所知,Wget只允许你定义URL。我还可以检查GET(?blah=blah)和POST(那些追求请求标头)参数:

image description

我注意到GET参数与您共享的URL中的参数匹配。所以你需要的只是复制POST参数。此代码段可以从隐藏的表单中获取:

function paramsToObject(form) {
  var fields = {};
  for(var i=0,l=form.length; i<l; i++) {
      fields[form[i].name] = form[i].value;
  }
  return fields;
}
console.log(JSON.stringify(paramsToObject(document.forms[0])));

也可以通过获取表单target属性来获取该网址。