一.基础知识
1.网页分类
- 静态网页
- 动态网页
- webservice(restapi)
2.爬虫能做什么
- 搜索引擎——百度、google、垂直领域搜索引擎
- 推荐引擎——今日头条
- 机器学习的数据样本
- 数据分析(如金融数据分析)、舆情分析等
二.正则表达式
1.正则表达式
-
特殊字符
^$*?+{2}{2,}{2,5}| [][^][a-z]. \s\S\w\W [\u4E00-\u9FA5]()\d #\s为空格 \S表示不为空格 #\w为[a-zA-Z0-9_] \W表示不为其中内容 #[\u4E00-\u9FA5] 表示中文 #\d 表示数字
-
默认是贪婪模式的匹配(从左到右最大的匹配,也就相当于从右到左的最小匹配),使用在
.*
之后加?
指定非贪婪模式
2.深度优先和广度优先
-
网站的树结构【需要考虑是否会循环遍历同一个url】
-
深度优先算法和实现(递归实现)—递归的栈太深会导致栈溢出
def depth_tree(tree_node): if tree_node is not None: print (tree_node.data) if tree_data._left is not None: return depth_tree(tree_node._left) if tree_data._right is not None: return depth_tree(tree_node._right)
-
广度优先算法和实现(队列实现)
def level_queue(root): """利用队列实现树的广度优先遍历""" if root is not None: return my_queue = [] node = root my_queue.append(node) while my_queue: node = my_queue.pop(0) print(node.elem)#打印节点的值 if node.lchild is not None: my_queue.append(node.lchild) if node.rchild is not None: my_queue.append(node.rchild)
3.爬虫去重策略
- 方式一:将访问过的url保存到数据库中
- 方式二:将访问过的url保存到set中,只需要o(1)的代价就可以查询url,但是内存占用会越来越大
- 方式二的优化:url经过md5等方法哈希后保存到set中(使用md5可以将一个url压缩到16个byte)
- 方法二的优化:用bitmap方法,将访问过的url通过hash函数映射到某一位(不太适用)
- 方法二的再优化:bloomfilter方法对bitmap进行改进,多重hash函数降低冲突
4.字符串编码
- 计算机只能处理数字,文本转换为数字才能处理。计算机中8个bit作为一个字节,所以一个字节能表示最大的数字就是255
- 计算机是美国人发明的,所以一个字节可以表示所有字符了,所以Ascii(一个字节)编码就称为美国人的标准编码
- 但是Ascii处理中文明显是不够的,中文不止255个汉字,所以中国制定了GB2312编码,用两个字节表示一个汉字。GB2312还把Ascii包含进去了。同理,日文,韩文等等上百个国家为了解决这个问题就都发展了一套字节的编码,标准就越来越多,如果多种语言混合显示就一定会出现乱码
- unicode将所有语言统一到一套编码中
- 乱码问题解决了,如果内容全是英文,unicode编码比Ascii需要多一倍的存储空间,同时如果传输需要多一倍的传输
- 所以出现了可变长的编码utf-8,把英文变长一个字节,汉字3个字节。特别生僻的变成4-6字节,如果传输大量的英文,utf-8作用就很明显了
- 读取文件的时候,将文件中的utf8编码转换为unicode编码写入内存;当保存文件时,将文件中的unicode编码转化为utf-8编码存储到文件中
- 在编码中只能将unicode的字符集进行编码,python3默认会将字符串读取成unicode,所以直接调用
.encode("编码格式")
不会报错;而在python2中会根据自身系统的默认编码决定读取的编码格式,需要先进性decode在进行encode