1

我使用 Bing API 在 Python 2.6 中编写了一个网络爬虫,它搜索某些文档,然后下载它们以便稍后进行分类。我一直在使用字符串方法并urllib.urlretrieve()下载 URL 以 .pdf、.ps 等结尾的结果,但是当文档“隐藏”在以下 URL 后面时,我遇到了麻烦:

http://www.oecd.org/officialdocuments/displaydocument/?cote=STD/CSTAT/WPNA(2008)25&docLanguage=En

所以,两个问题。一般有没有办法判断一个 URL 是否有一个 pdf/doc 等文件,如果它没有明确地链接到它(例如 www.domain.com/file.pdf)?有没有办法让 Python 抓住那个文件?

编辑:感谢您的回复,其中一些建议下载文件以查看其类型是否正确。唯一的问题是……我不知道该怎么做(见上面的问题 #2)。urlretrieve(<above url>)只给出一个 html 文件,其 href 包含相同的 url。

4

7 回答 7

8

没有办法从 URL 告诉你它会给你什么。即使它以它结尾,.pdf它仍然可以为您提供 HTML 或它喜欢的任何内容。

你可以做一个 HEAD 请求并查看内容类型,如果服务器没有对你撒谎,它会告诉你它是否是 PDF。

或者,您可以下载它,然后确定您得到的是否是 PDF。

于 2010-10-21T15:14:00.630 回答
5

在这种情况下,您所说的“未在 URL 中明确引用的文档”似乎就是所谓的“重定向”。基本上,服务器会告诉您必须从另一个 URL 获取文档。通常,python 的 urllib 会自动跟随这些重定向,以便您最终得到正确的文件。(并且 - 正如其他人已经提到的 - 您可以检查响应的 mime-type 标头以查看它是否是 pdf)。

但是,有问题的服务器在这里做了一些奇怪的事情。您请求该 url,它会将您重定向到另一个 url。您请求另一个网址,它会再次将您重定向到相同的网址!再一次……再一次……在某些时候,urllib 认为这已经足够了,并将停止跟踪重定向,以避免陷入无限循环。

那么,当您使用浏览器时,您如何能够获得 pdf 文件呢?因为显然,如果您启用了 cookie,服务器只会提供 pdf。(为什么?你必须问负责服务器的人......)如果你没有 cookie,它只会永远重定向你。

(检查urllib2cookielib模块以获得对 cookie 的支持,本教程可能会有所帮助)

至少,我认为这是造成问题的原因。我实际上还没有尝试过使用cookies。也可能是服务器不“想要”提供 pdf,因为它检测到您没有使用“普通”浏览器(在这种情况下,您可能需要摆弄 User-Agent 标头),但它这样做是一种奇怪的方式。所以我的猜测是它在某个地方使用“会话 cookie”,如果你还没有,继续尝试重定向。

于 2010-10-21T16:11:37.593 回答
2

如前所述,无法从 URL 中区分内容类型。但是,如果您不介意获取每个 URL 的标头,您可以这样做:

obj = urllib.urlopen(URL)

headers = obj.info()
if headers['Content-Type'].find('pdf') != -1:
   # we have pdf file, download whole
...

这样您就不必只下载每个 URL 的标题。它仍然不能完全节省网络流量,但你不会比这更好。

你也应该使用 mime-types 而不是我粗略的 find('pdf')。

于 2010-10-21T15:23:12.993 回答
0

不,不可能仅仅通过查看 URL 来判断 URL 引用了哪种资源。当您请求某个 URL 时,完全由服务器决定他给您的内容。

于 2010-10-21T15:13:49.257 回答
0

urllib.info()使用函数检查 mimetype 。这可能不是 100% 准确,它实际上取决于站点作为 Content-Type 标头返回的内容。如果它表现良好,它将返回正确的 mime 类型。

PDF 应该返回 application/pdf,但情况可能并非如此。

否则,您可能只需要下载并尝试一下。

于 2010-10-21T15:14:09.897 回答
0

您无法直接从 url 中看到它。您可以尝试仅下载 HTTP 响应的标头并查找 Content-Type 标头。但是,您必须信任服务器 - 它可能会以与正文中提供的数据不匹配的错误 Content-Type 标头进行响应。

于 2010-10-21T15:14:11.830 回答
0

检测 Python 3.x 和 webapp 中的文件类型,该文件的 url 指向不能有扩展名或假扩展名的文件。你应该安装 python-magic,使用

pip3 install python-magic

对于 Mac OS X,您还应该使用安装 libmagic

brew install libmagic

代码片段

import urllib
import magic
from urllib.request import urlopen

url = "http://...url to the file ..."
request = urllib.request.Request(url)
response = urlopen(request)
mime_type = magic.from_buffer(response.read())
print(mime_type)
于 2016-09-06T20:08:19.897 回答