Node.js 百度百科百家姓姓氏采集
采集页面:https://baike.baidu.com/item/%E7%99%BE%E5%AE%B6%E5%A7%93/194637
采集日期:2019年09月25日
主要是采集姓氏列表,图片红线部分
创建项目
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