blog icon indicating copy to clipboard operation
blog copied to clipboard

要不要养一条NodeJS爬虫玩玩(一)

Open wxgg opened this issue 6 years ago • 0 comments

要不要养一条NodeJS爬虫玩玩

爬虫?不是用 python 写的吗? 谁告诉你非得用 python 写。nodejs也可以啊。不信我给你写一个。

知识点

    # nodejs 
    # https 和 http 
    # DOM Query

image

实例

第一步

   //先写个简单的。
    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()

运行结果 image

是不是太简单了,能干啥啊? 那换个地址,我们抓取一下百度新闻的热点新闻。

第二步

    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()

上述代码输出的结果是整个文本,我们得找到热点新闻那一栏,咋弄? 用正则?太难了不想写。 下面让你们见识一下优雅的程序员是怎么做的。

首先选择一下找到热点新闻的元素列表。 image 下来我们通过 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()

运行结果 image image 这次我们依赖的是cheeriocheerio其实就是和 jquery一样的dom选择器。就想直接操作dom一样简单,但这个不能模拟用户操作,如 click 动作,类似操作 xml 文档。

总结

其实文章最开头列举的三个知识点就是这次讲解的主要内容,nodejs 环境下,我们可以通过 https 和 http 包获得页面文本,再通过cheerio获截取得我们需要的信息。这个只是最简单的一个爬虫的应用,我们可能还要模拟用户登录,保存用户cookies 等一些列复杂操作,遇到带有反爬虫链的网站上述过程就不能用了,nodejs 生态中提供了叫phantom的东东,我们就可以用它来模拟,后面我再介绍如何使用phantom模拟用户操作。

wxgg avatar Dec 30 '19 11:12 wxgg