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