一、爬虫的定义
爬虫是一个模拟人类请求网站行为的程序。可以自动请求网页、并将数据抓取下来,然后使用一定的规则提取有价值的数据。
二、我与爬虫
我与爬虫最早的接触是通过Python编写相关的爬虫,爬取一些小说网站,而后我的博客系统最早千万级数据主要来源于数据爬虫和一些内容网站API等,再后来因业务需要再度使用爬虫进行数据抓取。这是我与爬虫直接接触的三个场景。
三、爬虫的本质是什么
有博友认为:爬虫的本质是网络请求和数据处理。我认为很对,网络请求基于HTTP协议,数据处理基于DOM解析(在基于DOM解析前提下,直接获取符合当前需要的元素)。
四、爬虫的策略有哪些
1.深度优先遍历策略
深度优先遍历策略是指网络爬虫会从起始页开始,一个链接一个链接跟踪下去,处理完这条线路的链接之后,在再转入下一个起始页,继续跟踪链接。
2.广度优先遍历策略
广度优先策略是按照树的层次进行搜索,如果此层没有搜索完成,不会进入下一层搜索。即首先完成一个层次的搜索,其次在进行下一层次,也称之为分层处理。
3.部分PageRank的策略
PageRank算法的思想:对于已经下载的网页,连同待抓取URL队列的URL,形成网页集合,计算每个页面的PageRank值(PageRank算法参考:PageRank算法 - 从原理到实现),计算完之后,将待抓取队列中的URL按照网页级别的值的大小排列,并按照顺序依次抓取网址页面。
4.OPIC策略策略
基本思路:在算法开始前,给所有页面一个相同的初始现金(现金)当下载了某个页面P之后,将P的现金分摊给所有从P中分析出的链接,并且将P的现金清空。对于待抓取URL队列中的所有页面按照现金数进行排序。
与PageRank的的的的区别在于:PageRank的的的每次需要迭代计算,而OPIC策略不需要迭代过程所以计算速度远远快与PageRank的的的,适合实时计算使用。
5.大站优先策略
以网站为单位来选题网页重要性,对于待爬取URL队列中的网页,根据所属网站归类,如果哪个网站等待下载的页面最多,则优先下载这些链接,其本质思想倾向于优先下载大型网站。因为大型网站往往包含更多的页面。鉴于大型网站往往是著名企业的内容,其网页质量一般较高,所以这个思路虽然简单,但是有一定依据。实验表明这个算法效果也要略优先于宽度优先遍历策略。
上面这五个策略在实际中,我或多或少都接触过,但那个时候我却不知道这些。
五、基于Java,可供选择的爬虫框架有哪些
以下七个可供选择:
- JSOUP;
- WebMagic;
- Crawler4j;
- Gecco;
- Spiderman;
- Heritrix;
- WebController。
就我个人看,我比较倾向于JSOUP,因为它更接近于原生,原生的东西不会掺杂太多七七八八的,除JSOUP外的六个还是太重量级的,而且有部分早已停止更新,难以适应如今的需求。
之前适应WebMagic爬取某些网站的数据,直接被挡回来了,原因是WebMagic代码里的问题,具体详情可参考这篇文章:java使用jsoup时绕过https证书验证
六、爬虫需要遵守法律,程序员要学会保护好自己
2019年05月28日国家网信办发布的《数据安全管理办法(征求意见稿)》中,拟通过行政法规的形式,对爬虫的使用进行限制:
- 第十六条 网络运营者采取自动化手段访问收集网站数据,不得妨碍网站正常运行;此类行为严重影响网站运行,如自动化访问收集流量超过网站日均流量三分之一,网站要求停止自动化访问收集时,应当停止。
具体可阅读这篇文章:
爬虫的法律红线
总而言之,数据爬虫不要影响网站运营者的正常运营,所爬取的数据应该是该网站公开的(而非绕过鉴权抓取的),所爬取的数据未经许可不得用于商业用途。
七、反爬虫的策略有哪些
1.基于IP反爬虫(IP限制频次)
2.通过Header反爬虫(User-Agent + Referer检测)
3.基于用户行为反爬虫
4.动态页面反爬虫
6.验证码限制;
7.js加密(通过js加密请求参数、解密加密的数据来反爬);
8.CSS偏移反爬虫(CSS偏移反爬虫指的是利用CSS样式将乱序的文字,排版为人类正常阅读的顺序)。
这些反爬策略在各大网站上都有体现,如豆瓣、美团、Boss直聘、淘宝、蔚蓝地图、拉勾等。
八、总结
《孙子兵法》有云,故兵无常势力,水无常形。爬虫的技术不断演变,反爬虫策略也应与时俱进。不要妄想着一套不变的东西能够永久的适应当下的发展(近来在做架构相关的设计,深有体会)。