我尝试以编程方式从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
从这里开始,我有点卡住了。
有人知道如何点击该链接并获得最终的下载网址吗?欢迎所有提示!
答案 0 :(得分:2)
form#form1
解决这些问题的正确方法是忘记javascript并打开控制台,特别是网络面板。所以我所做的是我打开了面板,我可以清楚地看到:
这里的 POST 很重要,这意味着它使用POST HTTP使用请求,因此您无法使用wget
来获取它。据我所知,Wget只允许你定义URL。我还可以检查GET(?blah=blah
)和POST(那些追求请求标头)参数:
我注意到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
属性来获取该网址。