面试官竟然开门见山就问反爬虫措施与解决方案,这谁顶得住啊!

本文主要是介绍面试官竟然开门见山就问反爬虫措施与解决方案,这谁顶得住啊!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

精彩预告:
一名学生卷入梦境,被面试官”押“入刑场直面反爬虫措施与解决方案,被迫无奈开启学霸模式,完成惊天大逆转,被成功录取的故事,请看下文,精彩正在为你揭晓。

文章目录

  • 前景摘要
  • 精彩正文
    • 信息校验码型反爬虫
    • 信息校验码型反爬虫的解决方案
      • User-Agent反爬虫
      • Cookie反爬虫
      • 签名验证反爬虫
      • WebSocket握手校验反爬虫
      • WebSocket消息校验反爬虫
      • WebSocket Ping反爬虫
    • 动态渲染反爬虫
      • 动态渲染反爬虫解决方案
    • 文本混淆反爬虫
      • 图片伪装反爬虫
      • CSS偏移反爬虫
      • SVG映射反爬虫
      • 字体反爬虫
    • 文本混肴反爬虫通用解决方案
    • 特征识别反爬虫
      • 特征识别反爬虫的解决方案
    • 验证码
      • 验证码的解决方案
  • 梦醒时分

前景摘要

士不可以不弘毅,任重而道远。在2020年这个疫情爆发的年代,全国人民借这句古言持续鏖战,让这场全民狙击战,逐渐接近尾声。大大小小的街道开始解封,人们又能向往来一样,走在街头,再也不用担心受怕,而我们这些程序员终于能够出去找工作了,这是第一次去找工作,给了自己一万个理由鼓励自己,最终“坐”在了面试官的面前。
在这里插入图片描述
看看这坐姿,像是慌的人吗?
嘿嘿,其实挺慌的,毕竟第一次

精彩正文

面试官清了清嗓子,问道:说一下你以前做过的项目,如果github上有最好
然后还好我前段时间临时抱佛脚,在别人github上找了几个爬虫项目,然后弄清了爬虫项目的构架,以及业务逻辑,使用了哪些爬虫技术等.
由于我事先有点准备,觉得自己还答的可以
于是面试管又问了我,你做过最好的爬虫项目是哪个,有什么特别之处
我就随便挑了我临时抱佛脚的几个项目中挑了一个,由于慌了,挑的项目不太熟,我预料到不好的事情发生,于是我又随便说了下特别之处,估计勉强通过
温馨提示
给面试官说项目的时候,一定要选择最熟悉的项目,否则留下破绽。切记不要耍小聪明。
于是面试官经过打探了一下我的底细之后,直接开门见山问我,遇到过的哪些反爬虫的策略,你是如何解决的

想难住我,没门,于是我用尽此生最后一次开挂模式,我直接说道:

信息校验码型反爬虫

:信息就是指客户端发起网络请求时的请求头,而这个校验是指服务端通过对信息的正确性,完整性,或唯一性进行验证或判断,从而区分是用户所为还是爬虫程序所为。
如下图所示这个信息校验型反爬虫又分为六种。
在这里插入图片描述
总结:信息校验型反爬虫分为User-Agent反爬虫,cookie反爬虫,签名验证反爬虫,WebSocket握手验证反爬虫,WebSocket消息校验反爬虫,WebSocket Ping反爬虫

信息校验码型反爬虫的解决方案

User-Agent反爬虫

User-Agent是干什么的呢
:服务器可以从User-Agen对应的值识别客户端使用的操作系统,cpu类型,游览器类型,游览器使用的引擎等信息
解决方案是什么呢?
:在自定义请求头中加上Postman身份标识,requests是允许自定义请求头的。

Cookie反爬虫

什么是cookie?
cookie不仅用于web服务器的用户身份信息存储或状态保持,还应用与反爬虫,因为爬虫程序只获取html数据,并不会保存游览器中的cookie值
解决方案
:在自定义请求头中加上cookie信息

签名验证反爬虫

这个签名验证反爬虫是干什么的?
:签名是根据数据源进行计算或者加密的过程,这个签名就具有唯一性和一致性的字符串。用来防止恶意连接,或者数据被篡改。
解决方案
:通过在文件的查询参数中,看需要的参数,部分加密的参数可能在在网站js脚本中,寻找线索,看js怎么生成这个的这个参数。模拟js生成这个值,一般来说由客户端生成一些随机值和不可逆的md5加密,此时服务器也会使用相同的方式,进行生成这个值,然后客户端的这个值与自己生成的这个值进行比较,如果超出一定的范围,则被认定为反爬虫。

WebSocket握手校验反爬虫

这个握手校验反爬虫是什么
:客户端按照WebSocket规范生成握手信息并向服务器发送握手请求,然后服务器会读取并验证信息,并且客户端和服务器端可以不遵守WebSocket规范,比如,在校验信息时,可以同时对referer及User-Agent验证,如果信息里面没有这些东西就会返回403,导致爬取失败。
解决方案
:在请求头中加上相关验证信息即可

