如何使用python或curl下载PDF?

时间:2018-07-25 22:50:58

标签: python curl request

我想使用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}}。

任何帮助将不胜感激。

2 个答案:

答案 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)