4

我最近对网络爬虫感兴趣,但有一件事对我来说不是很清楚。想象一个简单的爬虫,它将获取页面,从中提取链接并将它们排队以供以后以相同的方式处理。

当某些链接不会指向另一个页面而是指向某个资产或其他类型的静态文件时,爬虫如何处理这种情况?它怎么会知道?它可能不想下载这种可能很大的二进制数据,甚至也不想下载 xml 或 json 文件。内容协商如何落入此地?

当我向它发出请求时,我认为内容协商应该在网络服务器端起作用,如果它不能满足我的要求,它应该向我发回 html 响应或错误请求状态,没有其他方法是可以接受的,但这不是它的工作example.com/foo.png方式Accept: text/html真实的生活。无论如何,Content-Type: image/png即使我告诉它我只接受它,它也会将二进制数据发回给我text/html。为什么网络服务器像这样工作而不是强制我要求的正确响应?

内容协商的实现是否被破坏或应用程序有责任正确实现它?

真正的爬虫是如何工作的?提前发送 HEAD 请求以检查链接另一侧的内容被视为不切实际的资源浪费。

4

2 回答 2

5

不是“错误请求”,正确的响应是 406 Not Acceptable。

HTTP 规范声明它应该发回这个规范[ 1 ],但大多数实现不这样做。如果你想避免下载你不感兴趣的内容类型,你唯一的选择确实是先做一个 HEAD。由于您可能抓取了这些图像,因此您也可以做出一些明智的猜测,即它实际上是一张图像(例如,它出现在<img>标签中)。

你也可以像往常一样启动请求,一旦你注意到你正在取回二进制数据,就切断 TCP 连接。但我不确定这是一个多么好的主意。

于 2012-07-12T12:02:21.820 回答
0

爬虫必须时刻留意不良信息:一些网站有一个名为 /robots.txt 的 10 兆字节电影。即使内容协商实际上是在网络服务器中实现的,许多网络服务器配置了不正确的内容类型,许多文件具有错误的扩展名,并且文件的开头是合理的并不意味着它不会变成二进制文件。巨大。

于 2012-07-13T22:35:37.897 回答