blog
blog copied to clipboard
要不要养一条NodeJS爬虫玩玩(一)
要不要养一条NodeJS爬虫玩玩
爬虫?不是用 python 写的吗? 谁告诉你非得用 python 写。nodejs也可以啊。不信我给你写一个。
知识点
# nodejs
# https 和 http
# DOM Query

实例
第一步
//先写个简单的。
let cheerio = require("cheerio"),
html = "",
https = require('https'),
list = [],
buffer = null,
url = "https://www.baidu.com/";
let req = https.request(url, function (res) {
res.on("data", function (data) {
list.push(data)
})
res.on("end", function () {
buffer = Buffer.concat(list)
html = buffer.toString()
console.log(html)
// $ = cheerio.load(html)
})
})
req.end()
运行结果

是不是太简单了,能干啥啊? 那换个地址,我们抓取一下百度新闻的热点新闻。
第二步
let cheerio = require("cheerio"),
html = "",
http = require('http'),
list = [],
buffer = null,
url = "http://news.baidu.com/";
let req = http.request(url, function (res) {
res.on("data", function (data) {
list.push(data)
})
res.on("end", function () {
buffer = Buffer.concat(list)
html = buffer.toString()
console.log(html)
// $ = cheerio.load(html)
})
})
req.end()
上述代码输出的结果是整个文本,我们得找到热点新闻那一栏,咋弄? 用正则?太难了不想写。 下面让你们见识一下优雅的程序员是怎么做的。
首先选择一下找到热点新闻的元素列表。
下来我们通过 cheerio 选取对应的子节点,获得热点新闻的信息。
第三步
let cheerio = require("cheerio"),
html = "",
http = require('http'),
list = [],
buffer = null,
url = "http://news.baidu.com/";
let req = http.request(url, function (res) {
res.on("data", function (data) {
list.push(data)
})
res.on("end", function () {
buffer = Buffer.concat(list)
html = buffer.toString()
$ = cheerio.load(html)
$('.hotnews a').each((index, item) => {
console.log('\n', $(item).text())
})
})
})
req.end()
运行结果
这次我们依赖的是cheerio 。 cheerio其实就是和 jquery一样的dom选择器。就想直接操作dom一样简单,但这个不能模拟用户操作,如 click 动作,类似操作 xml 文档。
总结
其实文章最开头列举的三个知识点就是这次讲解的主要内容,nodejs 环境下,我们可以通过 https 和 http 包获得页面文本,再通过cheerio获截取得我们需要的信息。这个只是最简单的一个爬虫的应用,我们可能还要模拟用户登录,保存用户cookies 等一些列复杂操作,遇到带有反爬虫链的网站上述过程就不能用了,nodejs 生态中提供了叫phantom的东东,我们就可以用它来模拟,后面我再介绍如何使用phantom模拟用户操作。