前端加分项 – 手把手教你写爬虫

爬虫的含义

爬虫是什么意思呢?

  • 百度解释:网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
  • 我的解释:按照百度的解释我们不难看出,其实顾名思义,模拟普通用户的浏览行为,获取到一些你想要的获取数据。

爬虫的方法

爬虫这项工作内容,针对前端来说,其实不是特别难,因为都是工作中常用的内容,例如:HTML结构、浏览器查看接口、JS代码等等,这些其实都是前端的日常工作,所以上手起来不是特别的难。

那么我在解释中提到,爬虫是模拟普通用户的浏览行为来获取数据,普通用户的浏览行为是什么样的?

image.png

从程序员的角度,用户只是把网址告诉浏览器,浏览器会去组织请求发送服务器,服务器返回一堆HTML代码和CSS样式,那么我们做爬虫,是不用管这个页面长什么样,毕竟是一个电脑在对电脑沟通,不用管最后浏览器呈现的样子。

这么一想的话,我们是不是可以充当这个浏览器,这么一看,熟悉了,是那味了!不就是一个fetch请求嘛是不是。

DOM 抓取

屏幕前的你可以去是写个js文件,用node跑一下试试。 [滑稽表情]

import fetch from "node-fetch";
function getHtml() {
    fetch('https://www.juejin.cn')
        .then(resp => resp.text())
        .then(data => {console.log(data)})
}
getHtml()

运行这个文件会出现一些问题,可以参考一下解决方案 https://blog.csdn.net/qq_19922839/article/details/120276900

运行成功之后呢,就可以看到下面这张图了。
image.png
我们要抓取的数据,也就包裹在这些代码里了,拿到这HTML代码之后,如何转换位Dom节点,这个JS有很多种方式,我就不一一列举了,转换位DOM节点后,就可以安装以前JQuery的方式,一点点的把值拿出来。

正则表达式抓取

正则表达式的书写,是一个前端工程师的必备技能,这个方法和上面Dom类似,只不过不用解析DOM了,可以针对HTML的字符串直接取值,过于简单这里就不介绍了。

接口抓取 (比较常见)

后端接口请求是前端开发中,经常打交道的一个东西,我们往往在浏览器中按下F12,即可看到该网页请求的一些接口。

该方式获取数据最简单,所以也是最常用,主要为爬虫功能的主力,简单的接口没有任何加密,直接请求即可,拿到结果,即为爬取成功,基本上的技术也都是fetch请求,没有什么难度。

image.png
该方法的最难点,也就是把数据拿出来的时候,字段名称是乱写的,你就需要去绞尽脑汁去揣测这个字段是什么意思呢。

由于大家都知道爬取接口获取数据方式的简单,导致了开发者会对接口,进行各种反爬虫方法。

反爬虫与反反爬虫的爱恨情仇

由于大家都知道了爬虫的存在,都想着去干掉爬虫,但是爬虫么在上面第一段就讲了,爬虫是模拟真实用户行为去抓取数据,所以呢爬虫是禁不掉的,那么大家得知了爬虫最简单的方式是抓取接口,那么你想得到我的数据,那你怎么也得下点功夫么不是,于是针对接口的反爬虫策略就来了。

反爬虫第一计 =.= <封IP>

由于我的数据比较重要,或者类似于短信接口涉及到钱,请求多了会对公司造成严重的损伤,这里就会加上一些限制,例如一个IP,在几分钟内限制访问次数。

遇到这种,应该怎么办呢?很简单么,换IP即可。网络上有IP厂商,例如大象代理,芝麻代理这种IP池厂家,但是普遍价格会高一点,这个需要注意。

image.png
换IP的过程也就是加入了代理机制,请求流程会变成上图一样,每一个请求工具都会提供相关的API,从IP厂商获取到了IP和端口,随后填入API中即可访问。

image.png
例如著名的前端框架Axios就有如下配置,其他框架可以自行翻阅API文档。

反爬虫第二计 =.= <接口鉴权>

在日常前端开发中,经常遇到的,登录成功后,接口会返回一个Token,前端要在请求后端接口时携带Token,这个也就是接口鉴权,这个其实往往是不好破解的。只能通过模拟请求登录接口由此来骗取Token。
不过一般来说,登录接口会加入验证码的一些验证,例如输入图形中的字母、滑动拼图到缺口位置这些验证方式,这些验证码的破解方式,有没有呢?
其实也有,利用 AI 的 CV 方向的一些技术可以解决这些问题,也就是图像处理方向,再配合网页自动化技术也可以破解。由于过于复杂, 本文不做叙述了,有时间的话,我开篇文章单讲一下,感兴趣的同学也可以自己研究一下。

不过好在 天无绝人之路 ,一般的系统都会做Token续期的功能,我们只要通过控制台抓到Token后,找到Token续租的媒介点,也是可以持久的爬取数据的。

反爬虫第三计 =.= <接口加密>

因为大家都知道接口获取数据的难度是最低的,所以呢为了避免这个问题,所以会针对接口加密。
包括但不限于:请求参数加密、返回值加密、增加一些奇怪的特殊算法生成的请求头、针对参数增加签名参数。

往往这种时候,斗智斗勇并且考验代码功底的时候就到了。
参数加密和返回值加密算是最基础的,基本上加密方法就是对称和非对称加密。

对称加密算法的种类有很多,不过百变不离其宗,共性就是只有一个私钥和任意或一个偏移值。私钥基本都会在源码里保存,所以只要把网页Ctrl+S 保存下来,找到那个接口地址,翻一翻前后的代码基本都能找到,至于偏移值,一般来说要么是后端的接口中返回的,要么就是硬编码在网页代码里的,所以基本也都一样,随后有了这些东西之后调用一下CryptoJS库的方法就可以了。

非对称加密算法,和对称加密不太一样的就是,他有两个钥匙,一个是私钥,一个是公钥,公钥是用来加密的,私钥是用来解密的,有了上面解密对称加密的基础之后,这里也是同理,公钥一般硬编码在客户端,或者存在对象服务器里,仔细检查一下接口的前后调用的代码,也是可以找到的。随后的解密方法和上面同理。

网页爬虫好做一些的原因就是,源码前端可以随意保存下来,然后打断点跟代码。所以那些特殊算法的请求头这些,都可以通过查看代码获取到,不过比较恶心的是,代码都是通过编译混淆过的,所以看起来比较恶心,这也就是我刚刚说的,考验代码功底的时候到了。

文章到这里就结束了,有什么不懂或者需要争论的地方欢迎大家私信、评论。

都看到这了,点个赞再走吧宝~

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容