内容谈判是否被打破?

时间:2012-07-12 11:21:14

标签: http web-crawler content-negotiation

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

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

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

您也可以正常启动请求,并且一旦发现您正在获取二进制数据,请切断TCP连接。但我不确定这是多么好的想法。

答案 1 :(得分:0)

Crawlers必须始终关注不良信息:一些网站有一个名为/robots.txt的10兆字节电影。即使内容协商实际上是在Web服务器中实现的,但是大量的Web服务器配置了不正确的内容类型,大量文件的扩展名错误,文件的开头合理并不意味着它没有变成二进制并且不是很大。