精彩预告:
一名学生卷入梦境,被面试官”押“入刑场直面反爬虫措施与解决方案,被迫无奈开启学霸模式,完成惊天大逆转,被成功录取的故事,请看下文,精彩正在为你揭晓。
士不可以不弘毅,任重而道远。在2020年这个疫情爆发的年代,全国人民借这句古言持续鏖战,让这场全民狙击战,逐渐接近尾声。大大小小的街道开始解封,人们又能向往来一样,走在街头,再也不用担心受怕,而我们这些程序员终于能够出去找工作了,这是第一次去找工作,给了自己一万个理由鼓励自己,最终“坐”在了面试官的面前。
看看这坐姿,像是慌的人吗?
嘿嘿,其实挺慌的,毕竟第一次
面试官清了清嗓子,问道:说一下你以前做过的项目,如果github上有最好
然后还好我前段时间临时抱佛脚,在别人github上找了几个爬虫项目,然后弄清了爬虫项目的构架,以及业务逻辑,使用了哪些爬虫技术等.
由于我事先有点准备,觉得自己还答的可以
于是面试管又问了我,你做过最好的爬虫项目是哪个,有什么特别之处
我就随便挑了我临时抱佛脚的几个项目中挑了一个,由于慌了,挑的项目不太熟,我预料到不好的事情发生,于是我又随便说了下特别之处,估计勉强通过
温馨提示:
给面试官说项目的时候,一定要选择最熟悉的项目,否则留下破绽。切记不要耍小聪明。
于是面试官经过打探了一下我的底细之后,直接开门见山问我,遇到过的哪些反爬虫的策略,你是如何解决的
想难住我,没门,于是我用尽此生最后一次开挂模式,我直接说道:
答:信息就是指客户端发起网络请求时的请求头,而这个校验是指服务端通过对信息的正确性,完整性,或唯一性进行验证或判断,从而区分是用户所为还是爬虫程序所为。
如下图所示这个信息校验型反爬虫又分为六种。
总结:信息校验型反爬虫分为User-Agent反爬虫,cookie反爬虫,签名验证反爬虫,WebSocket握手验证反爬虫,WebSocket消息校验反爬虫,WebSocket Ping反爬虫
User-Agent是干什么的呢?
答:服务器可以从User-Agen对应的值识别客户端使用的操作系统,cpu类型,游览器类型,游览器使用的引擎等信息
解决方案是什么呢?
答:在自定义请求头中加上Postman身份标识,requests是允许自定义请求头的。
什么是cookie?
cookie不仅用于web服务器的用户身份信息存储或状态保持,还应用与反爬虫,因为爬虫程序只获取html数据,并不会保存游览器中的cookie值
解决方案:
答:在自定义请求头中加上cookie信息
这个签名验证反爬虫是干什么的?
答:签名是根据数据源进行计算或者加密的过程,这个签名就具有唯一性和一致性的字符串。用来防止恶意连接,或者数据被篡改。
解决方案
答:通过在文件的查询参数中,看需要的参数,部分加密的参数可能在在网站js脚本中,寻找线索,看js怎么生成这个的这个参数。模拟js生成这个值,一般来说由客户端生成一些随机值和不可逆的md5加密,此时服务器也会使用相同的方式,进行生成这个值,然后客户端的这个值与自己生成的这个值进行比较,如果超出一定的范围,则被认定为反爬虫。
这个握手校验反爬虫是什么?
答:客户端按照WebSocket规范生成握手信息并向服务器发送握手请求,然后服务器会读取并验证信息,并且客户端和服务器端可以不遵守WebSocket规范,比如,在校验信息时,可以同时对referer及User-Agent验证,如果信息里面没有这些东西就会返回403,导致爬取失败。
解决方案:
答:在请求头中加上相关验证信息即可
WebSocket消息校验反爬虫?
答:客户端与服务端互发消息时,对客户端的身份进行校验。如果服务器端不主动推送,那么客户端就无法获取信息,可以在服务器端新增一个逻辑:握手结束后客户端发送特定的消息,服务器端对该消息进行校验,校验通过则将服务器端的数据推送给客户端,否则不做处理
解决方案:
答:客户端发送的新消息修改为数据仓库中没有的键,那么服务器端就不会给客户端推送消息
什么是 WebSocket Ping反爬虫?
答:服务器端可以向客户端发送 Ping 帧,当客户端收到 Ping 帧时应当回复 Pong 帧,如果客户端不回复或者回复的并不是 Pong 帧,那么服务器端就可以人为客户端异常,主动关闭该连接。
解决方案:
答:通常,Ping 帧和 Pong 帧的 Plyload Data 中是没有内容的,所以只要目标服务器发送 Ping 帧时,客户端回复没有任何内容的 Pong 帧即可。
什么是动态渲染反爬虫呢?
答:就是使用js来提升用户体验,常见的就是异步请求,下拉加载等
答:使用selenium套件,这是个测试web应用程序的工具,遇到异步加载,等待数秒之后,或者等待关键节点出现之后再获取数据,下拉加载的解决就是模仿用户滑动滚动条加载数据。还可以使用Puppeteer以及异步渲染服务Splash,将Splash配置到云服务器上,再加上负载均衡,多个爬虫程序可以使用一个API接口渲染页面
总结:文本混淆反爬虫又分为四种,图片伪装反爬虫,CSS偏移反爬虫,SVG映射反爬虫,字体反爬虫
什么是图片伪装反爬虫?
答:将带有文字的图片与正常文字混合在一起,让你难辨真假。
什么是css偏移反爬虫?
答:利用css样式将乱序的文字排版为人类正常阅读的顺序的行为
什么是SVG映射反爬虫?
答:SVG是用来描述二维矢量的一种图片格式,对图片的放大或缩小都不会影响图形的质量。不会影响人正常阅读,而爬虫程序无法像读文字那样获取SVG图形中的内容。
什么是字体反爬虫?
答:在 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模拟进行点击
面试官直接打断我的话,说:哥你过了,我给你登记信息,签合同把。。。
直接把我惊醒,还有这种好事,这不才开始问吗,嘿嘿
突然,妈妈拍打着我的脑袋,说道:儿子,起床了,怎么睡着睡着,还笑呢,梦见啥开心事,给妈说说。
原来这一切都是…
好好了,觉得作者用心了,留下你的