node.js爬取国家统计局全国行政区数据

4 篇文章 0 订阅

github地址:https://github.com/username-xu/node-districts

const fs = require('fs');

// 网络请求,文档可参考:https://www.jianshu.com/p/1432e0f29abd
const superagent = require('superagent');

// 设置编码格式,文档:https://www.npmjs.com/package/superagent-charset
require('superagent-charset')(superagent);

// DOM操作,语法类似jquery,文档可参考:https://www.jianshu.com/p/629a81b4e013
const cheerio = require('cheerio');

const main = () => {
    getSheng();
}

// 获取页面
const getPage = async (url2) => {
    
    // 阻塞停顿,防止请求过快,被防火墙拦截
    sleep(1000);

    const url1 = 'http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2018/'
    let response = '';
    try{
        response = (await superagent
            .get(url1 + url2)
            .set({ 
                // 模拟浏览器请求
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36',
                'Accept-Encoding': 'gzip, deflate',
                'content-type': 'text/html',
                'Content-Length': Buffer.byteLength(""),
                'Connection': 'keep-alive'
            })
            .buffer(true)
            // 设置编码格式
            .charset('gb2312')).text;
    } catch(err){
        console.log(err)
    }
    
    return response;
}

// 获取省
const getSheng = async () => {
    let time = new Date().getTime();
    let timer = setInterval(() => {
        console.log('抓取中 '+ Math.floor((new Date().getTime() - time) / 1000));
    },1000)


    let list = [];
    let page = await getPage('index.html');
    let $ = cheerio.load(page);
    let htmlList = $('.provincetr td a');
    
    for(let i = 0; i < htmlList.length; i++){
        let url = $(htmlList[i]).attr('href');
        let item = {
            name: $(htmlList[i]).text(),
            code: url.slice(0, 2) + '0000',
            children: []
        };

        list.push(await getShi(url, item));
    }

    output(list);
    clearInterval(timer);
}

// 获取市
const getShi = async (url, shengItem) => {
    let page = await getPage(url);
    let $ = cheerio.load(page);
    let htmlList = $('.citytr');

    for(let i = 0; i < htmlList.length; i++){
        let first = $(htmlList[i]).find('td').first().find('a');
        let last = $(htmlList[i]).find('td').last().find('a');
        let itemUrl = $(first).attr('href');

        let item = {
            name: $(last).text(),
            code: $(first).text().slice(0, 6),
            children: []
        }

        shengItem.children.push(await getQu(itemUrl, item));
    }

    return shengItem;
}

// 获取区
const getQu = async (itemUrl, shiItem) => {
    let page = await getPage(itemUrl);
    let $ = cheerio.load(page);
    let htmlList = $('.countytr');

    for(let i = 0; i < htmlList.length; i++){
        let first = $(htmlList[i]).find('td').first().find('a');
        let last = $(htmlList[i]).find('td').last().find('a');

        if($(last).text() && $(first).text()){
            let item = {
                name: $(last).text(),
                code: $(first).text().slice(0, 6)
            }

            shiItem.children.push(item);
        }
        
    }

    return shiItem;
}

const sleep = d => {
    let t = new Date().getTime();
    while(new Date().getTime() - t <= d){}
}

// 输出
const output = data => {
    let dataStr = JSON.stringify(data);

    fs.writeFileSync(
        'data.json',
        dataStr,
        function(err){
            if(err){
                console.log(err);
            }
        }
    )
}

main();

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在 Node.js爬取图片,你可以使用各种库和模块来帮助你完成这个任务。以下是一种常见的做法: 1. 首先,你需要安装并引入 `axios` 库,这是一个非常流行的用于发送 HTTP 请求的库。你可以使用以下命令安装它: ``` npm install axios ``` 在代码中引入 `axios`: ```javascript const axios = require('axios'); ``` 2. 接下来,你需要确定要爬取图片的 URL 地址。可以通过发送 HTTP 请求并使用 `axios.get` 方法获取到图片的二进制数据。 ```javascript const imageUrl = 'https://example.com/image.jpg'; axios .get(imageUrl, { responseType: 'arraybuffer' }) .then((response) => { const imageData = Buffer.from(response.data, 'binary'); // 在这里做一些处理,比如将图片保存到本地或者进行其他操作 }) .catch((error) => { console.error('无法获取图片:', error); }); ``` 3. 一旦你获得了图片的二进制数据,你可以根据需要将其保存到本地文件或进行其他处理。以下是将图片保存到本地文件的示例代码: ```javascript const fs = require('fs'); // 保存文件的路径和名称 const savePath = './path/to/save/image.jpg'; fs.writeFile(savePath, imageData, (err) => { if (err) { console.error('无法保存图片:', err); } else { console.log('图片保存成功!'); } }); ``` 请确保你遵守网站的使用规则和法律法规,尊重他人的版权和隐私。在爬取图片之前,请确保你有合法的授权或许可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值