Koa2 + Puppeteer 开发一个爬虫系统

66 篇文章 0 订阅
66 篇文章 0 订阅

大家好!今天给大家介绍的是Koa2 + Puppeteer 开发一个爬虫系统,有时候我们想要一些测试数据。自己去造数据又非常麻烦。怎么办呢?今天就给大家介绍一个比较好的办法,写一个爬虫工具。

项目初始化

一、安装 koa生成器依赖

npm i koa-generator -g

二、创建koa2 项目

koa2 crawler

三、切换目录

cd crawler

四、安装依赖

npm i

五、安装 puppeteer

npm i puppeteer -S

  1. 运行项目

npm run dev

如果npm 的版本是6点几的版本,项目应该能正常运行, 如果npm 是比较高的版本会报一个错, '.'不是一个命令。 这时需要改动下package.json 中script中的dev 值改成nodemon bin/www

原来的: "dev": "./node_modules/.bin/nodemon bin/www", 现在的:"dev": "nodemon bin/www",

代码编写

一、打开rotues文件夹下面的index.js

二、删掉无用的路由

三、导入puppeteer

const pt = require('puppeteer')

添加路由方法:

创建一个无头浏览器:const bs = await pt.launch(),

声明一个保存需要爬取的页面地址: url = 'https://www.mi.com/shop',

打开一个tab: pg = await bs.newPage()

加载指定页面: await pg.goto(url)

调用evaluate 方法,evaluate 方法接收一个函数作为参数,这个函数里面相当于浏览器环境,可以通过dom 操作获取指定网页的数据。

evaluate方法完整实现:

关闭浏览器: await bs.close()

响应数据到前端:

访问 http://localhost:3000/xiaomi 查看效果:

可以看到数据爬取到了。效果是实现了,那么我们的代码实现有没有问题呢?

我们现是在主进程中完成的爬取逻辑,是不太合理的,因为一个项目都会有多个api 请求,这样很容易阻碍其他方法和请求的运行。

性能优化-简单抽取子进程

新建puppeteer 文件夹 新建index.js

内容如下:

注意: 大部分逻辑还是之前的逻辑, 新增了两个不一样的, 数据获取到之后 利用process.send(result) 发送到主进程。process.exit(0) 退出子进程,主进程能收到相关消息。

主进程:routes index.js

导入const cp = require('child_process') 处理主进程和子进程之间的消息传递, 导入const { resolve } = require('path') 处理路径相关

请求方法修改:

删除了之前的爬取逻辑改成引入了。添加了message, exit,error的事件监听。 现在来访问下http://localhost:3000/xiaomi 看下效果

会发现变成了Not Found,问题出在哪里呢?

主要出现在message 这个方法这个地方,ctx 写在message 的方法监听里面是不行的。因为页面已经提返回了。怎么办呢? 可以利用Promise和await 进行改造下

来看下改造后的代码:

现在再来访问下http://localhost:3000/xiaomi 看下效果

发现正常了。

基本功能实现了,但是回过头来看看,代码写得还是很乱,没有层次感。所以接下来就要着重优化下代码,将爬取逻辑封装,将子进程方法封装,controllers 控制器封装。

代码层次优化,封装子进程方法,爬虫方法

  1. 新建libs 文件夹
  2. libs 新建crawler.js 封装爬虫方法
  3. libs 新建utils.js 封装子进程方法
  4. 新建crawlers文件夹 用于存放具体爬虫的业务文件
  5. 新建milist.js 用于存放爬起小米网站的逻辑
  6. 新建controllers 文件夹存放控制器
  7. controllers 下新建Crawler.js 存放爬虫控制器
  8. 修改routes下面的index.js文件名为crawler.js
  9. 修改app.js 中 index 为crawler
  10. 访问 http://localhost:3000/crawler/xiaomi 看效果

先来看看utils.js 方法的封装:

爬虫方法的封装:

crawlers/milist.js 的实现

controllers/Crawler.js 爬虫控制器方法实现:

routes/crawler.js 实现:

app.js 的实现:

访问http://localhost:3000/crawler/xiaomi 查看效果:

可以看到结果也正常返回。结果是和之前一样,但是代码的层级结果清晰了很多,以后维护也会非常方便。

Koa2 + Puppeteer 开发一个爬虫系统 的分享就到这了,感谢收看,一起学习一起进步

原文链接:https://juejin.cn/post/7409138396792782882

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值