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

21 投票
4 回答
21470 浏览
提问于 2025-04-20 18:47

我一直在尝试用PhantomJS、Selenium和python-selenium来下载文件到我的电脑上。虽然我可以很轻松地在网页上点击、悬停等操作,但下载文件却让我很头疼。我试过用无头模式的Firefox和pyvirtualdisplay,但效果也不好,而且速度慢得让人受不了。我知道CasperJS可以下载文件。有没有人知道怎么把CasperJS和Python结合起来,或者怎么用PhantomJS下载文件呢?非常感谢!

4 个回答

-1

这样做是不行的。你可以用其他方法来下载文件,比如 wget 或 curl。

可以用 Firefox 浏览器找到正确的请求,然后用 Selenium 来获取这些值,最后再用其他工具来下载文件。

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

我需要一个表单提交来获取文件。为了实现这个,我使用了驱动程序的 execute_async_script() 函数。

 js = '''
    var callback = arguments[0];
    var theForm = document.forms['theFormId'];
    data = new FormData();
    data.append('eventTarget', "''' + target + '''"); // this is the id of the file clicked
    data.append('otherFormField', theForm.otherFormField.value);

    var xhr = new XMLHttpRequest();
    xhr.open('POST', theForm.action, true);
'''

for cookie in driver.get_cookies():
    js += ' xhr.setRequestHeader("' + cookie['name'] + '", "' + cookie['value'] + '"); '

js += '''
    xhr.onload = function () {
        callback(this.responseText);
    };
    xhr.send(data);
'''

driver.set_script_timeout(30)
file = driver.execute_async_script(js)
12

PhantomJS 目前不支持文件下载。这里有一些相关的问题和解决方法:

根据我的理解,你至少有三种选择:

  • 换用 casperjs(这里建议你不要用 Python)
  • 尝试在 xvfb 上使用无头模式
  • 换用普通的非无头浏览器

这里还有一些可能对你有帮助的链接:

19

虽然这个问题已经有点时间了,但通过 PhantomJS 下载文件仍然是个麻烦。不过,我们可以用 PhantomJS 获取下载链接,并获取所有需要的 cookies,比如 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 来写入文件,或者做其他任何我们想做的事情。

撰写回答