# nodejs 爬取统计局区划数据

# 1. 介绍

使用 axios 获取网页文档,

使用 cheerio 操作文档的元素。(cheerio 操作文档的方式与 jQuery 一致)

# 2. 示例

获取国家统计局 2023 年的区划数据:

const CONFIG = {
  BASE_URL: 'https://www.stats.gov.cn/sj/tjbz/tjyqhdmhcxhfdm/2023',
  HOME_PAGE: 'index.html',
};

async function getProvinceList() {
  const $ = await this.fetchPageContent(CONFIG.HOME_PAGE);

  const list = [];

  /**
   * @example
   * <tr class="provincetr">
   *  <td>
   *    <a href="11.html">北京市<br></a>
   *  </td>
   *  <td>
   *    <a href="12.html">天津市<br></a>
   *  </td>
   * </tr>
   */
  $('td.provincetr > a[href*=".html"]').each((index, el) => {
    const $el = $(el);
    const name = $el.text().trim();
    const page = $el.attr('href').trim();
    const code = page.replace('.html', '').trim();

    list.push({ category, name, code, page, parentCode: null });
  });

  return list;
}

async function fetchPageContent(page, baseUrl = CONFIG.BASE_URL) {
  const url = joinUrl(baseUrl, page);

  const { data: html } = await axios.get(url);

  return cheerio.load(html);
}

function joinUrl(...urls) {
  return urls
    // Remove slashes before and after
    .map((path) => path.replace(/^\/+/, '').replace(/\/+$/, ''))
    .join('/')
  ;
}

# 3. 参考

本章目录