使用Selenium和Python及PhantomJS将文件下载到文件系统
我一直在尝试用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
来写入文件,或者做其他任何我们想做的事情。