WebSocket消息校验反爬虫

WebSocket消息校验反爬虫?
:客户端与服务端互发消息时,对客户端的身份进行校验。如果服务器端不主动推送,那么客户端就无法获取信息,可以在服务器端新增一个逻辑:握手结束后客户端发送特定的消息,服务器端对该消息进行校验,校验通过则将服务器端的数据推送给客户端,否则不做处理

解决方案
:客户端发送的新消息修改为数据仓库中没有的键,那么服务器端就不会给客户端推送消息

WebSocket Ping反爬虫

什么是 WebSocket Ping反爬虫?
:服务器端可以向客户端发送 Ping 帧,当客户端收到 Ping 帧时应当回复 Pong 帧,如果客户端不回复或者回复的并不是 Pong 帧,那么服务器端就可以人为客户端异常,主动关闭该连接。
解决方案
:通常,Ping 帧和 Pong 帧的 Plyload Data 中是没有内容的,所以只要目标服务器发送 Ping 帧时,客户端回复没有任何内容的 Pong 帧即可。

动态渲染反爬虫

什么是动态渲染反爬虫呢
:就是使用js来提升用户体验,常见的就是异步请求,下拉加载等

动态渲染反爬虫解决方案

:使用selenium套件,这是个测试web应用程序的工具,遇到异步加载,等待数秒之后,或者等待关键节点出现之后再获取数据,下拉加载的解决就是模仿用户滑动滚动条加载数据。还可以使用Puppeteer以及异步渲染服务Splash,将Splash配置到云服务器上,再加上负载均衡,多个爬虫程序可以使用一个API接口渲染页面

文本混淆反爬虫

在这里插入图片描述
总结:文本混淆反爬虫又分为四种,图片伪装反爬虫,CSS偏移反爬虫,SVG映射反爬虫,字体反爬虫

图片伪装反爬虫

什么是图片伪装反爬虫?
:将带有文字的图片与正常文字混合在一起,让你难辨真假。
解决方案?
答: 在浏览器中看到的文字其实是图片格式,无法直接抓取。首先拿到图片的url,用requests请求得到二进制数据content,用io转换成字节流传入光学库进行识别,就ok了

CSS偏移反爬虫

什么是css偏移反爬虫?
:利用css样式将乱序的文字排版为人类正常阅读的顺序的行为,css偏移方式有很多种,常见的两种是替换错误方式(源代码中,数据在标签中正常显示,但是规律是错误,对于此类计算,偏移量都在对应的标签中),单独样式引用(源代码中,数据在标签中不正常显示,都是引用源代码开头的style样式,其中样式也对各个数据进行偏移和混淆)。
解决方案
答: 对于此反爬虫,无非是分析、研究css偏移的规律,再通过代码去设计对应的规律,来得出正确的值。提一下,此类大多的left的偏移量相关

SVG映射反爬虫

什么是SVG映射反爬虫?
:SVG是用来描述二维矢量的一种图片格式,对图片的放大或缩小都不会影响图形的质量。不会影响人正常阅读,而爬虫程序无法像读文字那样获取SVG图形中的内容。
解决方案
答: 获取源代码;解析class样式,将信息采集下来;
获取svg文件源代码;获取css样式中对应的坐标;
计算位置差距,进行关系映射。

字体反爬虫

什么是字体反爬虫
:在 CSS3 时代,开发者可以使用@font-face 为网页指定字体,对用户计算机字体的依赖。开发者可将心仪的字体文件放在 Web 服务器上,并在 CSS 样式中使用它。用户使用浏览器访问 Web 应用时,对应的字体会被浏览器下载到用户的计算机上。 CSS 的作用是修饰 HTML ,所以在页面渲染的时候不会改变 HTML 文档内容。由于字体的加载和映射工作是由 CSS 完成的,所以即使我们借助 Splash、Selenium 和 Puppeteer 工具也无法获得对应的文字内容。使得爬虫程序无法获得正确的数据。

文本混肴反爬虫通用解决方案

:使用python连接到Splah到目标网页进行截图,拿到图之后保存本地,使用PyTesseract库进行识别指定的图片。

特征识别反爬虫

什么是特征识别反爬虫?
:通过对客户端的特征,属性或者用户的行为特点来区分正常用户和爬虫程序的手段,最典型的例子,就是selenium对csdn的账号密码登陆,对网页任何操作都会直接被认定为程序,因为webdirver特征的泄露被识别,已经判定为爬虫程序。

特征识别反爬虫的解决方案

:webdriver的识别依赖navigator.webdriver的返回值,我们可以在verify_webdriver方法触发之前将navigator.webdriver的值改为正常的。使用selenium中的执行js代码的方法,进行强行修改值。

验证码

在这里插入图片描述
总结:验证码分为五种,字符验证码,计算型验证码,滑动验证码,滑动拼图验证码,文字点选验证码

