举个例子:

有一个网页,网页里面是很多的书籍。如下图所示,我只是截图了其中一部分html结构

html souce

需求:

把这个网页上的所有书名都爬出来。

先给出我的代码:

var superagent = require('superagent');
var cheerio = require('cheerio');

var url = "http://xxx.xxx.com";
var cookie = "locale=zh; sessionid=imq23m240knb3421b35j0x8q82nb8z7qb";

var items = [];
superagent.get(url)
    .set("Cookie", cookie)
    .end(function(error, res) {
        if (error) {
            throw error;
        }

        var $ = cheerio.load(res.text);
        $('.admin-table tbody tr').each(function (idx, value){
                $value = $(value);
                $value.find('td').each(function (iddx, book) {
                    if (0 === iddx) {
                        $book = $(book);
                        $items.push($book.find('a').text());
                    }
                });
                
                
        });

        console.log($items);
    });

下面我来仔细说一下代码

关于superagent

superagent是一个封装好的node.js的http第三方库。(就好比是android的okhttp)用superagent可以很方便地进行http请求。具体详细用法,可以参照官方文档

  • 因为我要去爬取书名的url是需要登录的,所以就需要知道cookie里面哪些东西是必须的

    • 先登录该网站
    • 可以在chrome里面打开调试界面,进入Application -> Cookies -> http://xxx.xxx.com,就可以看到你的cookie信息
    • 可以把你猜测是影响登录的cookie删掉,刷新网页看是否需要登录
    • 我发现sessionid是影响我登录的关键东西,所以我把我自己的sessionid拿出来,放在了cookie里面
  • superagent.get()是声明一个get请求,但并不会真正去请求。知道.end()被调用的时候,才会真正发出请求。

关于cheerio

Cheerio是 Node.js 特别为服务端定制的,能够快速灵活的对 JQuery 核心进行实现。它工作于 DOM模型 上,且解析、操作、呈送都很高效,适合各种Web爬虫程序。更多用法可以查看官方文档

向上面那张图,我要获取的书名,是在table元素的tbodytr的第一列里面的a元素里面。使用cheerio进行元素获取的时候,可以像使用jquery一样。

这里简单说一下jquery里面的一些用法:

  • 根据id选择,比如说选择某个id是myid的元素,那么可以这样: $('#myid')

  • 根据class选择,比如说选择某个class是myclass的元素,那么可以这样: $('.myclass')

  • 根据元素选择,比如说选取<p>元素,那么可以这样: $('p')

  • 层级选择,比如说选择<p>元素里面的<div>,那么可以这样: $('p div')


按照上方的示例代码,就实现了一个简单的爬取网页里面的书名的功能。