Java 爬虫项目实战之爬虫简介

Java 爬虫项目实战之爬虫简介

0. 前言

今年三四月份学习Hbase,了解到openTSDB的底层存储使用到了Hbase,于是乎,学习openTSDB,在阅读openTSDB源码【其源码使用java编写】的过程中, 发现里面全是I/O,多线程,httpclient等。 而我对此则是一无所知,看了一些书也不甚其解,其中包括高洪岩老师所著的两本书:《Java多线程编程核心技术》《NIO与Socket编程技术指南》以及李林峰老师的《Netty权威指南》。讲了很多遍的I/O,我也没搞懂这些到底是个什么玩意儿。但是我知道这些都少不了TCP/IP协议,于是又接着温故大学的TCP/IP,TCP/IP是一个协议族,而应用程序员与TCP,IP协议直接打交道的几乎其实并不多,最为直接的应该是HTTP协议了,只要是个程序员,肯定知道HTTP,虽然有很多人并不知道其中的细节。所以,接着我又温习了一下HTTP协议,才发现当初学的知识是多么不扎实,连很多基本的道理都没理解。折腾了这么几个月,才慢慢的梳理出了自己的学习历程,慢慢地也有了一些感慨。
无论是做java程序员,还是做大数据开发工程师,Java才是真正的企业霸主,笔者从事大数据开发的,编程的这个玩意儿肯定是少不了Java语言。光说不练假把式,就想着进行自己的代码练习,便从大数据组件最为显著的特征——“分布式”入手,而这个分布式必须涉及到底层的网络通信,于是我选择从Java 爬虫开始着手练习。终于在近两个周末,搞知乎爬虫。小有收获,但是也挖坑不少,以此标记。

1. 什么是爬虫

爬虫是什么? 没有接触过爬虫的人一定会这么问。其实爬虫就是获取某些网页中的内容。而实现爬虫的手法有很多,包括流行的python,以及java等。因为考虑到java企业级的优势,于是笔者选择使用java进行爬虫开发。
程序爬虫原理的等同于浏览器访问网页的原理

  • (1)真人行为驱动
  • (2)浏览器自动执行人为的动作,即将动作自动程序化。
    而网络爬虫就是将浏览器访问网页的过程,再次抽像成程序。

2. 网络爬虫分类

2.1 获取方式分类

学习过树的人都知道,树的遍历方式有广度优先和深度优先,同样,网络爬虫也是如此:可以按链接的访问层次的先后来分成 广度优先和深度优先

  • 广度优先:即在下载网页链接时,是以一层一层的链接来爬取。
  • 深度优化:以先访每层中第一个未访问节点为先,依次下行迭代循环。
2.2 爬虫应用分类
  • 漫爬型爬虫:百度、谷歌爬虫,没有目标,以链接为中心去爬,不限制站点的数据,数据存储直接为单个网页的文本,不进行格式化方面的抽取,一般只做正文、接要、主题词等的抽取,方便索引和搜索。
  • 垂直型爬虫:内容聚焦,比如说淘宝爬虫、微博爬虫、电商爬虫,而且往往数据直接格式化为结构化数据。

3. 网络爬虫的一般方法

3.1 基于Socket通信编写爬虫

最底层的实现形式,也是执行最高效,但开发效率较低的一种方式。socket并不是什么通信协义,只是为了方便tcp/ip层的上层访问tip/ip层而做一层封装。相当于http方问socket,而后socket转化为tcp/ip包。

3.2 基于HttpURLConnection类编写爬虫

Java se的net包中的核心类,主要用于http的相关操作。

3.3 基于apache的HttpClient包编写爬虫

核心也是基于java se的net包扩展而来,专为java的网络通信编程而开发的第三方包,也是apahce。

3.4 基于phantomjs之类的无头(无界面)浏览器
  • (1)它是浏览器核心,并非浏览器。换言之,它是没有界面UI的浏览器。无头,即无界面。
  • (2)它提供的js api,故它可以方便直接的被各种程序语言调用。
3.5 基于Selenium或是WebDriver之类的有头(有界面)浏览器
  • (1)它能直接操作本地的浏览器,与真人操作不同的是,它的操作都是程序触发,省去了人为操作的步骤。

四、系统设计

  • 4.1 模块划分:提交任务的UI接口层、任务调度层、网络爬取层、数据解析层、数据持久化层
  • 4.2 重难点 : 乱码解决、多线程设计、爬取的各参数的灵活配置、反爬代理

五、具体技术点

  • 5.1 http协议相关+java se+httpclient+jsoup(httpparser)+database

  • 5.2 http协议相关,指在爬虫过程中对最为主流的http网址的内容的抓包及参数分析,最为主要的参数部分要对http协议相对了解些,包括Url、HttpHeader、Get、Post、Cookie等4项。Url即为共认的Url网址。HttpHeader,指在http请求过程中,协带的各项header信息,如refer,host,encoding,返回的type等。 Get请求,即为在浏览器中看到的网址后边的参数部分,Post请求,即为数据提交的时候对数据保护和扩大数据提交量的一种数据的提交方式。Cookie,即为小甜饼,是服务器端向客户端写的信息,往往是为了提高客户端的使用体验而添加的,更关键的是要保持住客户端与服务器的连接状态。

  • 5.3 Java Se:java基础,包括:高级对象使用,IO,多线程,网络通信,偶尔涉及到GUI编程。

  • 5.4 HttpClient: 是开源的Apache的著名的java net编程第三方包,其实是对Java Net包的封状,目前已为4.3版本,更为精简易用,可以免去很多Http操作的细节操作,其核心为HttpUrlConnection的封装。

  • 5.5 Jsoup:网页解析,是近来较受欢迎的html解析器,比htmlparser更简单、易用、高效,故目前应用jsoup的人员急速上升,且与老牌的htmlparser对比优势明显,尤其是其选择器的应用,太过强大,很有吸引用,使人不得选择jsoup去解析httpclient得到的网页内容。

  • 5.5 database操作:关系型的mysql,sqlserver。非关系型:mongodb,ssdb,hbase,elasticsearch。

六、总结

做爬虫系统和做别的系统很像,系统设计很关键,即层之间的衔接,要尽量高内聚、低耦合。 好的系统几乎不可能一蹴而就,往往需要无数次重构与优化,这也是为什么像nutch、hadoop、lucene等如此优秀的开源项目的更新如此频繁, 不能说不好,只能说能做的更好,所以无数的精英都乐此不疲的去完善优秀的项目,伟大的产生,都源于对细节的孜孜不倦的追求, 希望国内的IT界也能出一些如上所述的优秀开源项目。
另外,网络爬虫很有前途,知识面要广,待遇相当不错。

七、参考资料

  • 引自某位老师上课的笔记

你可能感兴趣的:(Java)