三、爬虫算法策略、去重策略、编码问题
一、算法
1、网站的树结构 基础点击下面
2、深度优先算法和实现
深度优先输出(递归实现)
def depth_tree(tree_node): if tree_node is not None: print(tree_node._data) if tree_node._left is not None: return depth_tree(tree_node._left) if tree_node._right is not None: return depth_tree(tree_node._right)
递归算法有危险,所以要设置跳出递归规则
3、广度优先算法和实现
广度优先输出(队列实现)
def level_queue(root): #传递二叉树的顶点 "利用队列实现树的广度优先遍历" if root is 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)
二、url去重策略
1M=1024kb 1k=1024byte 1byte=8bit 爬虫去重策略 1、将访问过的url保存到数据库中 不推荐 2、将访问过的url保存到set中,只需要o(1)的代价就可以查询url 不推荐 3、scrapy类似的方式,将url经过md5等方法哈希后保存到set中(内存中) 4、用bitmap方法,将访问过的url通过hash函数映射到某一位bit上 缺点:冲突非常高 不推荐 5、bloomfilter方法对bitmap进行改进,多重hash函数降低冲突 是对bitmap进行改进的办法 url去重方式第五条是最优秀的
三、关于编码问题
字符串编码
1、计算机只能处理数字,文本转换为数字才能处理,计算机中8个bit作为一个字节,所以一个字节能表示最大的数字是255
2、计算机是美国人发明的,所以一个字节可以表示所有的字符,所以ASCII(一个字节)编码就成为美国人的标准编码
3、但是ASCII处理中文明显是不够的,中文不止255个汉字,所以中国定制了GB2312编码,用两个字节表示一个汉字。GB2312还把ASCII包含进去了。
同理各个国家都发明了展示一套字节的编码,标准就越来越多。
4、于是unicode出现了,将所有语言统一到一套编码里面
5、看一下ASCII和unicode编码
1)字母用ASCII编码十进制65,二进制0100 0001
6、乱码问题解决了,但是如果内容全是英文,unicode编码比ASCII需要一倍的存储空间,同时如果传输需要多一倍的传输
7、所以出现了可变长的编码"utf-8",把英文变长一个字节,汉字3个字节,特别生僻的编程4-6个字节,如果传输大量的英文,utf8作用就很明显
所以:以什么方式保存,就以什么方式读取
注意点一、
在python2中,
s="我用python"
在windows下默认gbk
s.decode("gbk").encode("utf-8") 需要转为unicode,然后编码
在linux下utf8
s.decode("utf8"),decode("utf8")
注意点二、
s=u"啊啊" python2中的unicode
s.encode("gbk").decode("gbk")