2012-07-12 79 views
4

我最近对网络爬虫感兴趣,但有一点对我来说并不是很清楚。想象一下,一个简单的抓取工具可以获取页面,从中提取链接并将其排入队列,以便以相同的方式进行后续处理。内容协商是否被破坏?

当某些链接不会导致另一个页面,而是某些资产或其他类型的静态文件,抓取工具如何处理这种情况?它会如何知道?它可能不想下载这种可能的大型二进制数据,甚至不需要xml或json文件。谈判内容是如何落入这个的?

我怎么看内容协商应该工作是在Web服务器上的一面,当我发出example.com/foo.pngAccept: text/html请求应该给我回一个HTML响应或Bad Request状态,如果它不能满足我的要求,其他什么都可以接受的,但这不是它在现实生活中的作用。即使我告诉它,我仍然会用Content-Type: image/png发送二进制数据,我只接受text/html。为什么Web服务器像这样工作,而不是强迫我要求的正确回应?

内容协商的实施是否中断或者应用程序有责任正确实施它?

真实抓取工具是如何工作的?提前发送HEAD请求以检查链接的另一端看起来是不切实际的资源浪费。

回答

5

不是'错误的请求',正确的响应是406不可接受。

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

您也可以正常开始请求,只要您注意到要获取二进制数据,请尽量缩短TCP连接。但我不确定这是一个好主意。

0

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