request、request-promise、cheerio抓取网页内容

2019-08-23199次阅读node

爬虫是一种自动获取网页内容的程序。是搜索引擎的重要组成部分,因此搜索引擎优化很大程度上就是针对爬虫而做出的优化,说白了爬虫拿到的就是您网页上的html代码。

 

新建目录

新建grabTest目录

cd grabTest

进入目录

npm init

一路回车创建package.json。

 

安装

request(简化的HTTP客户端)、request-promise(request返回Promise使用async/ await)、cheerio(将抓取页面的html代码转为DOM,可以称之为是node版的jq)

npm i request request-promise cheerio

查看package.json文件


说明安装成功了。


目录下新建read.js

//request-promise是让request支持了promise的语法
const rp = require('request-promise');
const cheerio = require('cheerio');

const html_encode = function(str){ 
        var s = ""; 
        if (str.length == 0) return ""; 
        s = str.replace(/&/g, "&"); 
        s = s.replace(/</g, "&lt;"); 
        s = s.replace(/>/g, "&gt;"); 
        s = s.replace(/ /g, "&nbsp;"); 
        s = s.replace(/\'/g, "&#39;"); 
        s = s.replace(/\"/g, "&quot;"); 
        s = s.replace(/\n/g, "<br/>"); 
        return s; 
} 


const read = (url) =>{
    const opts = {
        url,// 目标页面
        transform:body => {
            // body为目标页面抓取到的html代码
            // 通过cheerio.load方法可以把html代码转换成可以操作的DOM结构
            return cheerio.load(body);
        }
    };

    return rp(opts).then($=>{

        let result = [];// 结果数组

        //遍历列表标题a标签
        $('.itemTitle a').each((index,item) => {

            const ele = $(item);

            const url = ele.attr('href');

            const title = ele.text();

            //取a标签href进入内页取文章内容,闭包异步获取
            (async function(index){

                const $$ = await rp({
                    url,
                    transform:body => {
                        // cheerio中的.html()方法默认开启转换实体编码
                        // decodeEntities:false关闭转换实体编码
                        return cheerio.load(body,{decodeEntities:false});
                    }
                });

                $$('.article-content script').remove();

                $$('.article-content ins').remove();
                
                //html_encode选择性<、>、&等转义成实体编码
                result[index].contentText =  html_encode( $$('.article-content').html() );

            })(index);
            
            result.push({
                title
            });
            console.log(title);
           
        });
        // 返回结果数组
 
        return result;
    })
};

read('https://www.xinran001.com/');

这里有可能会遇到Request中Error: options.uri is a required argumentcheerio.html()抓取的HTML内容乱码等问题。

 

目录下执行Node

node read.js

在控制台上就可以看到打印出的文章标题。

上一篇: cheerio.html()抓取的HTML内容乱码问题  下一篇: box-shadow单边阴影  

request、request-promise、cheerio抓取网页内容相关文章