【问题标题】:python urllib / requests fails to download file but browser doespython urllib / requests 无法下载文件,但浏览器可以
【发布时间】:2015-07-07 21:29:52
【问题描述】:

我正在尝试下载此zip file。 zip 文件通过 chrome 正确下载,但使用 requests 或 urllib 失败并出现 400 Bad Request 错误。

>> import requests
>> import urllib

>> url = 'http://prd-enforce-xfr-02.dol.gov/../data_catalog/EBSA/ebsa_ocats_20150703.csv.zip'
>> r = requests.get(url)
>> r.ok
False
>> r.headers
{'content-length': '254', 'content-encoding': 'gzip', 'vary': 'Accept-Encoding', 'server': 'Apache/2.2.14 (Ubuntu)', 'connection': 'close', 'date': 'Tue, 07 Jul 2015 20:39:55 GMT', 'content-type': 'text/html; charset=iso-8859-1'}
>> r
<Response [400]>
>> r.text
u'<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">\n<html><head>\n<title>400 Bad Request</title>\n</head><body>\n<h1>Bad Request</h1>\n<p>Your browser sent a request that this server could not understand.<br />\n</p>\n<hr>\n<address>Apache/2.2.14 (Ubuntu) Server at prd-enforce-xfr-02.dol.gov Port 80</address>\n</body></html>\n'

>> z = urllib.urlopen(url)
>> z.read()
'<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">\n<html><head>\n<title>400 Bad Request</title>\n</head><body>\n<h1>Bad Request</h1>\n<p>Your browser sent a request that this server could not understand.<br />\n</p>\n<hr>\n<address>Apache/2.2.14 (Ubuntu) Server at prd-enforce-xfr-02.dol.gov Port 80</address>\n</body></html>\n'

我尝试过(但失败了)的事情:

  • 欺骗 User-Agent 标头。

  • 使用请求会话持久化 cookie

.

【问题讨论】:

    标签: python python-requests urllib


    【解决方案1】:

    Chrome 和 Firefox 去掉了“..”,所以请求的有效 URL 是

    http://prd-enforce-xfr-02.dol.gov/data_catalog/EBSA/ebsa_ocats_20150703.csv.zip
    

    删除 .. 在您的请求中,它应该可以工作。

    【讨论】:

      【解决方案2】:

      从网址中删除无关的 /..。它可以在浏览器中运行,因为浏览器会为您规范化 url。没有 /.. 这适用于 urllib 或请求。

      【讨论】:

        猜你喜欢
        • 2017-10-02
        • 1970-01-01
        • 2021-10-20
        • 2019-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-05
        • 1970-01-01
        相关资源
        最近更新 更多