L oop страниц и скачать pdf файлы с сайта в Python - PullRequest
1 голос
/ 29 апреля 2020

Я хочу скачать pdf-файлы по этой ссылке ,

enter image description here

На данный момент я могу скачать один файл используя следующий код:

import shutil
import requests
import os
from urllib.parse import urlparse

url = "http://pdf.savills.asia/asia-pacific-research/china-research/shanghai-research/shanghai-office/20q1-sh-office-cn.pdf"
# file_name = url.split("/")[-1]
file_name = os.path.basename(urlparse(url).path)

r = requests.get(url, stream=True)
r.raw.decode_content = True

with open("20q1-sh-office-cn.pdf", 'wb') as f:
        shutil.copyfileobj(r.raw, f)
# with open("./{}".format(file_name), 'wb') as f:
#     shutil.copyfileobj(r.raw, f)

Но теперь я не знаю, как найти и извлечь все URL-ссылки PDF-файлов и загрузить их, я попробовал следующий код:

from bs4 import BeautifulSoup

url = 'https://www.savills.com.cn/insight-and-opinion/research.aspx?rc=China&p=%E5%95%86%E4%B8%9A%E6%A5%BC%E5%AE%87&t=&f=date&q=&page={}'
for page in range(10):
    r = requests.get(url + str(page))
    soup = BeautifulSoup(r.content, "html.parser")
    for link in soup.find_all("a"):
        print("<a href='>%s'>%s</a>" % (link.get("href"), link.text))

Обратите внимание, что xpath URL файла PDF: //*[@id="ListingContainer"]/div[1]/article[1]/div[1]/div/header/h3/a

Ответы [ 2 ]

2 голосов
/ 29 апреля 2020

Если у вас BS 4.7.1 или выше, попробуйте воспользоваться селектором css, чтобы получить ссылки в формате pdf.

from bs4 import BeautifulSoup

url = 'https://www.savills.com.cn/insight-and-opinion/research.aspx?rc=China&p=%E5%95%86%E4%B8%9A%E6%A5%BC%E5%AE%87&t=&f=date&q=&page={}'
for page in range(2):
    r = requests.get(url.format(page))
    soup = BeautifulSoup(r.content, "html.parser")
    for link in soup.select("h3[class='sv-card-title']>a"):
        print(link.text)
        print(link.get("href"))

Обновление :

import shutil
from bs4 import BeautifulSoup
import requests
import os
from urllib.parse import urlparse

url = 'https://www.savills.com.cn/insight-and-opinion/research.aspx?rc=China&p=%E5%95%86%E4%B8%9A%E6%A5%BC%E5%AE%87&t=&f=date&q=&page={}'
for page in range(2):
    r = requests.get(url.format(page))
    soup = BeautifulSoup(r.content, "html.parser")
    for link in soup.select("h3[class='sv-card-title']>a"):
        r = requests.get(link.get("href"), stream=True)
        r.raw.decode_content = True
        with open(link.text+'.pdf', 'wb') as f:
            shutil.copyfileobj(r.raw, f)
0 голосов
/ 29 апреля 2020

Другое решение на основе KunduK:

import shutil
import requests
import os
from urllib.parse import urlparse
from bs4 import BeautifulSoup

def download_pdf(file_name, url):
    r = requests.get(url, stream=True)

    with open("./{}.pdf".format(file_name), 'wb') as f:
        f.write(r.content)

url = 'https://www.savills.com.cn/insight-and-opinion/research.aspx?rc=China&p=%E5%95%86%E4%B8%9A%E6%A5%BC%E5%AE%87&t=&f=date&q=&page={}'
for page in range(2):
    r = requests.get(url.format(page))
    soup = BeautifulSoup(r.content, "html.parser")
    for link in soup.select("h3[class='sv-card-title']>a"):
        print(link.text)
        print(link.get("href"))
        download_pdf(link.text, link.get("href"))
...