前言
之前已经介绍了node.js的一些基本知识,下面这篇文章我们的目标是学习完本节课程后,能进行网页简单的分析与抓取,对抓取到的信息进行输出和文本保存。
爬虫的思路很简单:
确定要抓取的URL;
对URL进行抓取,获取网页内容;
对内容进行分析并存储;
重复第1步
在这节里做爬虫,我们使用到了两个重要的模块:
request : 对http进行封装,提供更多、更方便的接口供我们使用,request进行的是异步请求。更多信息可以去这篇文章上进行查看
cheerio : 类似于jQuery,可以使用$(), find(), text(), html()等方法提取页面中的元素和数据,不过若仔细比较起来,cheerio中的方法不如jQuery的多。
一、 hello world
说是hello world,其实首先开始的是最简单的抓取。我们就以cnode网站为例(https://cnodejs.org/),这个网站的特点是:
不需要登录即可访问首页和其他页面
页面都是同步渲染的,没有异步请求的问题
DOM结构清晰
代码如下:
var request = require('request'),
cheerio = require('cheerio');request('https://cnodejs.org/', function(err, response, body){
if( !err && response.statusCode == 200 ){
// body为源码
// 使用 cheerio.load 将字符串转换为 cheerio(jQuery) 对象,
// 按照jQuery方式操作即可
var $ = cheerio.load(body);
// 输出导航的html代码
console.log( $('.nav').html() );
}
});
这样的一段代码就实现了一个简单的网络爬虫,爬取到源码后,再对源码进行拆解分析,比如我们要获取首页中第1页的 问题标题,作者,跳转链接,点击数量,回复数量。通过chrome,我们可以得到这样的结构:
每个
div[.cell]是一个题目完整的单元,在这里面,一个单元暂时称为$item
{
title : $item.find('.topic_title').text(),
url : $item.find('.topic_title').attr('href'),
author : $item.find('.user_avatar img').attr('title'),
reply : $item.find('.count_of_replies').text(),
visits : $item.find('.count_of_visits').text()
}因此,循环
div[.cell] ,就可以获取到我们想要的信息了:
request('https://cnodejs.org/?_t='+Date.now(), function(err, response, body){
if( !err && response.statusCode == 200 ){
var $ = cheerio.load(body); var data = [];
$('#topic_list .cell').each(function(){
var $this = $(this);
// 使用trim去掉数据两端的空格
data.push({
title : trim($this.find('.topic_title').text()),









