【问题标题】:NodeJs web crawler file extension handlingNodeJs 网络爬虫文件扩展处理
【发布时间】:2015-10-14 13:27:41
【问题描述】:

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

【问题讨论】:

  • 这不是我想要的。例如,在网站抓取结果“www.abc.com/xyz.jpg”、“www.abc.com/xyza.mpeg”、“www.abc.com/xyzb.mp3”中存在这些链接。大多数抓取 npms 基本上都会尝试抓取您提供给它们的每个 url。我不想抓取带有扩展名的网址。
  • 你试过了吗?
  • 我检查了互联网。但是找不到有用的东西。我问了这个问题,也许 stackoverflow 中的任何人都遇到过同样的问题。
  • 您可能正在从@MadaraUchiha 建议的路径模块中寻找@​​987654323@。您可以使用该功能找出网址是否有扩展名,如果没有,您可以继续抓取它。

标签: node.js web-crawler file-extension


【解决方案1】:

两个选项突出。

1) 使用path 检查每个网址

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

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

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

旁注 -- 小心使用path。通常,url 是解析链接的最佳工具,因为path 针对的是文件/目录,而不是 URL。在某些系统 (Windows) 上,使用 path 操作 url 可能会因为涉及斜线而导致戏剧性的结果。公平警告!

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

您可能有理由避免进行更多的网络调用。如果是这样,这不是一个选择。但如果可以进行额外调用,您可以获取每个链接的 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 和其他数据格式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    相关资源
    最近更新 更多