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


    一、算法

    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")
  • 相关阅读:
    奇偶游戏(带权并查集)
    银河英雄传说(边带权并查集)
    程序自动分析(并查集+离散化)
    关于树状数组的小总结(树状数组)
    你能回答这些问题吗 (线段树)
    Phython 3 笔记3 —— 类,库与文件的读写
    Phython 3 笔记2 —— 基础语法
    Phython 3 笔记1 —— 基础容器
    CRJ巨佬gjd算法伪代码
    CRJ巨佬的gjd算法模板
  • 原文地址:https://www.cnblogs.com/pyrene/p/7486268.html
Copyright © 2020-2023  润新知