当前位置: 移动技术网 > IT编程>开发语言>JavaScript > nodejs学习笔记(1)——网络爬虫

nodejs学习笔记(1)——网络爬虫

2018年04月09日  | 移动技术网IT编程  | 我要评论
不知不觉做nodejs开发已经将近一年多了,过程中学了很多,也忘了很多,所以还是坚持在博客里面留下点内容,方便以后查看。 本文主要实现一个简单的网站爬虫功能,抓取网站里面的图片以及内容。 在抓取之前用到了superagent、cheerio、request、fs模块。 superagent和http ...

不知不觉做nodejs开发已经将近一年多了,过程中学了很多,也忘了很多,所以还是坚持在博客里面留下点内容,方便以后查看。

本文主要实现一个简单的网站爬虫功能,抓取网站里面的图片以及内容。

在抓取之前用到了superagent、cheerio、request、fs模块。

superagent和http用途其实是差不多的,都是通过url模拟请求,为了记录一下用法,这里两个都用了;cheerio我个人理解就相当于一个服务端的jquery,可以对响应的内容进行过滤,用法跟jquery一样;fs模块是nodejs里面的文件操作模块。

以爬取360网站为例:

 1 /**
 2  * 网络爬虫
 3  */
 4 
 5 let sup = require("superagent");
 6 let cheer = require("cheerio");
 7 let request = require("request");
 8 let fs = require("fs");
 9 const domain = "www.360.com";
10 const url = "https://" + domain + "/";
11 sup.get(url).end(function (err, res, body) {
12     if (err) {
13         console.log(err);
14     } else {
15         console.log('----------------------');
16         //找出页面响应的文本内容 
17         let $ = cheer.load(res.text);
18         //通过cheerio过滤内容  用法与jquery一样   如:找出里面所有的图片
19         let rst = $("img"); 
20         rst.each(function (idx, item) {
21             //这里request.get的encoding一定要设置为null,api文档有说明,为null的时候响应文本会返回一个buffer
22             let imgUrl = (item.attribs.src.includes('//') ? 'http:' : url) + item.attribs.src;
23             console.log('********************', imgUrl);
24             request.get({ url: imgUrl, encoding: null }, function (error, response, body) {
25                 if (error) {
26                     console.error(error);
27                 } else {
28                     //持续下载数据
29                     let dir = domain + "/" + item.attribs.src.replace('//', '');
30                     let path = dir.split('/');
31                     //去掉最后的文件名部分
32                     path.pop();
33                     if (fs.existsSync(path.join('/')) == false) {
34                         //循环创建文件夹
35                         var dirInfo = "";
36                         for (var i = 0; i < path.length; i++) {
37                             dirInfo += path[i] + "/"
38                             if (fs.existsSync(dirInfo) == false && dirInfo != '')
39                                 fs.mkdirSync(dirInfo);
40                         }
41                     }
42                     //把body的的string转为object写入到文件
43                     fs.writeFile(dir, body, (err) => {
44                         console.log('----------------', err);
45                     })
46                 }
47             })
48         })
49     }
50 })

 

以上为个人学习记录,只是一个学习的知识点分享,如果不对之处,请留言指出。

 

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网