美文网首页我爱编程大数据 爬虫Python AI Sql程序员
Node.js Request+Cheerio实现一个小爬虫-基

Node.js Request+Cheerio实现一个小爬虫-基

作者: 吃土的小此方 | 来源:发表于2017-01-13 21:25 被阅读0次

Node.js Request+Cheerio实现一个小爬虫-基础功能实现1:内容抓取
Node.js Request+Cheerio实现一个小爬虫-基础功能实现2:文件写入
Node.js Request+Cheerio实现一个小爬虫-基础功能实现3:流程控制及并发控制
Node.js Request+Cheerio实现一个小爬虫-番外篇:代理设置

前段时间,正好有一个做爬虫的小任务。因为一直都是用js再加之Node.js的崛起,就打算使用Node来完成这个任务。自然,在实现的过程中也遇到了许多问题。所以就打算写出来当作是回顾和整理。

既然是爬虫,那么自然要和http的request, get, post 这一些方法相关了。至于这些知识,可以请教谷鸽或者度娘。除了http相关的知识,对于抓取到的内容,我们就需要进行提取,提取可以使用万能的正则表达式当然也可以使用node丰富的包了。下面就是这一次小项目中用到的node的包了。

利用到的包

  1. Request
    Request 模块是一个用起来十分方便的 http 模块。具体的用法可以参照官方的GitHub主页。
    官方主页

  2. Cheerio
    Cheerio 是一个可以使用 jQuery语法来对获取内容进行提取的一个模块。尤其是对于从网页上抓取的的东西。因为采用和jQuery一样的语法,所以特别适合前端来使用。
    官方主页


介绍了包和模块之后,那么就可以动手试一试了。那么下面就上代码吧!


const request = require('request');
const cheerio = require('cheerio');

var shopLists = [];
var option = {
    url: url,
    // 不加入headers的话很可能会被拒绝访问
    headers: {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.6',
        'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Mobile Safari/537.36',
        'Cache-Control': 'max-age=0',
        'Connection': 'keep-alive'
    }
};

request(option, function(error, response, body) {
    if (!error && response.statusCode == 200) {
    // 使用Cheerio对抓取到的内容进行解析
        var $ = cheerio.load(body, {
            ignoreWhitespace: true,
            xmlMode: true
        });

        var shopInfo = {
            pageNo: option.url.match(/g\d+p(\d+)/)[1],
            pageURL: option.url,
            info: []
        };
 
        var shopList = $('div#shop-all-list').find('a[data-hippo-type = "shop"]');

        shopList.each(function(no, shop) {
            let info = {};
            info.no = no + 1;
            info.name = $(shop).attr('title');
            info.url = $(shop).attr('href');
            shopInfo.info.push(info);
        });
        shopLists.push(shopInfo);
    }
});

这样以来就可以抓取到想要的网站内容了。当然,问题自然是解决一个又来一个的。既然抓到了内容,就总想要保存到一个地方去。就以保存到本地为例,于是我们可以利用到Node自带的fs模块来进行文件的读取。fs模块的使用方法,就还请参照官方文档或者向谷鸽度娘请教啦。

const fs = require('fs');
...
// 刚才的爬虫代码
...
fs.writeFile(FILE_PATH + FILE_NAME, shopLists, 'utf-8', function(err) {
    if (err) {
        console.error("文件生成时发生错误.");
        throw err;
    }
    console.info('文件已经成功生成.');
});

好了,看似是解决了一个问题。那么到底行不行还是需要经过实践的。跑一下,问题果然出现了。文件是0件,那么是怎么回事呢?就在下一篇文章中解决吧。

相关文章

网友评论

    本文标题:Node.js Request+Cheerio实现一个小爬虫-基

    本文链接:https://www.haomeiwen.com/subject/fjlzettx.html