Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python下载一个';未在URL中显式引用_Python_Url_Web Crawler_Bing Api - Fatal编程技术网

使用Python下载一个';未在URL中显式引用

使用Python下载一个';未在URL中显式引用,python,url,web-crawler,bing-api,Python,Url,Web Crawler,Bing Api,我用Python2.6编写了一个web爬虫程序,使用Bing API搜索某些文档,然后下载它们以便以后分类。我一直在使用字符串方法和urllib.urlretrieve()下载URL以.pdf、.ps等结尾的结果,但当文档“隐藏”在URL后面时,我遇到了麻烦,如: 所以,有两个问题。如果URL没有明确地链接到某个pdf/doc等文件(例如www.domain.com/file.pdf),是否有一种方法可以判断URL是否链接到该文件?有没有办法让Python拦截该文件 编辑: 感谢您的回复,其中

我用Python2.6编写了一个web爬虫程序,使用Bing API搜索某些文档,然后下载它们以便以后分类。我一直在使用字符串方法和
urllib.urlretrieve()
下载URL以.pdf、.ps等结尾的结果,但当文档“隐藏”在URL后面时,我遇到了麻烦,如:

所以,有两个问题。如果URL没有明确地链接到某个pdf/doc等文件(例如www.domain.com/file.pdf),是否有一种方法可以判断URL是否链接到该文件?有没有办法让Python拦截该文件

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

否。仅通过查看url无法判断url引用的是哪种资源。当你请求某个URL时,完全由服务器决定他给你什么。

不。仅仅通过查看URL是不可能知道URL引用了哪种资源的。当您请求某个URL时,完全由服务器决定他将给您什么。

无法从URL判断它将给您什么。即使它以
.pdf
结尾,它仍然可以为您提供HTML或任何它喜欢的内容

你可以做一个HEAD请求,看看内容类型,如果服务器没有欺骗你,它会告诉你它是否是PDF


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

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

你可以做一个HEAD请求,看看内容类型,如果服务器没有欺骗你,它会告诉你它是否是PDF


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

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

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


否则,您可能只需要下载并试用它。

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

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


否则,您可能需要下载并试用。

您无法直接从url中看到它。您可以尝试只下载HTTP响应的头并查找内容类型头。但是,您必须在这方面信任服务器-它可能会使用与正文中提供的数据不匹配的错误内容类型标题进行响应。

您无法直接从url中看到它。您可以尝试只下载HTTP响应的头并查找内容类型头。但是,您必须在这方面信任服务器-它可能会使用与正文中提供的数据不匹配的错误内容类型标题进行响应。

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

obj = urllib.urlopen(URL)

headers = obj.info()
if headers['Content-Type'].find('pdf') != -1:
   # we have pdf file, download whole
...
这样,您就不必下载每个URL,只需下载其标题即可。它仍然不能完全节省网络流量,但你不会比这更好


另外,您应该使用mime类型,而不是my Rough find('pdf')。

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

obj = urllib.urlopen(URL)

headers = obj.info()
if headers['Content-Type'].find('pdf') != -1:
   # we have pdf file, download whole
...
这样,您就不必下载每个URL,只需下载其标题即可。它仍然不能完全节省网络流量,但你不会比这更好


您还应该使用mime类型,而不是my Rough find('pdf')。

在这种情况下,您所谓的“URL中未显式引用的文档”似乎就是所谓的“重定向”。基本上,服务器告诉您必须从另一个URL获取文档。通常情况下,python的urllib将自动遵循这些重定向,这样您就可以得到正确的文件。(正如其他人已经提到的,您可以检查响应的mime类型头,看看它是否是pdf)

然而,有问题的服务器在这里做了一些奇怪的事情。您请求url,它会将您重定向到另一个url。您请求另一个url,它会再次重定向您。。。到同一个网址!再一次。。。再一次。。。在某种程度上,urllib认为这已经足够了,并将停止执行重定向,以避免陷入无休止的循环

那么,当你使用浏览器时,你怎么能得到pdf呢?因为很明显,服务器只会在您启用cookies的情况下提供pdf。(为什么?你必须问负责服务器的人……)如果你没有cookie,它将永远为你重定向

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


至少,我认为这是造成问题的原因。我还没试过用饼干来做呢。也可能是服务器“不想”提供pdf,因为它检测到您没有使用“正常”浏览器(在这种情况下,您可能需要修改用户代理标题),但这是一种奇怪的方式。因此,我猜测它在某个地方使用了“会话cookie”,如果您还没有会话cookie,则会继续尝试重定向。

在这种情况下,您所说的“URL中未明确引用的文档”似乎就是所谓的“重定向”。基本上,服务器告诉您必须
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)