node 爬虫demo

参考: 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")
})

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值