【问题标题】:How to download a PDF from an URL that checks sessions and cookies, using python and selenium?如何使用 python 和 selenium 从检查会话和 cookie 的 URL 下载 PDF?
【发布时间】:2018-05-27 09:44:42
【问题描述】:

我要做什么-

我正在尝试自动化-

  1. 登录员工自助服务门户
  2. 单击几个链接可进入以嵌入式 PDF 显示工资单的页面
  3. 下载 PDF

我已经能够使用以下代码完成第 1 步和第 2 步:

from selenium import webdriver
browser = webdriver.Chrome()

#open the site and enter userid and password
browser.get('http://eportal.erp.bsnl.co.in/irj/portal')
userName = browser.find_element_by_css_selector ('#logonuidfield')
userName.send_keys('12345678')
password = browser.find_element_by_css_selector ('#logonpassfield')
password.send_keys('12345678')
password.submit()

#clicking on couple of links to get to the salary statement page 
employeess = browser.find_element_by_css_selector ('#navNodeAnchor_1_1')
employeess.click()
browser.switch_to.frame('pb_100693274')
browser.switch_to.frame('isolatedWorkArea')
payslip = browser.find_element_by_xpath ('//*[@id="aaabGFON.AreaGroupViewStatic.QuickLink12"]/span')
payslip.click()

#get the url for embedded PDF
browser.switch_to.frame('pb_100693274')
browser.switch_to.frame('isolatedWorkArea')
browser.switch_to.frame('aaabLDOL.VcRfwIFrameView.RfwIframe')
url = browser.find_element_by_xpath('//*[@id="plugin"]').get_attribute('src')

当我打印“url”时,我得到的 url 为 -(http://eportal.erp.bsnl.co.in/webdynpro/dispatcher/sap.com/ess~rem/PaySlip2/~wd_key181_1513145812322/unknown.pdf?sap-wd-download=1&sap-wd-cltwndid=WID1513145774222&sap-wd-secure-id=32c76516dfcd11e794e8001a4b09cbd80843296581&sap-ext-sid=yUx3bKEyzSr2CqpOKogWEQ--3Kt0yPvk8X20QivyLzFWEw--%2Fpcd%3Aportal_content%2Fcom.hclt.f_bsnl_content%2Fcom.hclt.f_bp%2Fcom.hclt.f_hcm%2Fcom.hclt.f_ess%2Fcom.hclt.f_copied%2Fcom.hclt.f_roles%2Fcom.sap.pct.erp.ess.employee_self_service%2Fcom.sap.pct.erp.ess.employee_self_service%2Fcom.sap.pct.erp.ess.area_benefits_payment%2Fcom.sap.pct.erp.ess.paycheck%2Fsap.com%2Fess%7Erem%2FPaySlip2%2Fbase&sap-wd-norefresh=X&sap-ep-version=7.0106.20091228220110.0000)

这是动态生成的,所以我尝试使用 wget 下载 PDF

import wget
wget.download(url)

结果是—— '未知.pdf'

但是当我检查这个文件时,它只有 1Kb,打开它会给出“文件可能已损坏的消息”。该文件的大小应为 80Kb 左右。

我尝试过的- 我试图在 New Tab 中打开上面的长网址,它向我显示了 PDF。但是,当我尝试在 新窗口 中打开相同的 url 时,我收到“Session Expired”错误,我认为这是我无法下载完整文件的原因。

我怀疑这意味着服务器在发送文件之前会检查会话/cookie。

有没有办法从上面给定的 url 下载 PDF 文件,从 Chromedriver 启动的用于登录或传递会话/cookie 以及用于下载文件的 url 的同一浏览器窗口?

【问题讨论】:

  • 使用 selenium 获取 cookie 并将它们与相同的用户代理一起添加到您的请求中。您还可以在页面中注入脚本以通过XMLHttpRequest 下载文件。另一种方法是使用首选项禁用 pdf 查看器,单击链接并等待文件下载。
  • Florent B. 能否提供参考或代码 sn-ps。

标签: python-3.x selenium session cookies download


【解决方案1】:

您必须使用正确的选项打开 chrome。然后,您应该能够通过 chrome 下载文件,并调用 browser.get(url)

from selenium import webdriver

# define chrome options and open chrome
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option('prefs',  {
    "download.default_directory": '/path/to/download-directory', # <-- enter your download dir here
    "download.prompt_for_download": False,
    "download.directory_upgrade": True,
    "plugins.always_open_pdf_externally": True
    }
)
browser = webdriver.Chrome(options=chrome_options)

# download pdf
browser.get(url-to-pdf)

【讨论】:

    猜你喜欢
    • 2019-05-28
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 2022-09-27
    • 2013-02-10
    相关资源
    最近更新 更多