Проблемы с типом файла .requests () - не удается получить PDF-файл из сети доставки контента - PullRequest
0 голосов
/ 02 августа 2020

У меня проблемы с получением содержимого PDF-файлов, найденных здесь , из-за того, что они размещены в сети доставки контента (CDN) под названием Widen.

Приведенный ниже код успешно для ссылок PDF, встроенных в веб-страницу ...

url = 'https://embed.widencdn.net/pdf/plus/widnr/kdlgedcepu/miss_surv_120117.pdf?u=7vkdxn'
    
filepath = r"C:\Users\pathgoeshere\{}.pdf".format('test')
if os.path.exists(filepath):
    pass
else:
    r = requests.get(url)
    with open(filepath, 'wb') as f:
        f.write(r.content)

... но поскольку URL-адрес относится к сети доставки контента, а не к самому PDF-файлу, запрос не возвращает желаемый PDF-файл; при открытии PDF-файла выдается ошибка.

Может ли кто-нибудь помочь в очистке файлов PDF, размещенных через сеть доставки контента?

1 Ответ

1 голос
/ 02 августа 2020

Проблема в том, что вы не получаете PDF-файл из CDN, потому что он инкапсулирует PDF-файл в сценарий, который автоматически устанавливает пароль и перенаправляет ваш запрос на другой URL-адрес. Чтобы загрузить PDF-файл, вы должны сначала извлечь тег скрипта из заголовка, чтобы найти URL-адрес, указывающий на PDF-файл. Затем вам нужно создать второй запрос с точно такими же параметрами, которые устанавливает скрипт:

  1. Signature
  2. Expires
  3. Key-Pair-Id

Второй запрос, чем загрузка pdf.

import os
import requests
import urllib.parse as urlparse

from urllib.parse import parse_qs
from urlextract import URLExtract

from bs4 import BeautifulSoup

url = 'https://embed.widencdn.net/pdf/plus/widnr/rfazsshahb/Fall2017Waterfowl_GreenBay_Survey_Nov.pdf?u=7vkdxn'

filepath = r'C:\Path\{}.pdf'.format('test')
if os.path.exists(filepath):
    pass
else:
    request = requests.get(url)
    html = BeautifulSoup(request .content)
    pdf_script = html.head.find('script', type="text/javascript").string

    # Extract the url
    extractor = URLExtract()
    url_to_pdf = extractor.find_urls(pdf_script)

    # Parse URL
    parsed = urlparse.urlparse(url_to_pdf[0])

    # Get parameters
    signature = parse_qs(parsed.query)['Signature'][0]
    expires = int(parse_qs(parsed.query)['Expires'][0])
    kip = parse_qs(parsed.query)['Key-Pair-Id'][0]

    url = parsed.scheme + "://" + parsed.netloc + parsed.path

    #Build second request
    pdf_request = requests.get(url, params={'Key-Pair-Id': kip, 'Signature': signature, 'Expires': expires})
    print(pdf_request)
    with open(filepath, 'wb') as f:
        f.write(pdf_request.content)

Возможно, вам потребуется установить urlextract, BeautifulSoup

pip install beautifulsoup4
pip install urlextract

Обратите внимание, что это не общее решение и может работать с этим CDN.

...