网络爬虫:(英语:web crawler),也叫网络蜘蛛(spider),是一种用来自动浏览万维网的网络机器人。其目的通常为编纂网络索引。通常应用在网络搜索引擎上,搜索引擎经过爬虫软件更新自身的网站内容供用户搜索。php
爬虫访问网站的过程会消耗目标系统资源。很多网络系统并不默许爬虫工做。所以在访问大量页面时,爬虫须要考虑到规划、负载,还须要讲“礼貌”。 不肯意被爬虫访问、被爬虫主人知晓的公开站点可使用robots.txt文件之类的方法避免访问。这个文件能够要求机器人只对网站的一部分进行索引,或彻底不做处理。css
咱们最终的目标是实现爬取前程无忧web前端工程师的职位名称,公司名称,工做地点,薪资,发布时间.html
固然,咱们能够进行深度爬取,深度爬取涉及到对网页的二次请求.虽然node爬虫相对于python爬虫有自身的优势,能够凭借强大的异步特性很轻松的实现高效的异步并发请求,节省cpu
的开销。 可是这会有较大几率被网站检测到你在极短的时间内对网页进行量化请求,会被认定是DDos
攻击或者危害本网站,会触发反爬机制.因此这里咱们不讨论深刻爬取,有兴趣的能够了解一下python的深度爬取.前端
咱们要爬取页面的数据,第一步是要先分析清楚页面结构,要爬哪些页面,页面的结构是怎样的,需不须要登陆;有没有ajax
接口,返回什么样的数据等。node
分析清楚要爬取哪些页面和ajax
,就要去抓取数据了。现在的网页的数据,大致分为同步页面和ajax
接口。同步页面数据的抓取就须要咱们先分析网页的结构,python抓取数据通常是经过正则表达式匹配来获取须要的数据;node有一个cheerio的工具,能够将获取的页面内容转换成jquery
对象,而后就能够用jquery
强大的dom API
来获取节点相关数据, 其实你们看源码,这些API
本质也就是正则匹配。ajax
接口数据通常都是json
格式的,处理起来仍是比较简单的。python
抓取的数据后,会作简单的筛选,而后将须要的数据先保存起来,以便后续的分析处理。固然咱们能够用MySQL
和Mongodb
等数据库存储数据。这里,咱们为了方便,直接采用文件存储。jquery
前端展现页面,将数据展现出来才更直观,方便咱们分析统计。 固然了,对于数据可视化的操做有不少,最最多见的就是咱们以前学的echarts
图表可视化,你们能够多看看这个插件的使用.git
Superagent
是个轻量的的http
方面的库,是nodejs
里一个很是方便的客户端请求代理模块,当咱们须要进行get、post、head等网络请求时, 会用到它。github
Superagent-charset
是一个对字符集处理的一个轻量级的库, 能让字符集之间实现互相转化。web
Cheerio你们能够理解成一个 Node.js
版的 jquery
,用来从网页中以css
selector 取数据,使用方式跟 jquery
如出一辙。
node-xlsx
库是目前 Github
上 star 数量最多的处理 Excel 的库,功能强大,可以对excel文档进行读取,写入等操做。
咱们先进入想要爬取的前程无忧web前端工程师搜索页面
https://search.51job.com/list/020000,000000,0000,00,9,99,web%25E5%2589%258D%25E7%25AB%25AF,2,1.htmllang=c&stype=1&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=
复制代码
而后咱们对这一行进行分析,按F12进入检查,这四个标签分别对应什么标签
const charset = require('superagent-charset')
const cheerio = require('cheerio')
const request = charset(require('superagent'))
const fs = require('fs')
const xlsx = require('node-xlsx')
复制代码
request
.get(url, {
encoding: null,
headers: {
'User-Agent':
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:57.0) Gecko/20100101 Firefox/57.0'
}
})
.charset('gbk')
.end((err, res) => {
if (err) {
console.log('爬取失败!')
} else {
// console.log(res);
// 调用 cheerio.load() 方法,生成一个相似于 jQuery 的对象
let $ = cheerio.load(res.text)
// 获取对象中el的元素
let list = $('#resultList .el').not('.title')
list.each((index, element) => {
let line = []
const el = $(element)
// 设置每条数据的id
// line.push(data.length+1)
// 获取数据中的职位
line.push(el.find('.t1 span a').attr('title'))
// 获取数据中的公司
line.push(el.find('.t2 a').text())
// 获取数据中的地址
line.push(el.find('.t3').text())
// 获取数据中的薪资
line.push(el.find('.t4').text())
// 获取数据中的发布时间
line.push(el.find('.t5').text())
data.push(line)
})
} else {
return false
}
}
// console.log(data)
writeXls(data)
})
}
复制代码
// 尝试进行多页面爬取
page++
if (page <= endPage) {
// 根据地址栏地址找出规律
let url =
'https://search.51job.com/list/020000,000000,0000,00,9,99,web%25E5%2589%258D%25E7%25AB%25AF,2,' +page +'.html?lang=c&stype=1&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare='
start(url) //进行递归抓取
复制代码
function writeXls(data) {
var buffer = xlsx.build([
{
name: 'sheet1',
data: data
}
])
fs.writeFileSync('data.xlsx', buffer, { flag: 'w' })
}
复制代码