【问题标题】:How to download the PDF by using Selenium Module (FireFox) in Python 3如何在 Python 3 中使用 Selenium 模块 (FireFox) 下载 PDF
【发布时间】:2018-02-12 02:20:21
【问题描述】:

我想从在线杂志下载 PDF。要打开它,必须先登录。然后打开 PDF 并下载。

以下是我的代码。它可以登录页面,也可以打开PDF。但是无法下载 PDF,因为我不确定如何模拟单击保存。我用火狐。

import os, time
from selenium import webdriver
from bs4 import BeautifulSoup

# Use firefox dowmloader to get file
fp = webdriver.FirefoxProfile()
fp.set_preference("browser.download.folderList",2)
fp.set_preference("browser.download.manager.showWhenStarting",False)
fp.set_preference("browser.download.dir", 'D:/eBooks/Stocks_andCommodities/2008/Jul/')
fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/pdf")
fp.set_preference("pdfjs.disabled", "true")

# disable Adobe Acrobat PDF preview plugin
fp.set_preference("plugin.scan.plid.all", "false")
fp.set_preference("plugin.scan.Acrobat", "99.0")

browser = webdriver.Firefox(firefox_profile=fp)

# Get the login web page
web_url = 'http://technical.traders.com/sub/sublogin2.asp'
browser.get(web_url)

# SImulate the authentication
user_name = browser.find_element_by_css_selector('#SubID > input[type="text"]')
user_name.send_keys("thomas2003@test.net")
password = browser.find_element_by_css_selector('#SubName > input[type="text"]')
password.send_keys("LastName")
time.sleep(2)
submit = browser.find_element_by_css_selector('#SubButton > input[type="submit"]')
submit.click()
time.sleep(2)

# Open the PDF for downloading
url = 'http://technical.traders.com/archive/articlefinal.asp?file=\V26\C07\\131INTR.pdf'
browser.get(url)
time.sleep(10)

# How to simulate the Clicking to Save/Download the PDF here?

【问题讨论】:

    标签: python-3.x selenium firefox


    【解决方案1】:

    您不应该在浏览器中打开文件。一旦你有了文件的 url。获取所有 cookie 的请求会话

    def get_request_session(driver):
        import requests
        session = requests.Session()
        for cookie in driver.get_cookies():
            session.cookies.set(cookie['name'], cookie['value'])
    
        return session
    

    一旦你有会话,你可以使用相同的下载文件

    url = 'http://technical.traders.com/archive/articlefinal.asp?file=\V26\C07\\131INTR.pdf'
    session = get_request_session(driver)
    r = session.get(url, stream=True)
    chunk_size = 2000
    with open('/tmp/mypdf.pdf', 'wb') as file:
        for chunk in r.iter_content(chunk_size):
            file.write(chunk)
    

    【讨论】:

    • 我已在 # How to ... 之后将您的代码附加到我的代码中...实际上下载了 PDF 文件。但它不是一个有效的 PDF 文件。当我打开它时,它无法打开。而且我发现下载的 PDF 的大小比正确的要小得多。我在下面再次发布我的整个代码。你能看看吗?
    【解决方案2】:

    除了Tarun的解决方案,你还可以通过js下载文件,并存储为blob。然后您可以通过 selinium 的执行脚本将数据提取到 python 中,如 in this answer 所示。

    在你的情况下,

    url = 'http://technical.traders.com/archive/articlefinal.asp?file=\V26\C07\\131INTR.pdf'
    browser.execute_script("""
        window.file_contents = null;
        var xhr = new XMLHttpRequest();
        xhr.responseType = 'blob';
        xhr.onload = function() {
            var reader  = new FileReader();
            reader.onloadend = function() {
                window.file_contents = reader.result;
            };
            reader.readAsDataURL(xhr.response);
        };
        xhr.open('GET', %(download_url)s);
        xhr.send();
    """.replace('\r\n', ' ').replace('\r', ' ').replace('\n', ' ') % {
        'download_url': json.dumps(url),
    })
    

    现在您的数据以 blob 形式存在于窗口对象上,因此您可以轻松地将其提取到 python 中:

    time.sleep(3)
    downloaded_file = driver.execute_script("return (window.file_contents !== null ? window.file_contents.split(',')[1] : null);")
    with open('/Users/Chetan/Desktop/dummy.pdf', 'wb') as f:
        f.write(base64.b64decode(downloaded_file))
    

    【讨论】:

    • 我在 # How to...无类型”。我在下面再次发布我的代码。你能看看吗?
    • 尝试在第二部分之前添加等待。我认为这是因为您试图在 onload 函数完成之前获取变量的内容
    • 嗨 TheChetan,我设置了更长的暂停时间,确实下载了 PDF。非常感谢!
    【解决方案3】:

    试试

      import urllib    
      file_path = "<FILE PATH TO SAVE>"
      urllib.urlretrieve(<pdf_link>,file_path)
    

    【讨论】:

      猜你喜欢
      • 2020-08-04
      • 1970-01-01
      • 2018-03-08
      • 2022-10-08
      • 2018-11-13
      • 2017-03-09
      • 2019-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多