采集新浪微博头条数据小demo

2018年12月20日作者:井井客整理来源:原创

练习小例子,用node采集新浪微博头条的数据并保存到sina.txt文件中。

采集新浪微博头条数据小demo

代码如下:

const request = require('request');
const cheerio = require('cheerio');
const sleep = require('./sleep');
// const sleep = require('sleep');
const fs = require('fs');

// 调用数据入口
getPageData(3);

async function getPageData(num) {
    for (let page = 1; page <= num; page++) {
        try {
            await requestPageData(page);
            sleep.sleep(2);   //休息2s继续
        } catch (error) {
            console.error(error)
        }
    }
}

function requestPageData(page) {
    return new Promise((resolve) => {
        let url = `https://weibo.com/a/aj/transform/loadingmoreunlogin?ajwvr=6&category=1760&page=${page}&lefnav=0&cursor=&__rnd=${new Date().getTime()}`
        request({
            method: 'GET',
            gzip: true,
            url: url,
            headers: {
                'Cookie': 'SUB=_2AkMrSycbf8PxqwJRmP8TymriaYtyyQrEieKdF9bAJRMxHRl-yT9jqnEJtRB6AMsJ9DW7usP2C5kmx5wuqLERwuXyMOzY; SUBP=0033WrSXqPxfM72-Ws9jqgMF55529P9D9W5sp9MOzyqnuom8BfLZ1EML; SINAGLOBAL=6824012321026.683.1545054271978; _s_tentry=www.takefoto.cn; UOR=www.baidu.com,weibo.com,www.takefoto.cn; Apache=486371679308.2373.1545268699353; ULV=1545268699944:2:2:2:486371679308.2373.1545268699353:1545054271987; Ugrow-G0=7e0e6b57abe2c2f76f677abd9a9ed65d; YF-V5-G0=b1e3c8e8ad37eca95b65a6759b3fc219; YF-Page-G0=d30fd7265234f674761ebc75febc3a9f; login_sid_t=47a1e0cea92a18fa7e495f632d9af9d6; cross_origin_proto=SSL; WBStorage=bfb29263adc46711|undefined; wb_view_log=1680*10502'
            }
        }, (error, response, body) => {
            if (body === '') {
                console.error(`请求 ${url} 结果为空!`);
                return;
            }

            let data = JSON.parse(body);
            if (data.code === '100000') {
                console.log("请求正常,准备写入文件。");
                let $ = cheerio.load(data.data);
                $('.list_title_b a').each((index, element) => {
                    appendSinaData($('.list_title_b a').eq(index).text())
                });
                resolve();
            } else {
                console.error(`请求 ${url} 返回结果异常,原因:${data.msg}`);
                return;
            }

        })
    })
}

// 写文件(打开文件并追加)
function appendSinaData(text) {
    fs.open('sina.txt', 'a', (err, fd) => {
        if (err) throw err;
        fs.appendFile(fd, text + '
', 'utf8', (err) => {
            fs.close(fd, (err) => {
                if (err) throw err;
            });
            if (err) throw err;
        });
    });
}

注意一下,需要用到Promise,还有sleep(可以是npm install sleep,或者写一个sleep文件)。另外请求时要带入cookie否则结果容易为空。因为代码不多,有点懒懒的不想写说明了。。。

sleep.js文件如下:

const sleep = {
    msleep:(n)=>{
        Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, n);
    },
    sleep:(n)=>{
        sleep.msleep(n*1000);
    } 
}
module.exports = sleep;

文章TAG:Node

本文标题:采集新浪微博头条数据小demo
本文链接:http://www.jingjingke.com/c/20354.html

上一篇:简单使用cheerio模块采集数据
下一篇:快速了解npm link