【问题标题】:.requests() file type issues - Can't get PDF from Content Delivery Network.requests() 文件类型问题 - 无法从 Content Delivery Network 获取 PDF
【发布时间】:2020-08-02 07:19:48
【问题描述】:

我无法获取找到 here 的 PDF 的内容,因为它们由名为 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 本身,因此请求不会返回所需的 pdf;打开pdf时会抛出错误。

任何人都可以帮助抓取通过内容交付网络托管的 pdf 文件吗?

【问题讨论】:

    标签: python pdf web-scraping request cdn


    【解决方案1】:

    您没有从 CDN 获取 pdf 的问题,因为它会将 pdf 封装在一个脚本中,该脚本会自动设置密码并将您的请求重定向到另一个 URL。为了下载 pdf,您必须首先从标题中提取脚本标签以找到指向 pdf 的 url。然后你必须使用脚本设置的完全相同的参数构建第二个请求:

    1. 签名
    2. 过期
    3. 密钥对 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。

    【讨论】:

    • 干得好!这是一个很好的答案;直接但解释性的。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-09-07
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 2019-03-16
    相关资源
    最近更新 更多