内容协商是否出现问题?

4
我最近对网络爬虫产生了兴趣,但有一件事并不太清楚。想象一个简单的爬虫程序,获取页面,从中提取链接,并以相同方式将它们排队进行后续处理。
当某个链接不会指向另一个页面,而是指向某个资源或其他类型的静态文件时,爬虫程序如何处理呢?它怎么知道这个链接不是它需要的页面呢?毕竟,它可能不希望下载任何大型二进制数据,甚至不希望下载xml或json文件。内容协商在其中扮演着什么角色?
按照我的理解,内容协商应该在web服务器端工作。当我使用 Accept: text/html 请求 example.com/foo.png 时,服务器应该返回一个 html 响应或 Bad Request 状态码(如果无法满足我的要求),不能返回其他类型的数据。但实际情况并非如此,即使我告诉服务器我只接受 text/html ,它也会发送回那些二进制数据,而且响应头仍然是 Content-Type: image/png。为什么web服务器像这样工作,而不强制返回我所需的正确响应?
是内容协商实现有问题还是应用程序没有正确实现呢?
真正的爬虫程序是如何工作的呢?向目标链接发送HEAD请求以查看其背后的内容似乎会浪费很多资源。
2个回答

5

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

HTTP规范指出它应该返回这个规范[1],但大多数实现并不这样做。如果你想避免下载你不感兴趣的内容类型,你唯一的选择就是先进行HEAD请求。 由于你可能爬取了这些图像,你也可以根据某些智能猜测判断它实际上是一个图像(例如,它出现在一个<img>标签中)。

你也可以像通常一样开始请求,但一旦注意到你正在收到二进制数据,就立即断开TCP连接。但我不确定这是个好主意。


0
爬虫必须时刻警惕错误信息:有些网站会将一个10兆字节的电影命名为/robots.txt。即使内容协商实际上已经在Web服务器中实现,很多Web服务器仍然配置了不正确的内容类型,很多文件也有错误的扩展名,而且文件开头看起来合理并不意味着它不会变成二进制文件或者非常庞大。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接