lizhao123
\'use strict\';
let request = require(\'request\')
let cheerio = require(\'cheerio\'); //爬虫
let iconv = require(\'iconv-lite\'); //处理gbk编码的网页
let Entities = require(\'html-entities\').XmlEntities;
let entities = new Entities();
const fs = require(\'fs\')
const path = require(\'path\')
const host = \'http://www.quanshuwang.com/shuku/\'

const db = uniCloud.database()
const collection = db.collection(\'repiles-book\')
const dbCom = db.command

exports.main = async (event, context) => {

    // 开始抓取首页链接
    let indexArr = []
    //发送请求获取页面内容
    var body = await requestFn()
    var $ = cheerio.load(body);
    //兼容网页编码格式
    if ($(\'meta[charset]\').attr(\'charset\') == \'utf-8\') { //如果网页是utf-8的编码

    } else { //如果网页是gbk的编码
        body = iconv.decode(body, \'gbk\'); //转换gbk编码的页面内容
        $ = cheerio.load(body);
    }
    //处理网页数据 获取排行列表
    let list = $(\'.yd-book-content .tab-item\').find(\'.yd-book-item\')
    for (var i = 0; i < list.length; i++) {
        let href = list.eq(i).find(\'a\').attr("href")
        //获取书的id
        let index = href.indexOf(\'_\') + 1
        let index2 = href.lastIndexOf(\'.\')
        let bookId = href.slice(index, index2) //书ID
        //获取书的封面
        let bookImageSrc = list.eq(i).find(\'img\').attr("src")
        //获取书的标题 注意使用html-entities解码
        let bookName = entities.decode(list.eq(i).find(\'h2\').html())
        //获取书的作者 注意使用html-entities解码
        let bookAuthor = entities.decode(list.eq(i).find(\'.dl-horizontal-inline p\').html())

        console.log(\'书的封面:\' + bookImageSrc);
        console.log(\'书的标题:\' + bookName);
        console.log(\'书的作者:\' + bookAuthor);
        console.log(\'书的id:\' + bookId);
        let obj={
            bookImageSrc,
            bookName,
            bookAuthor,
            bookId,
        }
        saveContent(obj)
    }

    console.log(\'新增文章数量:\', indexArr.length);


    // 循环抓取每个新文章详情页
    // if (indexArr.length > 0) {
    //     for (let i = 0; i < indexArr.length; i++) {
    //         let href = list.eq(indexArr[i]).attr("href")
    //         let imgSrc = list.eq(indexArr[i]).find(\'img\').attr(\'src\')
    //         let title = list.eq(indexArr[i]).find(\'.title\').text()
    //         await saveArticle(href, title, imgSrc)
    //     }
    // }

    //返回数据给客户端
    return event
};

function saveContent(obj) {
    //获取要写入文件的文件夹路径(以书名当文件夹)
    let pathBook=path.join(__dirname, `../../bookData/${obj.bookName}`)
    //判断书名文件夹是否存在,不存在则创建
    if (!fs.existsSync(pathBook)) {
        fs.mkdirSync(pathBook)
    }
    //写入json文件
    fs.writeFile(`${pathBook}/chapter1.json`, JSON.stringify(obj), \'utf-8\', err => {
        if (err) throw err
    })
}

function requestFn() {
    return new Promise((resolve, reject) => {
        request({
            url: host,
            encoding: null //设置抓取页面时不要对数据做任何转换
        }, function(err, res, body) {
            if (err) {
                reject(err)
            } else {
                resolve(body)
            }
        });
    })
}

 

分类:

技术点:

相关文章: