【问题标题】:Download PDF using Selenium in Python + save each PDF with an assigned name在 Python 中使用 Selenium 下载 PDF + 使用指定的名称保存每个 PDF
【发布时间】:2022-01-11 09:55:08
【问题描述】:

目的是 1) 为一堆公司抓取一堆 PDF 2) 用相应的公司名称保存它们,全部来自 https://www1.hkexnews.hk/app/appyearlyindex.html?lang=en&board=mainBoard。

我的代码适用于下载 PDF,但负责自动下载的 sn-p 很方便:

chrome_options = Options()
chrome_options.add_experimental_option('prefs', {
"download.default_directory": "/Users/XXX/Downloads", #Change default directory for downloads
"download.prompt_for_download": False, #To auto download the file
"download.directory_upgrade": True,
"plugins.always_open_pdf_externally": True #It will not show PDF directly in chrome
})

我仍然需要使用每个相应公司的名称来保存每个 PDF,而不仅仅是一个随机的 PDF 文件名。可以使用以下方法刮取公司名称:

all_names = driver.find_elements_by_xpath("//div[@class='applicant-name']")

但是如何修改下面的完整代码以包含一个循环,用每个公司名称(而不是随机文件名)保存每个 PDF 文件?

chrome_options = Options()
chrome_options.add_experimental_option('prefs', {
"download.default_directory": "/Users/XXX/Downloads", #Change default directory for downloads
"download.prompt_for_download": False, #To auto download the file
"download.directory_upgrade": True,
"plugins.always_open_pdf_externally": True #It will not show PDF directly in chrome
})

year = str(input("Please enter the year for which you want to download the Application Proofs: "))
link = "https://www1.hkexnews.hk/app/appyearlyindex.html?lang=en&board=mainBoard&year=" + year
print("Now loading: ", link)
print("Found the following companies: ")

driver = webdriver.Chrome('/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/chromedriver',options=chrome_options)
wait = WebDriverWait(driver,10)
driver.get(link)

all_proofs = driver.find_elements_by_xpath("//tr[@class='record-ap-phip']//a[contains(.,'Full Version')]")
all_names = driver.find_elements_by_xpath("//div[@class='applicant-name']")

for i in all_names:
    print('---> ', i.text)

print("\nTotal number of proofs in year ",year,": ",len(all_proofs))
Y = 0
N = 0
for proof in all_proofs:
    try:
        proof.click()
        wait.until(EC.presence_of_element_located((By.XPATH, "//*[@id='warning-statement-dialog']//label[@for='warning-statement-accept']"))).click()
        wait.until(EC.presence_of_element_located((By.XPATH, "//*[@id='warning-statement-dialog']//a[contains(@class,'btn-ok')]"))).click()
        Y += 1
    except Exception as exc:
        exception = f'An exception occurred.'
        N += 1

print("Number of application proofs downloaded: ", Y)
print("Number of exceptions: ", N)

【问题讨论】:

  • 如果您直接查询api calls(将 url 中的年份更改为不同的年份),则可以不使用 Selenium。您将在 json 中找到公司名称和直接 pdf 链接

标签: python selenium pdf web-scraping


【解决方案1】:

正如 RJ Adriaansen 指出的,开发者工具 - 网络 - fetch/XHR 中有一个 JSON 文件,无需 Selenium 即可轻松抓取:

import requests
import re

for year in range(2015,2023):

    data_url = f'https://www1.hkexnews.hk/ncms/json/eds/app_{str(year)}_sehk_e.json?_=1641899494829' #found in the Developer Tools - Network - fetch/XHR
    data = requests.get(data_url).json()

    for company in data['app']:
        filename = re.sub(r'[^\w\-_ ]', '_',company['a'])+'.pdf' #company name remove bad characters for filename
        try:
            pdf_url = 'https://www1.hkexnews.hk/app/'+company['ls'][0]['u1']

        except:
            continue

        pdf_data = requests.get(pdf_url)

        print(f'Saving {filename}')
        with open(filename,'wb') as file:
            file.write(pdf_data.content)

【讨论】:

  • 这可行,但是我需要能够从不同年份获取这些 PDF,而不仅仅是 2022 - 例如 2021 或 2015、2011 等。当我修改您的代码以包括:data_url = '@ 987654321@' + year + '_sehk_e.json?_=1641899494829' #found in the Developer Tools - Network - fetch/XHR` 并输入 year 为 2021,我收到此错误:File "/Users/XXX/Desktop/XXX/05. AP Analysis/AP Proofs/AP Analysis_PDF_downloader 2.py", line 12, in <module> pdf_url = 'https://www1.hkexnews.hk/app/'+company['ls'][0]['u1'] IndexError: list index out of range
  • 我已经编辑了脚本来处理这些年
  • 某些列表没有您要查找的 pdf,在这种情况下,我的脚本将跳过它们
  • 感谢您的尝试,但是该代码仅下载一堆 PDF,每个大小为 2KB,无法打开...有没有办法修复此代码,以便下载完整的 PDF ?
猜你喜欢
  • 2020-12-17
  • 2021-11-09
  • 1970-01-01
  • 2019-04-12
  • 2020-08-04
  • 1970-01-01
  • 2019-05-28
  • 1970-01-01
  • 2021-11-13
相关资源
最近更新 更多