很多时候自己做前端项目由于没有后台和数据的支持,往往无法更好的渲染页面效果,这时候爬虫就可以很好地解决这个烦恼,本站点的所有爬虫文章都基于豆瓣页面。
node爬虫程序依赖两个npm包:superagent、cheerio,和nodejs的fs模块,通过分析页面DOM结构,提取相应的数据写入json文件中。
本程序依赖node.js和上面的两个npm,请自行创建node项目并安装,可以使用webstorm直接创建一个node.js express App
1.引入依赖模块
1 2 3 4 5 6 7 8
| const http = require("http"); const path = require("path"); const url = require("url"); const fs = require("fs");
const superagent = require("superagent"); const cheerio = require("cheerio");
|
2.调用superagent的get方法和end方法处理
get(): 此方法参数为获取数据的链接
end(): 此方法第一的参数为error对象,第二个参数为get中页面的所有DOM结果
1 2 3 4 5
| superagent .get("https://book.douban.com/latest?icn=index-latestbook-all") .end((error, response)=>{ })
|
3.分析结构,提取相应的数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| var content = response.text;
var $ = cheerio.load(content);
var result = [];
$(".cover-col-4 li").each(function(index,value){ var address = $(value).find(".cover").attr("href"); var bookId = address.replace(/[^0-9]/ig,""); var gradeStr = $(value).find(".detail-frame .rating .font-small").text().replace(/\ +/g,"").replace(/[\r\n]/g,""); var oneBook = { title: $(value).find(".detail-frame h2 a").text(), bookId: bookId, grade: Number(gradeStr) ? Number(gradeStr) : 0, bookInfo: $(value).find(".detail-frame .color-gray").text().replace(/\ +/g,"").replace(/[\r\n]/g,""), bookImg: $(value).find(".cover img").attr("src").replace(/^https:/g,""), description: $(value).find(".detail-frame .detail").text().replace(/\ +/g,"").replace(/[\r\n]/g,"") }; result.push(oneBook); });
result = JSON.stringify(result);
fs.writeFile("newBooks.json", result, "utf-8", (error)=>{ if(error == null){ console.log("恭喜您,数据爬取成功!请打开json文件"); } })
|
这里我是获取豆瓣书本数据,一本书包含:标题、书本ID、评分、书本信息、书本封面、简介。
完整代码请参考:https://github.com/joydezhong/SimpleCrawler/blob/master/crawler.js