2018年我涉猎极深的技术——爬虫技术

        爬虫技术是我今年涉猎极深的技术,今年很多时间都在实践该技术(也就是单纯挂机罢了)。在我看来,爬虫是一个比较实用的工具,它可以采集数据,可以定向提取信息,整合下载后可以进行定向资源获取。当然,使用爬虫让我有一种作弊的感觉,毕竟是盗用别人的数据来丰富自己的信息。

       爬虫从我本身的理解,从技术上可以分为前端爬虫与后台爬虫。两种爬虫实现技术不同,实现策略也不同。前端爬虫一般使用JS或python进行处理,实现策略是模拟人的行为。前端爬虫一般是依据人的行为来定制脚本(甚至录制脚本),利用脚本的重复执行来解析网站信息,实现爬取的效果。这种前端爬虫的优点是容易理解、易上手,缺点是无法越界,由于前端爬虫是模拟人的行为,所以,前端要获取的数据或者要实现的功能必须是页面中有触发点的功能,如果功能没有触发点,前端爬虫就会很无力。例如:我们要下载在线播放的视频,但是视频在页面上本身没有下载功能,那么如果只是基于前端处理,是绝对无法实现该动作的。与前端爬虫相对的后端爬虫,处理技术一般使用C++、Java等后台编程语言,后端爬虫的实现策略是页面结构分析。后台爬虫会将页面整个提取到后台后,进行整体结构解析,提取需要的信息。相对于前端爬虫,后台爬虫需要有一定网页基础与网络基础,处理模式上可能需要更多的逻辑处理。后台爬虫的优点是信息的透明性,这点让可以获取的数据可以随心所欲的解析与使用,但是后台爬虫的缺点也很明显,无法处理过于复杂的JS处理页面。比如,某个页面的链接a,我们要获取跳转地址,如果跳转地址使用的href属性,那么我们可以解析结构获取,如果使用的是js绑定方法,那么就麻烦了很多,如果这部分方法被封入某个引入的JS文件或者设置了js变量,那么要解析就更加麻烦。能够将前端爬虫与后台爬虫结合使用的人是很厉害的,我目前到不了这个程度,这个阶段我只是使用过后台爬虫。

       后台爬虫我是使用的底层框架是htmlunit与jsoup,其中htmlunit实现了浏览器的功能。Jsoup实现了页面解析的功能。这里可能大家会有疑问,直接使用httpclient之类的工具获取页面信息不就可以了吗,为什么还要使用htmlunit?实际上,现在很多html页面都使用了延迟加载技术,在第一次访问页面的时候只加载结构,之后通过js加载数据,渲染页面,如果只是使用httpclient,碰到这种情况,就只能获取页面结构,而htmlunit内部模拟了一个浏览器机制,也就是说,可以支持js与css的处理,它可以设置一个响应时间,在响应时间内等待页面响应完全,这样就可以获取到完整的页面内容。Jsoup框架实现了类似jquery的方式定位元素的方法,对于熟悉前端的人来说,可以快速定位页面元素,解析数据,非常方便,有了这两个框架,基本的爬虫处理就可以进行。

       在这段时间的爬虫处理中,我总结了一个基本的爬虫处理模型,这个模型在很多网站中都适用。模型的结构为入口-分页-明细 三层结构。在很多网站中,都有数据列表页面,展示的信息采用分页+标签(或类别)的方式,而列表中的每条数据都会有一个明细页面,从这点来看,如果我需要网站的全部数据的话,这里就是网站的一个最佳的提取入口,我可以定制两种爬虫,一种爬取分页的结构,一种爬取明细页面的结构,爬取分页结构的爬虫可以爬取页面中所有明细页面的连接,然后每个连接构造各自的明细爬虫进行爬取,这样如果在入口中实现分页的循环调用,就可以一口气爬取网站的全部数据,这个模型在目前的使用中,非常好用,适用性很广。

       在很多情况下,我们不可能一直开启爬虫,我们一旦关机,爬虫肯定会停止,那么当我们下次再次开启的时候,我们不能录入重复数据,可以的话,我们也希望可以从上次停止的位置继续向下爬取,这也就是断点续传的问题了。断点续传是一个比较麻烦的问题,要完全自动化难度比较大,所以这次,我使用的是半自动化的处理方式,首先,将已经解析过的页面地址记录进明细信息中存储数据库,在解析明细页面的时候,首先查询该页面是否解析过,解析过则直接跳过。在入口中提供解析固定范围页面的功能,在停止爬虫前,手动记录停止页面索引,写入程序,控制下次爬虫起始位置,这样,就基本解决了断点续传问题。

       关于下载整合的问题在之前已经说过,这里就不做过多说明了。下面来介绍一下反爬策略。所谓道高一尺,魔高一丈,很多网站为了防止被爬取,采用了各种非常恶心的反爬策略。这些策略中有些涉及安全,有些涉及风控,有些涉及业务。目前我简单提一下我遇到的策略。

       策略1:登录验证。这种在很多论坛与后台管理系统中非常常见,本质上,在浏览器访问的时候服务器会验证session中是否包含用户信息,无用户信息则必须登录,平台中也支持这种机制。实际上,这种机制很容易破解,服务器中的session是依赖浏览器送上来的cookie进行查找的,那么,只要我先登录一次,然后,将本次的cookie信息添加到爬虫请求头信息中即可,虽然每次登录都要调整,但是却并不麻烦。

       策略2:IP封杀。这是一个比较麻烦的策略,很多互联网上的网站都有这种策略,当同一个IP在固定时间段内访问次数过多,则对该IP进行封杀,禁止该IP继续访问网站。由于IP封杀会封杀运营商提供的IP信息,也就是说,一旦IP封杀,要彻底解决,只能找运营商换IP,这个是非常头疼的。当然,对于这种情况,还有其他策略,网上有很多IP代理工具,可以利用其他代理IP访问网络,不过需要花钱,一般包月15左右,可以在上千IP间随意调换,比较便宜,很多封IP之后采用的策略都是这种。

       策略3:有偿访问。这种策略是引入固定规则,例如:浏览帖子1小时只能浏览10次,下载资源需要积分等策略,这种几乎无解,触非你可以破解网站的运作机制,否则…..

       策略4;来源验证。这个策略在很多访问页面与下载功能中经常使用,在网络请求中,通过页面触发通讯的时候,通讯包中会包含一个Refer字段,该字段自动设置为当前页面地址,很多网站防止爬取的时候会验证该字段信息是否准确,解决的策略其实非常简单,只是需要在需要的时候添加该字段即可。需要注意的是,这种策略在漫画类网站和PHP下载类的网站被广泛使用。

       策略5:多次跳转。这种策略下,网站往往会在通讯中设置一个字段作为跳转字段,在调用该地址后,自动根据跳转字段,跳转其他地址,层数多的情况,可能会涉及多次跳转。遇到这种情况,只能根据实际情况重新定义地址,由于字段名称的不确定性,所以在处理前往往需要在网络中先拦截包查看分析后再处理(不过,就目前遇到的情况,大部分时候该字段名称为Location)。

       策略6:无限循环。这种情况出现在几种网站爬取中,说实话,原因不明,在访问的过程中出现了程序死循环,内存不断上升,无响应结果的情况。推测可能是在js中对某些因素有判断条件,依据条件情况判断是否进入死循环(有可能是页面反复调用的死循环)。

       策略7:不明结构。有些HTML元素是无法解析结构的,例如Canvas,如果一个HTML全部由Canvas绘制,那么我们根本没办法看到页面结构,这种更不用提解析了。这种情况后台爬虫是无法处理的,如果是前端爬虫,可以获取页面js对象,从对象结构考虑解决策略。

       策略8:随机变化。调用同一页面地址,页面内部结构会随机发生变化。这种情况在解析广播剧页面的时候出现过,页面随机发生过4种不同的变化。这种情况最简单的处理策略是穷举,只针对固定的一种结构进行处理,当不是该种结构的时候,便重新调用页面地址。

       上面的8种情况是目前遇到的反爬处理,说实话,很恶心,很多问题都花费了很长时间才解决,这里汇总一下,也算是一点经验了。


  最后,非常感谢耐心读完这篇日志的人。在新的一年里,在新的每一天,请让我们不断挑战,即使无人喝彩,也请为自己加冕!!!!!!

你可能感兴趣的:(2018年我涉猎极深的技术——爬虫技术)