【问题标题】:Python requests or urllib read timeout, URL encoding issue?Python 请求或 urllib 读取超时,URL 编码问题?
【发布时间】:2015-09-29 18:20:19
【问题描述】:

我正在尝试从 Python 中下载文件,我尝试了 urllib 和 requests,但都给我一个超时错误。文件位于:http://www.prociv.pt/cnos/HAI/Setembro/Incêndios%20Rurais%20-%20Histórico%20do%20Dia%2029SET.pdf

使用请求:

r = requests.get('http://www.prociv.pt/cnos/HAI/Setembro/Incêndios%20Rurais%20-%20Histórico%20do%20Dia%2029SET.pdf',timeout=60.0)

使用 urllib:

urllib.urlretrieve('http://www.prociv.pt/cnos/HAI/Setembro/Incêndios%20Rurais%20-%20Histórico%20do%20Dia%2029SET.pdf','the.pdf')

我尝试过不同的网址,例如:

而且,我可以使用浏览器下载它,也可以使用以下语法使用 cURL:

curl http://www.prociv.pt/cnos/HAI/Setembro/Inc%C3%AAndios%20Rurais%20-%20Hist%C3%B3rico%20do%20Dia%2029SET.pdf

所以我怀疑这是一个编码问题,但我似乎无法让它工作。有什么建议吗?

编辑:清晰度。

【问题讨论】:

    标签: python pdf python-requests urllib


    【解决方案1】:

    看起来服务器响应不同,具体取决于客户端用户代理。如果您指定自定义 User-Agent 标头,服务器会以 PDF 响应:

    import requests
    import shutil
    
    url = 'http://www.prociv.pt/cnos/HAI/Setembro/Inc%C3%AAndios%20Rurais%20-%20Hist%C3%B3rico%20do%20Dia%2028SET.pdf'
    headers = {'User-Agent': 'curl'}  # wink-wink
    response = requests.get(url, headers=headers, stream=True)
    
    if response.status_code == 200:
        with open('result.pdf', 'wb') as output:
            response.raw.decode_content = True
            shutil.copyfileobj(response.raw, output)
    

    演示:

    >>> import requests
    >>> url = 'http://www.prociv.pt/cnos/HAI/Setembro/Inc%C3%AAndios%20Rurais%20-%20Hist%C3%B3rico%20do%20Dia%2028SET.pdf'
    >>> headers = {'User-Agent': 'curl'}  # wink-wink
    >>> response = requests.get(url, headers=headers, stream=True)
    >>> response.headers['content-type']
    'application/pdf'
    >>> response.headers['content-length']
    '466191'
    >>> response.raw.read(100)
    '%PDF-1.5\r\n%\xb5\xb5\xb5\xb5\r\n1 0 obj\r\n<</Type/Catalog/Pages 2 0 R/Lang(pt-PT) /StructTreeRoot 37 0 R/MarkInfo<</'
    

    我的猜测是,有人滥用 Python 脚本从该服务器下载了太多文件,并且仅根据 User-Agent 标头对您进行了 tar 处理。

    【讨论】:

    • 谢谢!很简单,很痛。我会尽快接受答案。
    猜你喜欢
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    相关资源
    最近更新 更多