Python 使用 urllib2 下载 PDF 会创建损坏的文档

Python downloading PDF with urllib2 creates corrupt document

上周我定义了一个从期刊网站下载 pdf 的函数。我使用以下方法成功下载了几个 pdf:

import urllib2
def pdfDownload(url):
    response=urllib2.urlopen(url)
    expdf=response.read()
    egpdf=open('ex.pdf','wb')
    egpdf.write(expdf)
    egpdf.close()

我尝试了这个功能:

 pdfDownload('http://pss.sagepub.com/content/26/1/3.full.pdf')

当时,《心理科学》杂志上的 URL 就是这样排版的。下载的pdf就好了。

然后我又写了一些代码来实际生成 URL 列表并适当地命名文件,这样我就可以一次下载大量适当命名的 pdf 文档。

当我回来将我的两个脚本连接在一起时(抱歉使用非技术语言;我不是专家,只是自学了基础知识)相关期刊上 URLs 的格式有变了。在前面的 URL 之后,您将转到带有 URL 'http://journals.sagepub.com/doi/pdf/10.1177/0956797614553009' 的页面。现在 pdfDownload 功能不再起作用(无论是原始的 URL 还是新的 URL)。它创建了一个无法打开的 pdf "because the file is not a supported file type or has been damaged".

我很困惑,似乎所有的改变都是 URL 的格式,但实际上必须改变其他东西才能导致这个?任何帮助将不胜感激。

问题是新的 URL 指向一个网页——而不是原始的 PDF。如果您打印 "expdf" 的值,您将得到一堆 HTML——而不是您期望的二进制数据。

我能够通过一个小的调整让您的原始功能正常工作——我使用 requests 库而不是 urllib2 下载文件。 requests 似乎使用您从当前实施中获得的 html 中引用的加载程序提取文件。试试这个:

import requests
def pdfDownload(url):
    response=requests.get(url)
    expdf=response.content
    egpdf=open('ex.pdf','wb')
    egpdf.write(expdf)
    egpdf.close()

如果您正在使用 Python 3,则您已经拥有 requests;如果您使用 Python 2.7,则需要 pip install requests.