网络爬虫原理(概要了解)

一、网络爬虫原理
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网址的内容的抓包及参数分析,最为主要的参数部分要对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。非关系型 redis,mongodb。

一、网络抓包工具介绍和选择
1.1 按面向的对象分类
浏览器抓包工具和全局抓包工具

浏览器抓包工具:
IE Developer(自带)
Chrome Developer(自带)
FireFox Developer(自带)
FireFox Firebug:只针对firefox
HttpWatch: 只针对IE浏览器
FireFox HttpFox:只针对firefox自带抓包,简单易用,但不利于复杂应用。
全局抓包工具:
Http Analyzer: 针对http、https协议的本机与网络通讯时的抓包工具
WireShark: 什么都行,主要是tcp、ip包层次,它是http协义的下一层,所以依然可以捕捉到http请求的所有数据。
有windows版的,也有linux版的,应用极为常见。但主要应用网络实时流之tcp、ip包分析上,而不怎么用其做爬虫的抓包工具。
Fiddler:c#实现的爬虫工具,也很强大,可以修改网络通讯中的包,方便调试。
Winpcap: 与wireshark类似,但只能应用于windows系统。

1.2 选择方法
1、功能稳定和齐全(根据它就排除掉了浏览器自带抓包工具)
2、熟悉习惯
跟个人相关,我一直习惯用httpwatch,主要是能满足当前实际应用的需求。
在实际开发当中,一般选择浏览器自带+第三方抓包,即我用IE Developer+HttpWatch8.5版本配合来搞定问题。
二、浏览器抓包工具经典应用
1、web项目的开发测试,(比较简单,不用第三方抓包工具亦可)
2、非爬虫性质的抓包分析 (比较简单,不用第三方抓包工具亦可)
3、爬虫的抓包分析 (情况相对比较复杂,一般要采用浏览器自带+第三方抓包)

三、 抓包demo示例
1、主要以IE Developer+HttpWatch为工具,
以简单站点:新浪新闻为例,http://news.sina.com.cn/
简单的特点:内容基本在直接请求的URL中,且没有特定的权限验证。而且没有特别的js等内容动态解析。
以复杂站点:新浪微博为例,http://www.weibo.com/
复杂的特点:内容的构成往往源于多个请求,且数据的组织方式多样,偶尔涉及到ajax请求和js的数据动态填充。
2、http协议小介
(1)http协议包括的method,主要为get,post,put,delete。
get代表是查,post代表是更新,put代表上传,delete代表删除。 后续在落实时,人们把这几件事都归在了get、post当中,很少有相应去专门符合协议去发送method request。
(2)http协议status code
1** : 代表的是服务器已收到信息,但还没处理完,将继续。
最原始的ajax请求中,是以判断status code来决定是否该次的ajax异步请求完成,或状态。
2** : 返回状态,一般是代表成功终止,即正常的一次请求完成。
等于200,代表ok
3** : 请求的转移。
301:永久转移,会在响应头中跟随location这个key,来标志下次该跳转的目标URL地址。
302:临时转移,。。。
304:无更新,从缓存中取数据。
4** : 客户端错误。
400客户端格式错误。401无权限。403禁止访问。404:file not found,文件找不到。
5** :服务器错误。
500:服务器端处理当中出现异常。
(3)http header参数
accept: 客户端可接受的数据类型。
text/html,即html的文本
application/xhtml+xml,即xhtml,像jsp,asp等都属于这种
accept-encoding: 客户端要求服务器返回的数据编码格式,
一般设为gzip,deflate的为多,好gzip压缩,其算法为deflate。肯定是无损压缩。
accept-language:要求的自然语言,注意语言和编码的概念不同。
connection :代表client与server的链接性,是keep-alive或是none
cookie :client与server之间的沟通状态信息。
host: client发过去请求后,由哪个地址来解析该请求。
If-Modified-Since :代表该网页自哪个时间开始,没有再改变过。
user-agent: 即ua,客户端把os、browser type等封装成ua发送给服务器端。
//上边为http header send部分,下边为http header received部分
age: 代表该页是从缓存中取出后的多长时间。
cache_control:服务器要求客户端是否缓存该网页。
Content-Encoding:server给client的数据的编码格式,往往为gzip。
Content-Length: server 给client端传送数据的总字节数,经常用于判断是否接收结束。
Content-Type:返回数据的类型,一般为text/html,即纯文本类型
(4)http cookie参数
cookie包括两部分,一部分sent,一部分是receive。
要严格区分开,在爬虫开发的过程中,构建cookies时尤为重要。
cookie中往往包括N多的key,要尽量找出其关键的key。

(5) ETAG和if-modified-since
都跟过期时间有关。很多网址是不更新if-modified-since,而是通过一个hash值或是时间值来给ETAG,标志该资源是否有过更新,从而使资源的更新与时间无关,而与这个key有关。

(6) get和post的区别
参数传递方式不一样:get较简单,post是不在地址栏中显示的,而且相应的生成对应掩码的方式,较安全。
参数的传递渠道不同,get走的是http协议头,往往被浏览器、os限制了长度,往往小于2KB。
post走的是http消息体,长度不限制。

四、总结
抓包分析是爬虫研发的最基础和关键的步骤。
要足够细心和耐心,开发时应采取循序渐进的步骤,并在每个关键环节留有日志输出,方便爬虫问题的问题跟踪与追根溯原。

你可能感兴趣的:(爬虫,网络爬虫原理)