如何制作一个简单的网络爬虫?nodejs实现

如何制作一个简单的网络爬虫?nodejs实现

接下来有打算每半个月写一点东西,不然写东西的频率太低就会造成正反馈,产出越来越少了。

这段时间一共做了三个爬虫:

  • 爬取丁香园的疫情数据
  • 爬取联想的虚拟货币乐豆
  • 第三个跟第一个类似,不过工作量大一点

一共用了两种不同的技术,前两个是自己的思路,用的是nodejs+express+superagent,实话实说,nodejs做后台确实对数据很友好,再用一下Sequelize做ORM对象映射,真的非常的方便。

做这个也是为了熟悉express的架构为以后填坑,虽然坑也不是特别多。

自己还给Sequelize文档做了一个镜像仓库,方便访问。文档

不过用JavaScript写程序有一点着实无法避免,那就是异步操作。

JavaScript作为浏览器的主要逻辑实现语言,少不了对网络操作的支持,如果浏览器不使用异步来获取数据的话就会有页面加载缓慢等问题,而在JavaScript写的后端中也是避免不了处理异步操作,比较头疼的就是循环异步操作,我查了网上很多的文档,主要的解决方案是循环递归嵌套promise,然后保证获取到最后一个promise对象,然后等待他的resolve或者reject。

来详细说说这几个工程吧。

丁香园数据爬取

这个项目是我自发进行的,做了大概有三四天的样子吧。

分析页面数据

打开丁香园的网站,右键查看网页源码,可以看到丁香园的数据是后端渲染的,所有需要的数据都以json的形式嵌入到html的JavaScript中。

其实最开始的丁香园页面并不是这个样子的,最开始并没有那么直观,都是写在html标签页里。

 我估计是为了方便各位网友爬取它的数据?毕竟写成html+JavaScript的非常利于爬取

而且里面的数据几乎都已经是完美严格的json格式,只需要使用JSON.parse()就好了。后台也没什么好说的,直接写一个定时器,定时爬取即可。暴露一些接口就能在GitHub上收割

联想虚拟货币爬取

这是酷安老哥找我做的一个项目,毕竟是人生中第一笔外包,我犹豫了两分钟马上就开始做了。第一天花了半天研究了页面,分析了重难点。

  • 每一个账号的货币数量是不同的,需要登陆账号
  • 联想对单个IP有登录限制,如果单位时间内请求过多就会封锁IP一段时间
  • 获取网页元素

第一点是我在这部分中遇到的第一个坑。因为以前做的都是不用登陆的页面,只需要获取的HTML数据就可以直接分析了,所以上网查了一些资料。

其实要解决起来也很简单,就是模拟登陆操作,获取联想服务器返回的cookie数据,然后之后都带着这个cookie去访问货币查询的页面就好了。

这里穿插一些我对网页安全性的思考:

网页是安全的吗?

不是,没有网页是安全的,纯粹的网页几乎不可能是完全安全的,所以很多的网银都需要插上一些硬件工具去确保安全性。

那么网页可以做到相对安全吗?

可以,也是应该的。

使用session或者cookie或是token来区别用户属性,避免未登录的未知用户查看敏感页面,并加上过期特性,保证数据的安全。

使用不可逆的加密方式对用户输入的密码加以保护,只有这样,后台在不需要知道用户真实密码的情况下确认用户的登录状态。我个人认为MD5加密是一种对我这个水平而言相对较好的用户信息加密方式。

在分析联想的登录界面时,发现了一个让我哭笑不得的地方。

  • 联想的登录页面的密码是加密的
  • 加密用的算法是base64,这个不是不可逆的加密算法

百度百科

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。

Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。

甚至在联想的某些登录页面,密码是明文传输的…我对联想的技术水平是真的无语了,我就不说是哪几个页面了。

解决了登录这个问题之后就基本上搞定了一大半。

而后是运维和调优,其间遇到IP被封锁,我就设了爬取时间间隔,就基本上没出过问题了。

信息获取的方式

现在网页主要是两种

  1. 后端渲染的SSR页面,或者是prerender预渲染
  2. 单页面应用,前端请求数据前端渲染

第二种对爬虫不友好,只能手动去找前端接口,然后看运气能能不能请求到对应的数据,比较随缘。

第一种的话我现在大多是用的正则表达式,JavaScript对正则还是比较友好的,操作dom也很方便,基本流程就是

  • 查看网页源码
  • 找到需要数据
  • 寻找唯一标识符
  • 编写正则表达式
  • 挑选数据并保存或者发送

在使用正则表达式之前可以使用dom操作工具将需要搜索的范围缩小,便于匹配。

如何制作一个简单的网络爬虫?nodejs实现

https://www.tanknee.cn/2020/03/15/spider/

作者

TankNee

发布于

03/15/2020

更新于

06/18/2022

许可协议

评论