Pobieram pliki PDF z różnych adresów URL przy użyciu wbudowanego interfejsu API.

Wynik mojego końca powinien być pobieranie plików z każdego unikalnego łącza (zidentyfikowanego jako links w poniższym kodzie) do unikalnych folderów (folder_location w kodzie) na pulpicie.

Jestem dość zdziwiony przez jak powinienem zorganizować kody, aby to zrobić, ponieważ wciąż jestem nowicjuszem. Do tej pory próbowałem.

import os
import requests
from glob import glob
import time
from urllib.parse import urljoin
from bs4 import BeautifulSoup

links = ["P167897", "P173997", "P166309"]

folder_location = "/pdf/"


for link, folder in zip(links, folder_location):
    time.sleep(10)
    end_point = f"https://search.worldbank.org/api/v2/wds?" \
                f"format=json&includepublicdocs=1&" \
                f"fl=docna,lang,docty,repnb,docdt,doc_authr,available_in&" \
                f"os=0&rows=20&proid={link}&apilang=en"
    documents = requests.get(end_point).json()["documents"]
    for document_data in documents.values():
        try:
            pdf_url = document_data["pdfurl"]
            filename = os.path.join(folder,pdf_url.split('/')[-1])
            with open(filename, 'wb') as f:
                f.write(requests.get(pdf_url).content)

Edytuj: Aby wyjaśnić, obiekty w links są identyfikatorem na podstawie których linki do plików PDF należy zidentyfikować z API.

0
crackers 14 marzec 2021, 05:20

1 odpowiedź

Najlepsza odpowiedź

Możesz spróbować użyć modułu pathlib.

Oto jak:

import os
import time
from pathlib import Path

import requests

links = ["P167897", "P173997", "P166309"]

for link in links:
    end_point = f"https://search.worldbank.org/api/v2/wds?" \
                f"format=json&includepublicdocs=1&" \
                f"fl=docna,lang,docty,repnb,docdt,doc_authr,available_in&" \
                f"os=0&rows=20&proid={link}&apilang=en"
    documents = requests.get(end_point).json()["documents"]
    for document_data in documents.values():
        try:
            pdf_url = document_data["pdfurl"]
            file_path = Path(f"pdf/{link}/{pdf_url.rsplit('/')[-1]}")
            file_path.parent.mkdir(parents=True, exist_ok=True)
            with file_path.open("wb") as f:
                f.write(requests.get(pdf_url).content)
            time.sleep(10)
        except KeyError:
            continue

To wyjściowe pliki do:

pdf/
└── P167897
    ├── Official-Documents-First-Restatement-to-the-Disbursement-Letter-for-Grant-D6810-SL-and-for-Additional-Financing-Grant-TF0B4694.pdf
    └── Official-Documents-Grant-Agreement-for-Additional-Financing-Grant-TF0B4694.pdf
    ...
1
baduker 14 marzec 2021, 08:38