欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

node 爬虫demo

程序员文章站 2022-07-14 11:18:02
...

参考: async/mapLimit函数理解

主要卡在getHrefList函数上比较久, 在map循环里发送请求,然后在请求结果中还要循环,起初一直拿不到urlsArray数组 不是undefined 就是[] 主要还是异步的问题 目前这个版本虽然拿到了所有链接,但是链接的顺序与页码数是否匹配这方面还没测试 我想是没问题的 毕竟我对获取每一页结构哪里使用了await 关键字啊...

代码

const axios = require("axios");
const cheerio = require("cheerio");
const async = require("async");
const Koa = require("koa");
const router = require("koa-router")();
const app = new Koa();
router.get('/', async ctx => {
    start()
})
let index = 0;
function start() {
    getHrefList().then(res => {
        // 控制并发请求
        async.mapLimit(res, 5, itemDo, (err, result) => {
            console.log("已完毕")
        })
    })
}

function itemDo(url, callback) {
    var delay = parseInt((Math.random() * 10000000) % 2000, 10);
    axios.get(url).then((res) => {
        index = index + 1;
        // 获取每一篇博客的信息
        getTitle(res.data, index, url, delay)
        setTimeout(function () {
            callback(null, res.data)
        }, delay);
    })
    console.log(1111)
}

function getHrefList() {
    let pageData = [];
    let pageCount = 1; // 页码总数
    for (let i = 0; i < pageCount; i ++) { // 储存每一页的请求参数, 我看他的接口接PageIndex在改变其他没变
        let obj = {
            CategoryId: 808,
            CategoryType: "SiteHome",
            ItemListActionName: "AggSitePostList",
            PageIndex: i + 1,
            ParentCategoryId: 0,
            TotalPostCount: 4000
        };
        pageData.push(obj);
    }
    let urlsArray = [];
    return new Promise((resolve, reject) => {
        Promise.all(pageData.map(async (item, index) => {
            // 获取每一页的结构
            await axios({
                url: "https://www.cnblogs.com/AggSite/AggSitePostList",
                method: "POST",
                data: item
            }).then(res => {
                var $ = cheerio.load(res.data);
                let curPageUrls = $('.titlelnk');
                curPageUrls.each((index, item) => {
                    // 存储每一页的a.titlelnk的href 链接
                    urlsArray.push($(item).attr('href'));
                })
            })
        })).then(() => {
            resolve(urlsArray)
        })
    })
}
// 输出
function getTitle(html, index, url, delay) {
    var $ = cheerio.load(html);
    console.log(index, '正在抓取的是', url, '标题:' + $('#cb_post_title_url').text(),  '耗时' + delay + '毫秒'); 
}

app.use(router.routes());

app.listen(3000, () => {
    console.log("app listen port 3000")
})

结果:

node 爬虫demo

相关标签: js