2015-10-14 43 views
0

我正在开发nodejs中的网络爬虫。我在网站抓取机构中创建了一个唯一的网址列表。但其中一些有像JPG,MP3,MPEG等扩展名...我想避免抓取有扩展名的人。有没有简单的方法来做到这一点?NodeJs网络爬虫文件扩展处理

+0

https://nodejs.org/api/url.html和https://nodejs.org/api/path.html –

+0

这不是我要找的。例如,在网站抓取结果“www.abc.com/xyz.jpg”,“www.abc.com/xyza.mpeg”,“www.abc.com/xyzb.mp3”中存在这些链接。大多数抓取npms基本上都会尝试抓取您提供给他们的每个网址。我不想抓取有扩展名的网址。 –

+0

你有试过什么吗? – webduvet

回答

1

突出两个选项。

1)使用path检查每一个网址

正如评论所说,你可以使用path.extname来检查文件扩展名。因此,这样的:

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

这会工作,但这种感觉就像你会风不必创建文件类型的列表,你可以抓取,或者你必须避免。这是工作。

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

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(); 

一个好处是,你只抢人头,所以即使该文件是一个巨大的视频什么的,不会堵塞东西。你得到的头,看content-type是一个视频或其他,然后移动,因为你对这种类型不感兴趣。

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

+0

感谢您的帮助。这非常有用。 –