python - 使用 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
建议的功能......同样的旧。
有什么线索吗?
干杯。
解决方案
您用于执行下载的 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:
推荐阅读
- python - 我可以做哪些调整来完美运行这个脚本?
- datetime - 如何根据日期和时间生成可预测的事件?(随机的)
- sql - 具有连接和不同输出的 SQL 聚合函数
- java - 在java中调用两个不同方法的相同输入
- javascript - 使用 javascript 和 JSON 保存和加载表单数据
- windows - 通过 Powershell 进行 BitLocker 加密 - BitLocker 等待激活
- c# - 单击按钮时如何获取包含按钮的stacklayout?
- json - 使用 jq 从数组 json 中选择值
- google-cloud-platform - 使用谷歌云运行简单的代理脚本时出现 403 Forbidden
- python - PyMongo $regex 跨所有文本字段和子字段