NodeJs 网络爬虫文件扩展处理

NodeJs web crawler file extension handling

我正在用 nodejs 开发网络爬虫。我在网站抓取主体中创建了一个唯一的 url 列表。但其中一些有扩展名,如 jpg、mp3、mpeg ......我想避免抓取那些有扩展名的人。有什么简单的方法吗?

有两个选项。

1) 使用path检查每个URL

如评论中所述,您可以使用 path.extname 检查文件扩展名。因此,这:

var test = "http://example.com/images/banner.jpg"
path.extname(test); // '.jpg'

这会起作用,但感觉就像您最终不得不创建一个您可以抓取或必须避免的文件类型列表。那是工作。

旁注——小心使用path。通常,url 是解析 link 的最佳工具,因为 path 是针对 files/directories,而不是 url。在某些系统 (Windows) 上,使用 path 来操纵 url 可能会因为涉及斜线而导致戏剧化。公平警告!

2) 获取每个 link 的 HEAD 并查看 content-type 是否设置为 text/html

您可能有理由避免进行更多的网络调用。如果是这样,这不是一个选择。但是如果可以进行额外的调用,您可以获取每个 link 的 HEAD 并检查存储在 content-type.

中的 MIME 类型

像这样:

var headersOptions = {
        method: "HEAD",
        host: "http://example.com",
        path: "/articles/content.html"
    };

var req = http.request(headersOptions, function (res) {
    // you will probably need to also do things like check
    // HTTP status codes so you handle 404s, 301s, and so on

    if (res.headers['content-type'].indexOf("text/html") > -1) {
            // do something like queue the link up to be crawled
            // or parse the link or put it in a database or whatever
        }
    });

req.end();

一个好处是你只抓取 HEAD,所以即使文件是一个巨大的视频之类的,它也不会堵塞。你得到了 HEAD,看到 content-type 是一个视频或其他什么,然后继续前进,因为你对那种类型不感兴趣。

其次,您不必跟踪文件名,因为您使用标准 MIME 类型来区分 html 与其他数据格式。