在学习爬虫之前首先得了解爬虫,爬虫是什么,爬虫就是一种按照一定的规则,自动地抓取万维网信息的程序
或者脚本。
注:下面的内容转自教程中老师的笔记
一、网络爬虫原理
1.1 等同于浏览器访问网页的原理
(1)真人行为驱动
(2)浏览器自动执行人为的动作,即将动作自动程序化。
1.2 网络爬虫就是将浏览器访问网页的过程,再次抽像成程序。
二、网络爬虫分类
2.1 按链接的访问层次的先后来分
宽度优先和深度优先。
宽度优先:即在下载网页链接时,是以一层一层的链接来爬取。
深度优化:以先访每层中第一个未访问节点为先,依次下行迭代循环。
宽度和广度混和方式:nutch就是典行的支持这种方式。depth=3,topN=50
2.2 按爬虫应用来分
漫爬型爬虫:百度、谷歌爬虫,没有目标,以链接为中心去爬,不限制站点的数据,
数据存储直接为单个网页的文本,不进行格式化方面的抽取,一般只做正文、接要、主题词等的抽取,
方便索引和搜索。
垂直型爬虫:内容聚焦,比如说淘宝爬虫、微博爬虫、电商爬虫,而且往往数据直接格式化为结构化数据。
三、网络爬虫的一般作法
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网址的内容的抓包及参数分析,
HttpHeader,指在http请求过程中,协带的各项header信息,如refer,host,encoding,返回的type等。
Get请求,即为在浏览器中看到的网址后边的参数部分,
Post请求,即为数据提交的时候对数据保护和扩大数据提交量的一种数据的提交方式。
更关键的是要保持住客户端与服务器的连接状态。
5.3 Java Se:java基础,包括:高级对象使用,IO,多线程,网络通信,偶尔涉及到GUI编程。
5.4 HttpClient: 是开源的Apache的著名的java net编程第三方包,
可以免去很多Http操作的细节操作,其核心为HttpUrlConnection的封装。
5.5 Jsoup:网页解析,是近来较受欢迎的html解析器,比htmlparser更简单、易用、高效,
尤其是其选择器的应用,太过强大,很有吸引用,使人不得选择jsoup去解析httpclient得到的网页内容。
5.5 database操作:关系型的mysql,sqlserver。非关系型:mongodb,ssdb,hbase,elasticsearch。
六、总结
做爬虫系统和做别的系统很像,系统设计很关键,即层之间的衔接,要尽量高内聚、低耦合。
好的系统几乎不可能一蹴而就,往往需要无数次重构与优化,
这也是为什么像nutch、hadoop、lucene等如此优秀的开源项目的更新如此频繁,
伟大的产生,都源于对细节的孜孜不倦的追求,
希望国内的IT界也能出一些如上所述的优秀开源项目。