使用Selenium与Python和PhantomJS将文件下载到文件系统

时间:2014-09-10 00:49:31

标签: python selenium selenium-webdriver download phantomjs

我一直在努力使用PhantomJS / Selenium / python-selenium将文件下载到文件系统。 我能够轻松浏览DOM并点击,悬停等。然而,下载文件非常麻烦。我已经尝试过使用Firefox和pyvirtualdisplay的无头方法,但这也不是很好用,并且速度令人难以置信。我知道CasperJS允许文件下载。有谁知道如何将CasperJS与Python集成或如何利用PhantomJS下载文件。非常感谢。

4 个答案:

答案 0 :(得分:16)

尽管这个问题很老,但通过PhantomJS下载文件仍然是一个问题。但我们可以使用PhantomJS获取下载链接并获取所有需要的cookie,例如csrf令牌等。然后我们可以使用requests实际下载它:

import requests
from selenium import webdriver

driver = webdriver.PhantomJS()
driver.get('page_with_download_link')
download_link = driver.find_element_by_id('download_link')
session = requests.Session()
cookies = driver.get_cookies()

for cookie in cookies: 
    session.cookies.set(cookie['name'], cookie['value'])
response = session.get(download_link)

现在在response.content中应该出现实际的文件内容。接下来我们可以用open写它或做我们想做的事。

答案 1 :(得分:11)

PhantomJS目前不支持文件下载。解决方法的相关问题:

据我了解,您至少有3个选项:

  • 切换到casperjs(你应该在这里留下python)
  • xvfb
  • 上尝试无头
  • 切换到普通的非无头浏览器

以下也是一些可能有用的链接:

答案 2 :(得分:3)

我的用例需要表单提交才能检索文件。我能够使用驱动程序的// Trim all values of associative array function trim_associative_array(&$input_array) { if (is_array($input_array)) { foreach ($input_array as $key => &$val) { if (is_array($val)) { trim_associative_array($val); } else { $input_array[$key] = trim($val); } } } } 函数来完成此任务。

{{1}}

答案 3 :(得分:-1)

不可能那样。您可以使用其他替代方案来下载wget o curl等文件。

使用firefox查找正确的请求和selenium以获取该值并最终使用该框来下载文件

curlCall=" curl 'http://www_sitex_org/descarga.jsf' -H '...allCurlRequest....' > file.xml"
subprocess.call(curlCall, shell=True)