.requests() 文件类型问题 - 无法从 Content Delivery Network 获取 PDF
.requests() file type issues - Can't get PDF from Content Delivery Network
我无法获取找到的 PDF 内容 here,因为它们由名为 Widen 的内容分发网络 (CDN) 托管。
下面的代码在网页中嵌入的 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 本身,因此请求不会 return 所需的 pdf;打开 pdf 时出现错误。
任何人都可以帮助抓取通过内容分发网络托管的 pdf 文件吗?
您无法从 CDN 获取 pdf 的问题,因为它将 pdf 封装在一个脚本中,该脚本会自动设置密码并将您的请求重定向到另一个 URL。要下载 pdf,您必须首先从 header 中提取脚本标签以找到指向 pdf 的 url。然后您必须使用脚本设置的完全相同的参数构建第二个请求:
- 签名
- 过期
- 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。
我无法获取找到的 PDF 内容 here,因为它们由名为 Widen 的内容分发网络 (CDN) 托管。
下面的代码在网页中嵌入的 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 本身,因此请求不会 return 所需的 pdf;打开 pdf 时出现错误。
任何人都可以帮助抓取通过内容分发网络托管的 pdf 文件吗?
您无法从 CDN 获取 pdf 的问题,因为它将 pdf 封装在一个脚本中,该脚本会自动设置密码并将您的请求重定向到另一个 URL。要下载 pdf,您必须首先从 header 中提取脚本标签以找到指向 pdf 的 url。然后您必须使用脚本设置的完全相同的参数构建第二个请求:
- 签名
- 过期
- 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。