【问题标题】:Selenium pdf automatic download not workingSelenium pdf自动下载不起作用
【发布时间】:2015-08-07 18:20:22
【问题描述】:

我是 selenium 的新手,我正在编写一个从给定站点自动下载 pdf 文件的刮板。

下面是我的代码:

from selenium import webdriver

fp = webdriver.FirefoxProfile()

fp.set_preference("browser.download.folderList",2);
fp.set_preference("browser.download.manager.showWhenStarting",False)
fp.set_preference("browser.download.dir", "/home/jill/Downloads/Dinamalar")
fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/pdf")

browser = webdriver.Firefox(firefox_profile=fp)
browser.get("http://epaper.dinamalar.com/PUBLICATIONS/DM/MADHURAI/2015/05/26/PagePrint//26_05_2015_001_b2b69fda315301809dda359a6d3d9689.pdf");
webobj = browser.find_element_by_id("download").click();

我遵循了 Selenium documentation 和 this link 中提到的步骤。我不确定为什么每次都显示下载对话框。

有没有办法修复它,否则是否有办法提供“应用程序/全部”以便可以下载所有文件(解决方法)?

【问题讨论】:

    标签: python selenium selenium-webdriver web-scraping web-crawler


    【解决方案1】:

    我测试了以下代码,并在 Windows 7 上成功下载了您的 pdf:

    fp = webdriver.FirefoxProfile()
    fp.set_preference("browser.download.folderList", 2)
    fp.set_preference("browser.download.manager.showWhenStarting", False)
    fp.set_preference("browser.download.dir", download_location)
    fp.set_preference("plugin.disable_full_page_plugin_for_types", "application/pdf")
    fp.set_preference("pdfjs.disabled", True)
    fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/pdf")
    
    
    
    driver = webdriver.Firefox(fp)
    driver.implicitly_wait(10)
    driver.maximize_window()
    driver.get("http://epaper.dinamalar.com/")
    element = driver.find_element_by_css_selector("li#liSavePdf>a>img")
    element.click()
    

    【讨论】:

      【解决方案2】:

      禁用内置的pdfjs 插件并导航到 URL - PDF 文件将自动下载,代码:

      from selenium import webdriver
      
      fp = webdriver.FirefoxProfile()
      
      fp.set_preference("browser.download.folderList", 2)
      fp.set_preference("browser.download.manager.showWhenStarting",False)
      fp.set_preference("browser.download.dir", "/home/jill/Downloads/Dinamalar")
      fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/pdf,application/x-pdf")
      
      fp.set_preference("pdfjs.disabled", "true")  # < KEY PART HERE
      
      browser = webdriver.Firefox(firefox_profile=fp)
      browser.get("http://epaper.dinamalar.com/PUBLICATIONS/DM/MADHURAI/2015/05/26/PagePrint//26_05_2015_001_b2b69fda315301809dda359a6d3d9689.pdf");
      

      更新(对我有用的完整代码):

      from selenium import webdriver
      
      mime_types = "application/pdf,application/vnd.adobe.xfdf,application/vnd.fdf,application/vnd.adobe.xdp+xml"
      
      fp = webdriver.FirefoxProfile()
      fp.set_preference("browser.download.folderList", 2)
      fp.set_preference("browser.download.manager.showWhenStarting", False)
      fp.set_preference("browser.download.dir", "/home/aafanasiev/Downloads")
      fp.set_preference("browser.helperApps.neverAsk.saveToDisk", mime_types)
      fp.set_preference("plugin.disable_full_page_plugin_for_types", mime_types)
      fp.set_preference("pdfjs.disabled", True)
      
      browser = webdriver.Firefox(firefox_profile=fp)
      browser.get("http://epaper.dinamalar.com/")
      
      webobj_get_link = browser.find_element_by_id("liSavePdf")
      webobj_get_object = webobj_get_link.find_element_by_tag_name("a")
      webobj_get_object.click()
      

      【讨论】:

      • 即使在提到代码之后我仍然面临这个问题。操作系统有没有可能参与其中?我使用 UBUNTU 14.04。
      • @Gaara 很有趣,它适用于我:Mac 上的 selenium 2.45 + firefox 35.0.1。
      • 我的是 Selenium 2.45.0,Ubuntu 14.04 firefox 38.0。我正在尝试每一种可能性。下载弹出窗口也不属于窗口句柄。它不会处于警戒状态。关于可以做些什么的任何想法?如果你愿意,我可以发布我的脚本的链接。
      • @Gaara 是的,请分享您正在执行的当前代码。谢谢。
      • 非常感谢。这里是链接codeskulptor.org/#user40_loV03Asao9_0.py函数“download_page_from_child_link()”负责点击“下载”按钮并调用下载对话框。如果您需要任何信息,请告诉我
      【解决方案3】:

      由于没有可用的 HTML 代码,我的猜测是这一行

      webobj = browser.find_element_by_id("download").click();
      

      实际上调用了onclick事件,但是你没有正确处理它。换句话说,您缺少的是存储此 .pdf 文件的位置。我对 python 编程的经验很少,但一种解决方案是使用 HTTP webclient lib,它可以让你自动下载文件。像CSharp's WebClient.DownloadFile Method (String, String) 这样的东西。如果使用得当,您可以跳过任何 Selenium 命令来执行此操作。

      也许像this post 这样的东西会是一个好的开始。

      【讨论】:

        猜你喜欢
        • 2019-01-23
        • 2021-11-16
        • 1970-01-01
        • 2020-12-23
        • 2022-06-22
        • 2015-08-07
        • 1970-01-01
        • 2016-02-17
        • 1970-01-01
        相关资源
        最近更新 更多