爬虫之静态网页爬虫(基础知识)
1.环境搭建-Python Unix 基础环境-Windows
1.pip,并设置pip源 1.直接下载Anaconda,很多比较难以安装的资源都已经包含了
配置pip conf,自动设置源 配置pip源,各个系统默认pip.ini位置不同,需要根据实际情况设置
#mkdir ~/.pip/ 官网:http://anaconda.org/
#vim~/.pip/pip.conf 下子主页:https://www.continuum.io/downloads
[global]
index-url=http://pypi.tuna.tsinghua.edu.cn/simple
也可以每次安装的时候制定source
#pip install -i http://pypi.tuna.tsinghua.edu.cn/simple xlml
2.http协议
物理层:电器连接
数据链路层:交换机(可以为接入交换机的任意两个网络节点提供独享的电信号通路)、
STP(生成树协议,可以应用于在网络中建立树形拓扑,消除网络中的二层环路,并且可以通过一定的方法实现路径冗余)、
帧中继(公共或专用网上的局域网互联等,是一种数据包交换通信网络)
网络层:路由器、IP协议
传输层:TCP、UDP协议
会话层:建立通信连接、网络拨号
表示层:每次连接只处理一个请求
应用层:HTTP、FTP
(无连接:每次连接只处理一个请求)
(无状态:每次连接传输都是独立的)
3.HTTP HEADER(header)
REQUEST(request)部分的HTTP HEADER RESPONSE(response)部分的HTTP HEADER
Accept:text/plain Accept-Patch:text/example;charset=utf-8
Accept-Charset:utf-8 Cache-Control:max-age=3600
Accept-Encoding:gzip,deflate Content-Encoding:gzip
Accept-Language:en-US Last-Modified:Tue,15 Nov 1994 12:46:13 GMT
Connection:keep-alive Content-Language:da
Content-length:348 Content-Length:348
Content-type:application/x-www-form-urlencoded ETag:" 737060cd8c284d8af7ad3082f209582d"
Date:Tue,15Nov,1994 08:15:48 GMT Expires:Thu,01 Dec 1994 16:00:00 GMT
Host:en.wikipedia.org:80 Location:http://www.w3.org/pub/WWW/people.html
User-Agent:Mozilla/5.0(x11;Linux x86-64;rv:12.0)Gecko/20100101 Firefox/21.0 Set-Cookie:UserID=JohnDoe;Max-Age=3600;Version=1
Cookie:$Version=1;Skin=new; Status:200 OK
4.keep-alive
HTTP是一个 请求<->响应 模式的典型范例,即客户端向服务器发送一个请求信息,服务器来响应这个信息。在老的HTTP版本中,每个请求都将被创建一个新的 客户端<->服务器 的连接,在这
个连接上发送请求,然后接受请求。这样的模式有一个很大的优点,比较简单,很容易理解和编程实现;但也有一个很大的缺点,就是效率比较低,因此keep-Alive被踢出来用来解决效率低问题。
keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,keep-Alive功能避免了建立或者重新建立连接。
http/1.1
默认情况下所在HTTP1.1中所有连接都被保持,除非在请求头或响应头中指明要关闭:Connection:Close
5.HTTP请求方法
6.HTTP响应状态码
2xx 成功
3xx 跳转
4xx 客户端错误
500 服务器错误
http响应状态码300
1.300 Multiple Choices 存在多个可用的资源,可处理或丢弃
2.301 Moved Permanetly 重定向(通过各种方法将各种网络请求重新定个方向跳转到其它位置)
3.302 Found 重定向
4.304 Not Modified 请求的资源未更新,丢弃
一些Python库,例如urllib2已结对重定向做了处理,会自动跳转;动态网页处理的时候,也是自动跳转,所以不需要单独处理
http响应状态码400、500 错误处理:
1.400 Bad Request 客户端请求有语法错误,不能被服务器所理解 400 检查请求的参数或路径
2.401 Unauthorized 请求未经授权,这个状态码必须和WWW-Authenticate报头域一起使用 401 如果需要授权的网页。尝试重新登录
3.403 Forbidden 服务器收到请求,但拒绝提供服务 403 如果需要登录的网站,尝试重新登录;IP被封,暂停爬取,并增加爬虫的等待时间,如果拨号网络,尝试重新联网更改IP
4.404 Not Found 请求资源不存在,例如:输入错误的URL 404 直接丢弃
5.500 Internal Server Error 服务器发生不可预测的错误 5xx 服务器错误,直接丢弃,并技数,如果连续不成功,WARNING并停止爬取
6.503 Server Unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常
7.HTML
HTML是超文本标记语言,简单来说是可以认为是一个规范或者协议,浏览器根据HTML的语言规范来解析
在HTML里,与爬虫先关的规范有以下:
这一类tag标记了外链用来做抓取,而tr、p用来进行内容抽取
tag:<a> <tr> <p>
id、class用在css上的,能帮助我们定位元素,作用于tr p类似:
class:class=:“home-price”
Id:id=‘price-frame’
8.DOM树
DOM树最重要的作用是用来做网页数据分析及提取,我们可以充分利用TAG、CLASS、ID来找出某一类或某一个元素并提取内容
9.JavaScript
JavaScript就是运行在前端的编程语言,最典型的用在动态网页的数据、内容加载及呈现上,JavaScript做网络请求的时候最常用的技术为AJAX,专门用来异步请求数据,这些数据是我们抓取的时候要用到的
10.爬虫的抓取对象类型
1.静态网页
2.动态网页
3.web Service
4.Web API数据获取
11.抓取的策略
1.深度优先策略 2.宽度优先策略
1.一般选用哪种策略?
1.重要的网页距离种子站点比较近
2.万维网的深度并没有很深,一个网页有很多路径可以到达
3.宽度优先有利用多爬虫并行合作抓取
4.深度限制与宽度优先相结合
2.如何记录抓取历史?
1.将访问过的URL保存到数据库 #效率太低
2.用HashSet将访问过的URL保存起来。那只需接近O(1)的代价就可以查到一个URL是否被访问过了。#消耗内存
3.URL经过MD5或SHA-1等单向哈希后再保存到HashSet或数据库
4.Bit-Map方法,建立一个BitSet,将每一个URL经过一个哈希函数映射到某一位。
12.MD5函数
MD5签名是一个哈希函数,可以将任意长度的数据转化为一个固定长度的数字(通常是4个整形,128位)。计算机不可能有2的128那么大的内存,因此实际的哈希表都会是URL,
MD5再%n(即取模)。现实世界的URL组合必然超越哈希表的槽位数,因此碰撞是一定存在的,一般的HASH函数,例如Java的HashTable是一个HASH表再跟上一个链表,链表里
存的是碰撞结果
BITMAP记录方式
将URL的MD5值再次哈希,用一个或多个BIT位来记录一个URL
1.确定空间大小。例如:Facebook 1.5GB
2.按倍增加槽位。例如:16GB
3.HASH算法映射Python:mmh3 bitarray
优势:对存储进行了进一步压缩,在MD5的基础上,可以从128位最多压缩到1位,一般情况,如果用4bit或者8bit表示一个url,也能压缩32或者16倍
缺陷:碰撞概率增加
13.提高效率
1.评估网站的网页数量
2.选择合适的HASH算法和空间阈值,降低碰撞几率
3.选择合适的存储结构和算法
14.Bloom Filter
Bloom Filter使用了多个哈希函数,而不是一个。创建一个m位BitSet,先将所有的位初始化为0,然后选择k个不同的哈希函数。第i个哈希函数对字符串str哈希的结果
记录为h(i,str),且h(i,str)的范围是0到m-1。只能插入,不能删除。
15.如何有效的记录抓取历史?
多数情况下不需要压缩,尤其网页数量少的情况
网页数量大的情况下,使用Bloom Filter压缩
重点是计算碰撞概率,并根据碰撞概率来确定存储空间的阈值
分布式系统,将散列映射到多台主机的内存
16.网站结构分析
Robots.txt
网站对爬虫的限制
利用sitemap来分析网站结构和估算目标网页的规模
17.有效抓取特定内容
利用sitemap里的信息,直接对目标网页.html进行抓取
对网站目录结构进行分析
大多数网站都会存在明确的top-down的分类的目录结构,可以进入特定的目录进行抓取