首页 > 解决方案 > 从部分 href 下载和保存 PDF?

问题描述

我正在尝试从以下位置下载并保存所有文件:https ://www.bankia.es/es/pymes-y-autonomos/buscador-documentacion-precontractual

有超过 1200 个文件可用,所以我在考虑使用某种循环。我意识到它们都包含相同的部分 href:href="/estaticos/documentosPRIIPS/xxxx.PDF"

这是我尝试过的:

soup = BeautifulSoup(html_doc, 'html.parser')
savepath = 'my_path' # set the desired path here for the files


options = webdriver.ChromeOptions() 
options.add_experimental_option('prefs',  {
    "download.default_directory": "my_path",
    "download.prompt_for_download": False,
    "download.directory_upgrade": True,
    "plugins.always_open_pdf_externally": True
    }
)
url_bankia= "https://www.bankia.es/es/pymes-y-autonomos/buscador-documentacion-precontractual"
bankia_request = requests.get(url_bankia)
bankia_web = BeautifulSoup(bankia_request.text, "html.parser")
bankia_web.find_all("a", href=re.compile(r"^/estaticos/documentosPRIIPS/"))

标签: pythonweb-scrapingbeautifulsoup

解决方案


当您可以使用 requests 模块实现相同功能时,为什么还要使用 selenium?事实证明,这个URL包含 json 响应,您可以从中提取值,nombre_de_fichero然后添加到它的最后一部分,https://www.bankia.es/estaticos/documentosPRIIPS/以建立到 pdf 文件的完整链接。一个这样的链接应该看起来像https://www.bankia.es/estaticos/documentosPRIIPS/AC-AM-AP-EX-12M-EUR-CAD-20190508.PDF

以下脚本将在您的桌面位置创建一个文件夹,命名PdfFolder为应该在其中下载文件。

import os
import requests

link = 'https://www.bankia.es/estaticos/documentosPRIIPS/json/jsonSimple.txt'
base = 'https://www.bankia.es/estaticos/documentosPRIIPS/{}'

dirf = os.environ['USERPROFILE'] + "\Desktop\PdfFolder"
if not os.path.exists(dirf):os.makedirs(dirf)
os.chdir(dirf)

res = requests.get(link,headers={"User-Agent":"Mozilla/5.0"})
for item in res.json():
    if not 'nombre_de_fichero' in item: continue
    link = base.format(item['nombre_de_fichero'])
    filename = item['nombre_de_fichero'].split('.')[-2] + ".PDF"
    with open(filename, 'wb') as f:
        f.write(requests.get(link).content)

推荐阅读