自动点击下载链接后,使用 Selenium、Firefox、Python 将下载的 EPS 文件保存到磁盘
Posted
技术标签:
【中文标题】自动点击下载链接后,使用 Selenium、Firefox、Python 将下载的 EPS 文件保存到磁盘【英文标题】:using Selenium, Firefox, Python to save download of EPS files to disk after automated clicking of download link 【发布时间】:2014-02-15 23:56:22 【问题描述】:工具:Ubuntu、Python、Selenium、Firefox
我正在尝试自动从订阅网站下载图像文件。除了通过付费订阅外,我无权访问服务器。为了避免每次下载文件都需要单击一个按钮,我决定使用 Python、Selenium 和 Firefox 将其自动化。 (这两天我是第一次一起使用这三个。我对cookies也知之甚少。)
我有兴趣按顺序或偏好下载以下三种格式:['EPS'、'PNG'、'JPG']。网站上提供了每种格式的按钮。
通过手动设置 Firefox 首选项,我成功地将“PNG”和“JPG”文件自动下载到磁盘,如这篇文章中所建议:python webcrawler downloading files
但是,当文件为“EPS”格式时,“您已选择保存”对话框仍会在 Firefox 窗口中弹出。
从我的代码中可以看出,我已经设置了将“EPS”文件保存到磁盘的首选项。 (同样,“JPG”和“PNG”文件按预期保存。)
from selenium import webdriver
profile = webdriver.firefox.firefox_profile.FirefoxProfile()
profile.set_preference("browser.download.folderList", 1)
profile.set_preference("browser.download.manager.showWhenStarting", False)
profile.set_preference('browser.helperApps.neverAsk.saveToDisk',
'image/jpeg,image/png,application/postscript,'
'application/eps,application/x-eps,image/x-eps,'
'image/eps')
profile.set_preference("browser.helperApps.alwaysAsk.force", False)
profile.set_preference("plugin.disable_full_page_plugin_for_types",
"application/eps,application/x-eps,image/x-eps,"
"image/eps")
profile.set_preference(
"general.useragent.override",
"Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:26.0)"
" Gecko/20100101 Firefox/26.0")
driver = webdriver.Firefox(firefox_profile=profile)
#I then log in and begin automated clicking to download files. 'JPG' and 'PNG' files are
#saved to disk as expected. The 'EPS' files present a save dialog box in Firefox.
我尝试为 Firefox 安装一个名为“download-statusbar”的扩展程序,该扩展程序声称不会出现任何保存对话框。扩展在 Selenium Firefox 浏览器中加载,但它不起作用。 (许多评论说,尽管开发人员坚持认为该扩展程序确实有效,但该扩展程序已损坏。)它对我不起作用,所以我放弃了。
我在那次尝试中将此添加到 Firefox 配置文件中:
#The extension loads, but it doesn't function.
download_statusbar = '/home/$USER/Downloads/'
'/download_statusbar_fixed-1.2.00-fx.xpi'
profile.add_extension(download_statusbar)
通过阅读其他 ***.com 帖子,我决定看看是否可以通过带有 urllib2 的 url 下载文件。据我了解这是如何工作的,我需要将 cookie 添加到标头中,以便通过 url 验证“EPS”文件的下载。
我不熟悉这种技术,但这是我尝试用来直接下载文件的代码。尽管我尝试在 urllib2 开启程序中设置 cookie,但它以“403 Forbidden”响应失败。
import urllib2
import cookielib
import logging
import sys
cookie_jar = cookielib.LWPCookieJar()
handlers = [
urllib2.HTTPHandler(),
urllib2.HTTPSHandler(),
]
[h.set_http_debuglevel(1) for h in handlers]
handlers.append(urllib2.HTTPCookieProcessor(cookie_jar))
#using selenium driver cookies, returns a list of dictionaries
cookies = driver.get_cookies()
opener = urllib2.build_opener(*handlers)
opener.addheaders = [(
'User-agent',
'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:26.0) '
'Gecko/20100101 Firefox/26.0'
)]
logger = logging.getLogger("cookielib")
logger.addHandler(logging.StreamHandler(sys.stdout))
logger.setLevel(logging.DEBUG)
for item in cookies:
opener.addheaders.append(('Cookie', '='.format(
item['name'], item['value']
)))
logger.info('='.format(item['name'], item['value']))
response = opener.open('http://path/to/file.eps')
#Fails with a 403 Forbidden response
有什么想法或建议吗?我是否遗漏了一些简单的东西,或者我是否需要放弃对 EPS 文件自动下载的希望?提前致谢。
【问题讨论】:
您可能希望使用here 中描述的方法来检查 eps 文件的 MIME 类型是否正确。 @unutbu 感谢您的承诺。我查看了您建议的链接并尝试手动下载 EPS 文件。奇怪的是,Firefox 让我有机会为 JPG 文件设置默认行为,如 in this screenshot 所示,但没有为 EPS 文件设置默认行为的机会,如 in this screenshot 所示。我将 Firefox 中的首选项设置为“总是要求我保存文件”。也许我需要安装一个支持 EPS 的应用程序 通过在 Firefox 中使用“文件”>“打开”菜单在本地打开 EPS 文件,我能够得到一个预期的对话框,其中包含“从现在开始对此类文件自动执行此操作”选项。 screenshot 奇怪的是它没有发生在 EPS 文件下载中。 我现在在 mimeTypes.rdf 中有一个条目 'NC value="image/x-eps"',但当然它是由我在本地打开文件设置的。当我尝试下载时,还有其他方法可以查看服务器发送的 mimeType 是什么? 【参考方案1】:感谢@unutbu 帮助我解决了这个问题。我只是不明白文件下载的结构。我现在明白了一点。
我最终在 Firefox 上安装了一个名为“Live HTTP Headers”的扩展程序来检查服务器发送的标头。事实证明,“EPS”文件的“Content-Type”为“application/octet-stream”。
现在 EPS 文件已按预期保存到磁盘。我将 Firefox 首选项修改为以下内容:
profile.set_preference('browser.helperApps.neverAsk.saveToDisk',
'image/jpeg,image/png,'
'application/octet-stream')
【讨论】:
我很高兴你明白了! 我只是需要换个思路。你种下了让我知道我不知道的种子!谢谢。以上是关于自动点击下载链接后,使用 Selenium、Firefox、Python 将下载的 EPS 文件保存到磁盘的主要内容,如果未能解决你的问题,请参考以下文章