Node.js Puppeteer 爬虫简单学习笔记

课程内容及目标

前置知识

第一部分

什么是爬虫?

2、爬虫的意义

爬虫基础

简单例子:爬取黑马程序猿官网所有老师照片列表

1、发送一个 HTTP 请求

2、使用 cheerio 库解析 HTML 结构

3、提取 img 标签的 src 属性

4、将处理好的数据进行存储

爬取新闻信息

第二部分

Puppeteer 爬虫

开始使用 Puppeteer

Puppeteer 的常用方法

打开网页

点击

输入内容

keyboard.press(key[, options])

page.waitForNavigation([options])

page.waitForSelector(selector[, options])

page.$(selector)

page.$$(selector)

page.$eval(selector, pageFunction[, ...args])

page.$$eval(selector, pageFunction[, ...args])

page.screenshot([options])

page.pdf([options])

page.setDefaultNavigationTimeout(timeout)

page.reload([options])

page.waitForSelector(selector[, options])

1、案例:获取音乐信息并保存本地

2、案例:获取图片信息并保存本地

3、案例:获取视频信息并保存本地

4、案例:获取分页新闻列表数据

5、案例:获取国家统计局新闻列表数据

课程内容及目标

1、爬虫介绍

2、制作一个自动下载图片的小爬虫

3、使用 Puppeteer 爬取动态网站

前置知识

1、js 基础

2、node.js 基础

第一部分

什么是爬虫?

可以把互联网比做成一张“大网”,爬虫就是在这张大网上不断爬取信息的程序

所以一句话总结:爬虫是请求网站并提取数据的自动化程序

爬虫的基本工作流程如下:

1、向指定的 URL 发送 Http 请求

2、获取响应(HTML、XML、JSON、二进制等数据)

3、处理数据(解析 DOM、解析 JSON 等)

4、将处理好的数据进行存储

2、爬虫的意义

爬虫就是一个探测程序,它的基本功能就是模拟人的行为去各个网站转悠,点点按钮,找找数据,或者把看到的信息背回来。就像一只虫子在一幢楼里不知疲倦地爬来爬去。

我们每天使用的百度和Google,其实就是利用了这种爬虫技术:每天放出无数爬虫到各个网站,把他们的信息抓回来,存到数据库中等你来检索。

抢票软件,就相当于撒出去无数个分身,每一个分身都帮助你不断刷新 12306 网站的火车余票。一旦发现有票,就马上下单,然后对你喊:大爷快来付款呀。

当然,有些网站是不能被过分骚扰的,其中排第一的就是出行类行业。

12306 之所以会出如此变态的验证码,就是因为被爬虫折磨的无可奈何

正所谓道高一尺魔高一丈,某些爬虫工具,为了解决这种变态验证码,甚至推出了“打码平台”。原理就是爬虫还是不断工作,但只要遇到验证码,就通过打码平台下发任务,打码平台另一边就雇佣一大堆网络闲人,只要考到有验证码来了,就人工选一下验证码,完美的让程序与人工结合。

爬虫基础

简单例子:爬取黑马程序猿官网所有老师照片列表

1、发送一个 HTTP 请求

发送 HTTP 请求并获取响应

在学习爬虫之前,需要对 HTTP 请求充分了解,因为爬虫的原理就是发送请求到指定 URL ,获取响应后并处理

最基础的发送 HTTP 请求,示例代码如下:

// 目标地址

const baseURL = 'https://web.itheima.com/teacher.html#ajavaee'

// 引入 HTTPS 模块

const http = require('https')

// 创建请求对象(此时未发送 HTTP 请求)

const req = http.request(baseURL, res => {

// 异步的响应

let chunks = []

// 监听 data 事件,获取传递过来的数据片段

// 拼接数据片段

res.on('data', c => chunks.push(c))

// 监听 end 事件,获取数据完毕时触发

res.on('end', () => {

// 拼接所有的 chunk ,并转换成字符串 ==> html 字符串

console.log(Buffer.concat(chunks).toString('utf-8'));

})

})

// 将请求发送出去

req.end()

2、使用 cheerio 库解析 HTML 结构

cheerio 地址

安装 cheerio 库

npm install cheerio

3、提取 img 标签的 src 属性

示例代码如下:

// 目标地址

const HOST = 'https://web.itheima.com/'

const baseURL = HOST + 'teacher.html#ajavaee'

// 引入 HTTPS 模块

const http = require('https')

const cheerio = require('cheerio')

// 创建请求对象(此时未发送 HTTP 请求)

const req = http.request(baseURL, res => {

// 异步的响应

let chunks = []

// 监听 data 事件,获取传递过来的数据片段

// 拼接数据片段

res.on('data', c => chunks.push(c))

// 监听 end 事件,获取数据完毕时触发

res.on('end', () => {

// 拼接所有的 chunk ,并转换成字符串 ==> html 字符串

let htmlStr = Buffer.concat(chunks).toString('utf-8')

// 通过 cheerio 解析 html

let $ = cheerio.load(htmlStr)

// 所有老师照片列表数组

const photoList = []

// 分析网页 html 结构,通过 jQuery 选择器获取想要爬取的元素

$('.tea_con .tea_txt ul li > img').each((index, item) => {

// 获取照片地址

// 防止 URL 地址中包含中文,需要通过 encodeURI 进行编码

photoList.push(HOST + encodeURI($(item).attr('src')))

})

})

})

// 将请求发送出去

req.end()

注意: :请求 URL 地址中不能有中文,为了防止 URL 包含中文需要通过 encodeURI() 编码

4、将处理好的数据进行存储

使用 download 库把照片存储到指定目录中

安装

npm install download

示例代码如下(完整代码)

// 目标地址

const HOST = 'https://web.itheima.com/'

const baseURL = HOST + 'teacher.html#ajavaee'

// 引入 HTTPS 模块

const http = require('https')

const cheerio = require('cheerio')

const download = require('download')

// 创建请求对象(此时未发送 HTTP 请求)

const req = http.request(baseURL, res => {

// 异步的响应

let chunks = []

// 监听 data 事件,获取传递过来的数据片段

// 拼接数据片段

res.on('data', c => chunks.push(c))

// 监听 end 事件,获取数据完毕时触发

res.on('end', () => {

// 拼接所有的 chunk ,并转换成字符串 ==> html 字符串

let htmlStr = Buffer.concat(chunks).toString('utf-8')

// 通过 cheerio 解析 html

let $ = cheerio.load(htmlStr)

// 所有老师照片列表数组

const photoList = []

// 分析网页 html 结构,通过 jQuery 选择器获取想要爬取的元素

$('.tea_con .tea_txt ul li > img').each((index, item) => {

// 获取照片地址

// 注意:encodeURI() 函数可把字符串作为 URI 进行编码。

photoList.push(HOST + encodeURI($(item).attr('src')))

})

// 存储照片

// dist 为照片存储目录名称

Promise.all(photoList.map(url => download(url, 'dist'))).then(() => {

console.log('下载完成');

});

})

})

// 将请求发送出去

req.end()

爬取新闻信息

爬取目标:http://www.sd.chinanews.com.cn/more/news/pic/2.html

伪造请求头(headers),一般情况下从浏览器 Network 请求头中复制

示例代码如下:

const http = require('https')

const cheerio = require('cheerio')

// 目标地址

const HOST = 'https://www.itheima.com/'

const baseURL = HOST + 'news/newschild_1.html'

// 创建发送请求对象

const req = http.request(baseURL, {

method: 'GET',

精彩链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。