首页 > 解决方案 > 使用 urllib 在 python 中下载 pdf 文件会导致一些 html 垃圾

问题描述

我正在尝试使用 Python 3 下载文件urllib,但我得到了一些 html 垃圾而不是实际文件。但是,如果我使用浏览器,我可以下载文件就好了。一个最小的非工作示例:

import urllib.request

url = 'https://contrataciondelestado.es/wps/wcm/connect/PLACE_es/Site/area/docAccCmpnt?srv=cmpnt&cmpntname=GetDocumentsById&source=library&DocumentIdParam=ecd194a4-82e1-4fd2-8135-616622234f9b'

urllib.request.urlretrieve(url,'blah.pdf')

我还尝试了这个线程中的两个答案(创建用户代理并使用requests模块)......但同样没有。

使用requests

import requests

url = 'https://contrataciondelestado.es/wps/wcm/connect/PLACE_es/Site/area/docAccCmpnt?srv=cmpnt&cmpntname=GetDocumentsById&source=library&DocumentIdParam=ecd194a4-82e1-4fd2-8135-616622234f9b'
r = requests.get(url, allow_redirects=True)
with open('test.pdf', 'wb') as f:
    f.write(r.content)
print(r.is_redirect)

同样的胡言乱语,requests模块说传递的 URL 不是重定向

我还尝试了更多“复杂”的东西,比如这里download_file建议的功能......同样的旧。

有什么线索吗?

干杯。

标签: pythonpython-3.xhttp

解决方案


您用于执行下载的 URL 不是最后一个,有一个重定向(来自 HTML 源)。

$ curl -I "https://contrataciondelestado.es/wps/wcm/connect/PLACE_es/Site/area/docAccCmpnt?srv=cmpnt&cmpntname=GetDocumentsById&source=library&DocumentIdParam=ecd194a4-82e1-4fd2-8135-616622234f9b"
HTTP/1.1 200 OK
Date: Tue, 11 Sep 2018 09:44:41 GMT
ETag: "-1462112711"
Content-Length: 435
Expires: Thu, 01 Dec 1994 16:00:00 GMT
Cache-Control: no-cache="set-cookie, set-cookie2"
Vary: Accept-Encoding
Content-Type: text/html; charset=UTF-8
Content-Language: en-US
Location: https://contrataciondelestado.es
Set-Cookie: JSESSIONID=0000t4dCqcAT246C2R0a6jwMpsq:prodnod5; Path=/; Domain=.contrataciondelestado.es; Secure
Set-Cookie:  JSESSIONID=0000t4dCqcAT246C2R0a6jwMpsq:prodnod5; Path=/; Domain=.contrataciondelestado.es; Secure
Connection: close


<link
    href='/wps/CacheProxyServlet/colorPalette/default/browserVendor/unknown/browserName/Default+HTML+Client/browserVersion/unknown/locale/es/forwardurl/TemaPlace/themes/html/TemaPlace/./styles.jsp'
    rel="styleSheet" type="text/css">

<meta http-equiv="refresh" content="0;url='/wps/wcm/connect/bb876769-1b16-4f8b-84fc-b85d5f864e07/DOC20120619092407Pliego+campamentos+verano.pdf?MOD=AJPERES'">

您必须从meta http-equiv="refresh"标签中提取正确的 URL:

https://contrataciondelestado.es/wps/wcm/connect/bb876769-1b16-4f8b-84fc-b85d5f864e07/DOC20120619092407Pliego+campamentos+verano.pdf?MOD=AJPERES


推荐阅读