python 检查网址类型

3 投票
1 回答
2850 浏览
提问于 2025-04-16 04:02

我用Python写了一个爬虫,抓取的链接有不同类型:可能是包含HTML的链接,也可能是图片、压缩包或其他文件。因此,我需要快速判断这些链接的类型,以避免读取像大压缩包这样的文件,从而继续爬取其他内容。请问在页面加载开始时,最好的方法是什么来判断链接的类型?

我知道可以通过链接的名字来判断,比如以.rar、.jpg等结尾,但我觉得这不是一个完整的解决方案。我需要检查一下头信息或者其他什么东西吗?另外,我还需要预测页面的大小,以避免下载过大的文件。换句话说,我想设置一个下载页面大小的限制,以防止快速占用过多内存。

1 个回答

6

如果你对某个资源使用HTTP的HEAD请求,你会得到这个资源的相关信息,但不会获取到资源的实际内容。特别是,内容的长度和类型这两个信息会很重要。

比如:

HEAD /stackoverflow/img/favicon.ico HTTP/1.1
host: sstatic.net

HTTP/1.1 200 OK
Cache-Control: max-age=604800
Content-Length: 1150
Content-Type: image/x-icon
Last-Modified: Mon, 02 Aug 2010 06:04:04 GMT
Accept-Ranges: bytes
ETag: "2187d82832cb1:0"
X-Powered-By: ASP.NET
Date: Sun, 12 Sep 2010 13:38:36 GMT

你可以在Python中使用httplib来实现这个请求:

>>> import httplib
>>> conn = httplib.HTTPConnection("sstatic.net")
>>> conn.request("HEAD", "/stackoverflow/img/favicon.ico")
>>> res = conn.getresponse()
>>> print res.getheaders()
[('content-length', '1150'), ('x-powered-by', 'ASP.NET'), ('accept-ranges', 'bytes'), ('last-modified', 'Mon, 02 Aug 2010 06:04:04 GMT'), ('etag', '"2187d82832cb1:0"'), ('cache-control', 'max-age=604800'), ('date', 'Sun, 12 Sep 2010 13:39:26 GMT'), ('content-type', 'image/x-icon')]

这会告诉你这个资源是一个图片(类型是image/*),大小是1150字节。这样你就可以判断是否需要下载完整的资源。

另外,这个头信息还告诉你服务器支持部分内容请求(accept-ranges头),这意味着你可以分批获取数据。

如果你直接使用GET请求,你也会得到相同的头信息,但这时服务器会开始发送资源的实际内容,这样就不太合适了。

如果你想了解更多关于HTTP头的信息和它们的含义,可以使用一个在线工具,比如'Fetch'

撰写回答