当前位置: 首页 > 知识库问答 >
问题:

自动点击下载链接后,使用Selenium、Firefox、Python将EPS文件下载保存到磁盘

白泽语
2023-03-14

工具:Ubuntu、Python、Selenium、Firefox

我打算从订阅网站自动下载图像文件。我只有通过付费订阅才能访问服务器。为了避免每次文件下载都要点击一个按钮,我决定使用Python、Selenium和Firefox将其自动化。(我两天来第一次同时使用这三种饼干。我对饼干也知之甚少。)

我有兴趣按顺序或偏好下载以下三种格式:['EPS'、'PNG'、'JPG']。网站上提供了每种格式的按钮。

通过手动设置Firefox首选项,我成功地将“PNG”和“JPG”文件自动下载到磁盘上,正如本文所建议的:python webcrawler下载文件

但是,当文件为“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帖子,我决定看看是否可以通过url和urllib2下载该文件。正如我所理解的那样,我需要将cookie添加到标题中,以便通过url验证“EPS”文件的下载。

我不熟悉这种技术,但这是我试图直接下载文件时使用的代码。尽管我尝试在urllib2打开器中设置cookie,但它还是以403禁止的响应失败了。

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文件的希望?提前谢谢。

共有1个答案

卢才艺
2023-03-14

感谢@unutbu帮助我解决这个问题。我只是不懂文件下载的结构。我现在明白多了一点。

最后,我在火狐上安装了一个名为“实时HTTP标头”的扩展来检查服务器发送的标头。事实证明,EPS文件是通过应用程序/八位流的Content-Type发送的。

现在EPS文件按预期保存到磁盘。我修改了Firefox的首选项如下:

profile.set_preference('browser.helperApps.neverAsk.saveToDisk',
                   'image/jpeg,image/png,'
                   'application/octet-stream')
 类似资料:
  • 问题内容: 我对Selenium WebDriver和Firefox有问题。我想在对话框窗口中下载没有确认的csv文件,并且我有如下代码: 但似乎不起作用。我尝试了与 browser.helperApps.neverAsk.saveToDisk的* 许多组合 * 要么 但没有任何区别,Firefox也不会自动下载。我该如何解决? 问题答案: 有时内容类型与您期望的不一样使用 HttpFox Fir

  • 我尝试通过selenium(python)从GoogleTrend下载CSV数据。 在前面,我尝试打印源页和提取数据,我以后想要。它在一段时间内起作用,但现在不起作用了。 导入sys导入时间 从selenium导入webdriver.Common.Keys导入selenium.webdriver.Common.Action_Chains导入selenium.webdriver.Support.UI

  • 问题内容: 我尝试设置Firefox以便自动下载文件。我在这里输入链接描述中做了建议,但是我无法使它工作。 这是我的代码: PDF仍在浏览器PDF查看器中打开。任何想法? 问题答案: 要禁用在Firefox中打开和下载pdf,请执行以下操作: 可以在此处找到MimeTipes列表。

  • 问题内容: 我在网络应用程序中生成普通链接,例如: 当我单击链接时,它将在新页面中显示图片。如果要保存图片,则需要右键单击它并选择“另存为” 我不希望这种行为,我想在单击链接时弹出一个下载框,这可能仅适用于html或javascript吗?怎么样? 如果不是,我想我将不得不编写一个download.php脚本,并以文件名作为参数将其调用到href中…? 问题答案:

  • 问题内容: 目的是从Internet下载文件,并从中创建文件对象或类似文件的文件,而无需使其接触硬盘驱动器。这仅是出于我的知识,想知道它是否可能或可行,尤其是因为我想看看是否可以绕过必须编写文件删除行的代码。 通常,这就是我从网络上下载内容并将其映射到内存的方式: 问题答案: 这就是我最终要做的。

  • 问题内容: 我有敏感文件要下载给用户,每个用户只能 下载 给定文件一次。如果下载失败,我希望允许重新下载,但不允许其他方式。 仅仅依靠在服务器上记录/处理文件下载 请求 是不够的-我需要确定性地知道文件何时完成以及在客户端是否就位,因为我的许多用户都在频繁掉线的环境中工作。 最有效的方法是,浏览器从“另存为…”对话框中暴露出一个“文件已保存”事件,该事件可能会链接到下载页面上的JavaScript