三、爬虫算法策略、去重策略、编码问题

一、算法

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")

 

posted @ 2017-09-06 18:23  pi-pi-miao-miao  阅读(237)  评论(0编辑  收藏  举报