验证码的解决方案

字符验证码是什么样的?
:这种验证码主要是通过用户输入图片中的字母、数字、汉字等进行验证
如何解决
:这种是最简单的一种,只要识别出里面的内容,然后填入到输入框中即可。这种识别技术叫OCR,这里我们推荐使用Python的第三方库,tesserocr。对于没有什么背影影响的验证码,直接通过这个库来识别就可以。但是对于有嘈杂的背景的验证码这种,直接识别识别率会很低,遇到这种我们就得需要先处理一下图片,先对图片进行灰度化,然后再进行二值化,再去识别,这样识别率会大大提高。
什么是计算型验证码
: 计算型验证码就是在字符验证码的基础上增加了数学运算。
解决办法
答:跟字符验证码的解决办法一样,只不过获取数字之后要进行数学运算
什么是滑动验证码
:通过滑动滑块进行验证的验证码
如何解决
:通过selenium库进行选中滑块进行模拟人的行为进行滑动
什么是滑动拼图验证码
再滑动验证码的基础上增加了随机滑动距离,需要人找到图片的缺口,然后将滑块滑过去进行填补的验证方式
我们的解决方案是什么呢?
:在selenium的基础上增加一个库Pillow,图像识别,找到滑块的位置和缺口的位置,计算缺口偏移量,然后模拟鼠标拖动,将滑块拖到缺口位置
什么是文字点选验证码
:比滑动拼图验证码更难的验证码,需要按照要求来按照顺序点击文字的验证码
解决办法
:这是最难的验证码,目前比较好的办法就是使用第三方接口,接口返回的坐标,用selenium模拟进行点击

面试官直接打断我的话,说:哥你过了,我给你登记信息,签合同把。。。

直接把我惊醒,还有这种好事,这不才开始问吗,嘿嘿

梦醒时分

突然,妈妈拍打着我的脑袋,说道:儿子,起床了,怎么睡着睡着,还笑呢,梦见啥开心事,给妈说说。
在这里插入图片描述
原来这一切都是…
好好了,觉得作者用心了,留下你的👍
在这里插入图片描述

这篇关于面试官竟然开门见山就问反爬虫措施与解决方案,这谁顶得住啊!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/416495

相关文章

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Java死锁问题解决方案及示例详解

《Java死锁问题解决方案及示例详解》死锁是指两个或多个线程因争夺资源而相互等待,导致所有线程都无法继续执行的一种状态,本文给大家详细介绍了Java死锁问题解决方案详解及实践样例,需要的朋友可以参考下... 目录1、简述死锁的四个必要条件:2、死锁示例代码3、如何检测死锁?3.1 使用 jstack3.2

html 滚动条滚动过快会留下边框线的解决方案

《html滚动条滚动过快会留下边框线的解决方案》:本文主要介绍了html滚动条滚动过快会留下边框线的解决方案,解决方法很简单,详细内容请阅读本文,希望能对你有所帮助... 滚动条滚动过快时,会留下边框线但其实大部分时候是这样的,没有多出边框线的滚动条滚动过快时留下边框线的问题通常与滚动条样式和滚动行

Oracle修改端口号之后无法启动的解决方案

《Oracle修改端口号之后无法启动的解决方案》Oracle数据库更改端口后出现监听器无法启动的问题确实较为常见,但并非必然发生,这一问题通常源于​​配置错误或环境冲突​​,而非端口修改本身,以下是系... 目录一、问题根源分析​​​二、保姆级解决方案​​​​步骤1:修正监听器配置文件 (listener.

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地

安装centos8设置基础软件仓库时出错的解决方案

《安装centos8设置基础软件仓库时出错的解决方案》:本文主要介绍安装centos8设置基础软件仓库时出错的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录安装Centos8设置基础软件仓库时出错版本 8版本 8.2.200android4版本 javas

Java空指针异常NullPointerException的原因与解决方案

《Java空指针异常NullPointerException的原因与解决方案》在Java开发中,NullPointerException(空指针异常)是最常见的运行时异常之一,通常发生在程序尝试访问或... 目录一、空指针异常产生的原因1. 变量未初始化2. 对象引用被显式置为null3. 方法返回null

宝塔安装的MySQL无法连接的情况及解决方案

《宝塔安装的MySQL无法连接的情况及解决方案》宝塔面板是一款流行的服务器管理工具,其中集成的MySQL数据库有时会出现连接问题,本文详细介绍两种最常见的MySQL连接错误:“1130-Hostisn... 目录一、错误 1130:Host ‘xxx.xxx.xxx.xxx’ is not allowed

redis在spring boot中异常退出的问题解决方案

《redis在springboot中异常退出的问题解决方案》:本文主要介绍redis在springboot中异常退出的问题解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴... 目录问题:解决 问题根源️ 解决方案1. 异步处理 + 提前ACK(关键步骤)2. 调整Redis消费者组