使用Python请求模块下载并保存PDF文件
我正在尝试从网站下载PDF文件并将其保存到磁盘。我的尝试要么因编码错误而失败,要么导致PDF空白使用Python请求模块下载并保存PDF文件,python,python-2.7,python-requests,Python,Python 2.7,Python Requests,我正在尝试从网站下载PDF文件并将其保存到磁盘。我的尝试要么因编码错误而失败,要么导致PDF空白 In [1]: import requests In [2]: url = 'http://www.hrecos.org//images/Data/forweb/HRTVBSH.Metadata.pdf' In [3]: response = requests.get(url) In [4]: with open('/tmp/metadata.pdf', 'wb') as f: ...:
In [1]: import requests
In [2]: url = 'http://www.hrecos.org//images/Data/forweb/HRTVBSH.Metadata.pdf'
In [3]: response = requests.get(url)
In [4]: with open('/tmp/metadata.pdf', 'wb') as f:
...: f.write(response.text)
---------------------------------------------------------------------------
UnicodeEncodeError Traceback (most recent call last)
<ipython-input-4-4be915a4f032> in <module>()
1 with open('/tmp/metadata.pdf', 'wb') as f:
----> 2 f.write(response.text)
3
UnicodeEncodeError: 'ascii' codec can't encode characters in position 11-14: ordinal not in range(128)
In [5]: import codecs
In [6]: with codecs.open('/tmp/metadata.pdf', 'wb', encoding='utf8') as f:
...: f.write(response.text)
...:
[1]中的:导入请求
在[2]中:url=http://www.hrecos.org//images/Data/forweb/HRTVBSH.Metadata.pdf'
在[3]中:response=requests.get(url)
在[4]中:以open('/tmp/metadata.pdf',wb')作为f:
…:f.write(response.text)
---------------------------------------------------------------------------
UnicodeEncodeError回溯(最近一次呼叫最后一次)
在()
1将open('/tmp/metadata.pdf',wb')作为f:
---->2 f.编写(响应.文本)
3.
UnicodeEncodeError:“ascii”编解码器无法对位置11-14中的字符进行编码:序号不在范围内(128)
在[5]中:导入编解码器
[6]中:使用codecdes.open('/tmp/metadata.pdf',wb',encoding='utf8')作为f:
…:f.write(response.text)
...:
我知道这是某种编解码器问题,但我似乎无法使其正常工作。您应该使用
响应。在这种情况下,content
:
with open('/tmp/metadata.pdf', 'wb') as f:
f.write(response.content)
发件人:
对于非文本请求,您还可以以字节形式访问响应正文:
>>> r.content
b'[{"repository":{"open_issues":0,"url":"https://github.com/...
这意味着:response.text
将输出作为字符串对象返回,在下载文本文件时使用它。例如HTML文件等
和response.content
将输出作为bytes对象返回,在下载二进制文件时使用它。例如PDF文件、音频文件、图像等
。但是,当您要下载的文件很大时,请使用它。以下是您也可以在文档中找到的基本示例:
import requests
url = 'http://www.hrecos.org//images/Data/forweb/HRTVBSH.Metadata.pdf'
r = requests.get(url, stream=True)
with open('/tmp/metadata.pdf', 'wb') as fd:
for chunk in r.iter_content(chunk_size):
fd.write(chunk)
chunk\u size
是要使用的块大小。如果将其设置为2000
,则请求将下载该文件的第一个2000
字节,并将其写入该文件,然后一次又一次地执行此操作,除非完成
这样可以节省你的内存。但是我更喜欢在这种情况下使用response.content
,因为您的文件很小。如您所见,使用响应。原始非常复杂
涉及:
关于Kevin在文件夹tmp
中写入的答案,应该是这样的:
with open('./tmp/metadata.pdf', 'wb') as f:
f.write(response.content)
他在地址之前忘记了
,当然你的文件夹tmp
应该已经在Python 3中创建了,我发现pathlib是最简单的方法。Request的response.content与pathlib的write_字节完美结合
from pathlib import Path
import requests
filename = Path('metadata.pdf')
url = 'http://www.hrecos.org//images/Data/forweb/HRTVBSH.Metadata.pdf'
response = requests.get(url)
filename.write_bytes(response.content)
请注意我是初学者。如果我的解决方案错误,请随时更正和/或让我知道。我也可能学到一些新东西
我的解决方案:
相应地将下载路径更改为要保存文件的位置。您也可以随意使用绝对路径
将以下文件另存为downloadFile.py
用法:python downloadFile.py用于下载新文件名的文件的url。扩展名
记住添加扩展名强>
用法示例:python downloadFile.pyhttp://www.google.co.uk google.html
import requests
import sys
import os
def downloadFile(url, fileName):
with open(fileName, "wb") as file:
response = requests.get(url)
file.write(response.content)
scriptPath = sys.path[0]
downloadPath = os.path.join(scriptPath, '../Downloads/')
url = sys.argv[1]
fileName = sys.argv[2]
print('path of the script: ' + scriptPath)
print('downloading file to: ' + downloadPath)
downloadFile(url, downloadPath + fileName)
print('file downloaded...')
print('exiting program...')
您可以使用urllib:
import urllib.request
urllib.request.urlretrieve(url, "filename.pdf")
一般来说,这应该在Python3中起作用:
import urllib.request
..
urllib.request.get(url)
记住,在Python2之后,urllib和urllib2不能正常工作
如果在某些神秘的情况下请求不起作用(发生在我身上),您也可以尝试使用
wget.download(url)
相关的:
以下是在网页上查找和下载所有pdf文件的合理解释/解决方案:
1-凯文没有想到要在tmp
中写作,就像在OP的问题中一样。2./tmp
目录是Unix系统中的tmp,位于/tmp
,无
,谢谢您发布此信息。最初的问题是Python2.7,但我已经继续,现在使用Python3。我不知道pathlib库[版本3.4中新增]的情况,并将其纳入我当前的项目中。它提供了544
,文件已损坏,有什么想法吗?@ahbon,你是什么意思?酷,谢谢你提供有关response的更多信息。raw.Pawel,谢谢你的回答。当我第一次发布这个问题时,我是一个Python新手。现在我非常熟悉这门语言。wget或curl等实用工具可以涵盖编写Python脚本从命令行下载文件的用例。此外,您的函数downloadFile as post似乎在调用自身。您是否打算缩进第二段代码?在stackoverflow中,您可以通过取消凹痕来纠正此问题。我还建议您看看Python的argparse库。您可以使用它来创建漂亮的命令行实用程序。它将为您处理参数。我非常喜欢您使用上下文管理器(具有open…as file:,等等)来处理文件写入。你的代码写得很整齐。您正走在学习Python的良好道路上。祝你好运谢谢你的回复,@Jim!我编辑了这篇文章,事实上,我并没有“打算缩进”:D程序的主要部分。谢谢你的建议!:)这是最好的,tbh。这是最好的urlretrieve
依赖于全局设置来确定请求头,这使得它不适合某些用例。