采集页面:https://baike.baidu.com/item/%E7%99%BE%E5%AE%B6%E5%A7%93/194637

采集日期:2019年09月25日

主要是采集姓氏列表,图片红线部分
百家姓采集.png

创建项目

mkdir surname
cd surname
touch spider.js

安装所需的依赖, request 用于请求网页内容,cheerio 用于解析网页 html,语法与 jquery 类似。

npm install --save request request-promise-native cheerio

代码实现,spider.js 文件的内容如下:

// spider.js
const request = require('request-promise-native');
const cheerio = require('cheerio');

async function start () {
  const html = await getPageBody()
  const surnameList = await getPageData(html)
  console.log(surnameList)
}

async function getPageBody () {
    const url = 'https://baike.baidu.com/item/百家姓/194637';
    const body = await request(encodeURI(url))
    return body;
}

async function getPageData (html) {
  if (!html) {
    return false
  }

  const $ = cheerio.load(html, {decodeEntities: false})
  const tdList = $('.main-content table td')
  let surnameList = []
  for (let i = 0; i < tdList.length; i++) {
    // 过滤表头
    if (i < 5) {
      continue
    }
    let name = $(tdList[i]).find('a').eq(0).text()
    if (!name) {
      // 由于“山”姓没有链接,所以直接获取 td 内容就是姓。
      name = $(tdList[i]).text()
    }

    // 结束标记
    if (name === '百家姓终') {
      break
    }

    surnameList.push(name)
  }
  return surnameList
}


(async () => {
  await start()
})()

运行成功的话会输出包含姓氏的数组。

[
  '赵', '钱', '孙', '李', '周', '吴', '郑', '王', '冯', '陈', '褚', '卫',
  '蒋', '沈', '韩', '杨', '朱', '秦', '尤', '许', '何', '吕', '施', '张',
  '孔', '曹', '严', '华', '金', '魏', '陶', '姜', '戚', '谢', '邹', '喻',
  '柏', '水', '窦', '章', '云', '苏', '潘', '葛', '奚', '范', '彭', '郎',
  '鲁', '韦', '昌', '马', '苗', '凤', '花', '方', '俞', '任', '袁', '柳',
  '酆', '鲍', '史', '唐', '费', '廉', '岑', '薛', '雷', '贺', '倪', '汤',
  '滕', '殷', '罗', '毕', '郝', '邬', '安', '常', '乐', '于', '时', '傅',
  '皮', '卞', '齐', '康', '伍', '余', '元', '卜', '顾', '孟', '平', '黄',
  '和', '穆', '萧', '尹',
  ... 404 more items

标签: Node.js