Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
wxgg opened this issue Dec 30, 2019 · 0 comments
Open

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

wxgg opened this issue Dec 30, 2019 · 0 comments

Comments

@wxgg
Copy link

wxgg commented Dec 30, 2019

要不要养一条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 wxgg changed the title 如何写一个NodeJS爬虫 如何写一个NodeJS爬虫(一) Dec 30, 2019
@wxgg wxgg changed the title 如何写一个NodeJS爬虫(一) 要不要养一条NodeJS爬虫玩玩(一) Dec 30, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant