我想使用Python下载PDF文件。我知道有几个关于此问题的常见问题解答。但是,我只能找到URL
遵循这种格式http://www.example.com/example.pdf
的情况。
我用来下载文件的URL
是:http://dof.gob.mx/nota_to_pdf.php?fecha=25/07/2018&edicion=MAT
。如果打开浏览器并将URL
粘贴到搜索栏中,则会被带到空白页,系统会提示我保存文件。
当我尝试使用几个教程站点中显示的方法,或者尝试遵循在其他SO问题中找到的建议时,我只能下载HTML,当我尝试使用{ {1}}。
任何帮助将不胜感激。
答案 0 :(得分:2)
您好,欢迎来到Stack Overflow!
如果您想使用 Python ,请使用requests
library来获取初始页面以检出内容(您首先需要通过{{1 }}或pip
):
pipenv
如果您浏览该HTML,则会发现页面加载时页面使用>>> import requests
>>> r = requests.get('http://dof.gob.mx/nota_to_pdf.php?fecha=25/07/2018&edicion=MAT')
>>> r.status_code
200
>>> r.headers['content-type']
'text/html; charset=UTF-8'
>>> r.encoding
'UTF-8'
>>> r.text
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r\n<html
xmlns="http://www.w3.org/1999/xhtml">\r\n<head>\r\n<meta http-equiv="Content-
Type" content="text/html; charset=utf-8" />\r\n<title>Diario Oficial de la
Federación</title>\r\n</head>\r\n\r\n<body>\r\n<script>\r\n
(function(i,s,o,g,r,a,m){i[\'GoogleAnalyticsObject\']=r;i[r]=i[r]||function() .
{\r\n (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new
Date();a=s.createElement(o),\r\n m=s.getElementsByTagName(o
[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\r\n })
(window,document,\'script\',\'//www.google-
analytics.com/analytics.js\',\'ga\');\r\n\r\n ga(\'create\', \'UA-32467343-1\', \'auto\');\r\n
ga(\'send\', \'pageview\');\r\n\r\n</script>\r\n</body>\r\n</html><script>
self.location=(\'abrirPDF.php?archivo=25072018-MAT.pdf&anio=2018&repo=\');
</script><html>\n<head>\n<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1">\n\t<script>\n\tfunction BorrarPDF()
\n\t{\n\t\tdocument.getElementById(\'cerrar\').src=\'cerrar_doc_imagen.php
archivo=\'+document.getElementById(\'pdf\').value;\n\t}\n\t
</script>\n</head>\n<body onUnload="BorrarPDF()">\n\n
<input type="hidden" value="25072018-MAT.pdf" id="pdf" name="pdf">\n\n
<iframe id="cerrar" width="1px" height="1px" scrolling="no"
frameborder="0" marginwidth="0px" marginheight="0px">
</iframe>\n\n</body>\n</html>\n'
重定向到PDF文件。
PDF的实际 URL是:
self.location
因此,如果您再次使用http://dof.gob.mx/abrirPDF.php?archivo=25072018-MAT.pdf&anio=2018&repo=
库执行相同的过程,则这次指定实际的PDF文件:
requests
现在,请求正文中有PDF。
您可以使用>>> import requests
>>> r = requests.get('http://dof.gob.mx/abrirPDF.php?archivo=25072018-MAT.pdf&anio=2018&repo=')
>>> r.status_code
200
>>> r.headers['content-type']
'application/pdf'
做同样的事情-您只需要确保抓到了正确的东西即可(这显然是被网页javascript函数所迷惑,可能是设计使然)。
希望对您有帮助!
答案 1 :(得分:0)
一个带有进度条的功能:
from tqdm import tqdm
import requests
def download_file( url, filename):
response = requests.get(url, stream=True)
with open(filename, "wb") as handle:
for data in tqdm(response.iter_content()):
handle.write(data)