由于公司项目需要,需要开发网络爬虫,爬取区划代码和城乡划分代码
具体是从以下网址获取数据
统计用区划代码和城乡划分代码(截止10月31日)
安装依赖
npm install cheerio //检索所需数据npm install requestnpm install request-promise //远程访问页面npm install iconv-lite //编码转换
2.页面编码问题说明
页面中使用的是gb2312,如果直接远程获取页面源码内容,会出现乱码现象。处理方案如下:
配置 request-promise的options
const rp = require('request-promise');let options = {method: 'GET',uri: url,encoding: null};let body = await rp(options).catch(function (err) {reject(err);});
这样配置此时获取到的body就是二进制流数据
转码操作
使用iconv-lite对body进行处理
const iconv = require("iconv-lite");body=iconv.decode(body, 'gb2312').toString();
使用cheerio解析Body
以首页页面为例,cheerio 用法与jquery类似
使用谷歌浏览器查看元素
let $ = cheerio.load(body);let node = $('html').find(`.provincetr td a`);let json = {};json.province_name = $(node[0]).text();json.url = $(node[0]).attr('href');json.province_id = json.url.substring(0, 2) + "0000000000";
更多用法可以参考cheerio说明
完整代码
const rp = require('request-promise');const cheerio = require('cheerio');const iconv = require("iconv-lite");let getNeedContent = (url) => {return new Promise(async (resove, reject) => {try {let options = {method: 'GET',uri: url,encoding: null};let body = await rp(options).catch(function (err) {reject(err);});body = iconv.decode(body, 'gb2312').toString();let $ = cheerio.load(body);let node = $('html').find(`.provincetr td a`);let list = [];for (let i in node) {if (!isNaN(parseInt(i))) {let json = {};json.province_name = $(node[i]).text();json.url = $(node[i]).attr('href');json.province_id = json.url.substring(0, 2) + "0000000000";list.push(json);}}resove(list)} catch (err) {reject(err)}})}getNeedContent("http://www./tjsj/tjbz/tjyqhdmhcxhfdm//index.html").then(res => {console.log(JSON.stringify(res));}).catch(err => {console.log(err.message)})