爬虫技术基础
- HTTP/HTTPS(7层):应用层,浏览器
- SSL:加密层,传输层、应用层之间
- TCP/IP(4层):传输层
- 数据在传输过程中是加密的,浏览器显示的是解密后的数据,对爬虫没有影响
- 中间人攻击:在传输过程中对数据包进行解析,抓包抓的是IP包,数据是加密的

HTTP
- 应用层协议
- 无连接:每次连接只处理一个请求(手机给电脑传数据,传完就拔线;有连接,socket通信,三次握手)
- 无状态:每次连接、传输都是独立的
- HEADER(头信息)、body(数据)
- Request(Client->Server)、Response(Server->Client)
- Request 的 HTTP Header
- Request 方法
- GET:向服务器请求数据,只有header,没有body,安全(不修改服务器数据),抓网页用
- POST:向服务器发送内容,有header和body,不安全(可能修改服务器数据),抓API用
- Idempotent:幂等,多次操作结果不变


- Response的Header
- Location:跳转到地址
- Set-Cookie:服务端给客户端的Cookie
- Status:状态码,表示请求结果
- 2XX:成功
- 3XX:跳转(302:重定向,urllib2库会对重定向做处理,实现自动跳转)
- 4XX:客户端错误(401:未授权,403:拒绝提供服务,404:资源不存在)
- 5XX:服务器错误(500:服务器未知错误,503:服务器不能处理请求)
- 错误处理
- 400:Bad Request,检查请求的参数或路径
- 401:Unauthorized,需授权的网页的Cookie到期,尝试重新登录
- 403:Forbidden,需要登录的网站,尝试重新登录;IP被封,暂定爬取,增加爬虫等待时间
- 404:Not Found,直接丢弃
- 5XX:直接丢弃,并计数,如连续不成功,停止爬取
CSS
DOM树
JavaScript
爬取原理
- 网页间通过<a>构成网页树
- 宽度优先:把孩子节点放入队列
- 深度优先


- 选取原则
- 重要网页距种子站点较近
- 万维网的深度并没有很深(<=17层),一个网页有很多路径可以到达
- 宽度优先有利于多爬虫合作爬取
- 深度限制与宽度优先结合(深度到达关注网页,再宽度抓取)
- 类比:学的深还是学的专?创业办某领域小公司还是平台型公司
- 深度优先注意限制层数,否则不会停
如何记录抓取历史
- 记录已抓取网页,避免重复访问
- 如已经爬取了10w网页,又来了1个新网页,如何判断它是否在保存的10w个网页当中[爬虫陷阱]
- 保存在数据库中,效率较低(几十万以下可用)
- 用HashSet将访问的URL保存,只需O(1)代价就可查到是否访问过,消耗内存(URL可能很长)
- URL经MD5(都是16字节)或SHA-1等单向哈希后再保存到HashSet或数据库
- Java的HashTable是一个Hash表再跟一个链表,链表中保存碰撞结果
- Bit-Map方法,建立一个BitSet,将每个URL经哈希函数映射到某一BIT
- Bloom Filter:使用了多个哈希函数映射URL,减少碰撞,提高空间利用率,只能插入不能删除
- pip install murmurhash3 bitarray
- pip install pybloomfilter

如何提高效率
- 评估网站数量
- 选择合适HASH算法和空间阈值,降低碰撞几率
- 选择合适的存储结构和算法


总结
- 多数情况不需要压缩,尤其网页数量少的情况
- 网页数量大的情况,使用Bloom Filter压缩
- 重点是验算碰撞概率,并根据碰撞概率来确定存储空间的阈值
- 分布式系统,将散列映射到多台主机的内存
[Python] 爬虫系统与数据处理实战(小象学堂)Part.1
原文:https://www.cnblogs.com/cxc1357/p/12496896.html