• 第三章:爬虫基础知识回顾


    第一节:技术选型,爬虫能做什么
    技术选型
    scrapy vs requests + beautifulsoup
    1. requests + beautifulsoup都是库,scrapy是框架
    2.scrapy框架中可以加入requests + beautifulsoup
    3.scrapy基于twisted,性能是最大的优势
    4.scrapy方便扩展,提供了很多内置的功能
    5.scrapy内置的css和xpath selector非常方便,beautifulsoup最大的缺点就是慢

    网页分类
    常见类型的服务
    1.静态网页(网页是不会变的)
    2.动态网页
    3.webservice(restapi)

    爬虫能做什么
    1.搜索引擎---百度、google、垂直领域搜索引擎
    2.推荐引擎---今日头条 (根据我们浏览的习惯)
    3.机器学习的数据样本
    4.数据分析(如金融数据分析)、舆情分析等

    第二-四节:正则表达式

    正则表达式介绍
    1.为什么必须会正则表达式
    2.正则表达式的简单应用及python示例
    目录
    2.1 特殊字符
    ^ 开头字符
    $ 结尾字符
    * /+ 1次或多次
    ? 非贪婪匹配
    {2} 限定出现两次
    {2,} 至少出现两次
    {2,5} 在2-5次之间
    | 表示或者的意思
    [ab]c 表示匹配ac或者bc 在中括号中没有特殊含义了
    \s 匹配空格
    \S 匹配非空格
    \w [0-9a-zA-Z_]
    \W 非w
    [\u4E00-\u9FA5] 匹配汉字
    \d 数字
    \D 非数字

    示例:

    ```

    line = "xiaolinn123"
    # regex_str = "^x.*"
    #regex_str = ".*3$"
    #regex_str = ".*(i.*n).*" #如果不在.*中加上问好,他会匹配到最后一个i的前一个
    #regex_str = ".*?(i.*n).*" #加上问号就只匹配到第一个i的前一个
    #regex_str = ".*?(i.*?n).*" #非贪婪匹配
    #regex_str = ".*(i.{2,5}n).*"
    #regex_str = "(xiaolin|xiaolinn)123"
    #regex_str = "((xiaolin|xiaolinn)123)"
    #regex_str = "([abcdx]iaolinn123)"
    # line1 = "小林"
    #regex_str = "([\u4E00-\u9FA5]+)"
    # line2 = "study in 北京大学"
    # regex_str = ".*?([\u4E00-\u9FA5]+)大学"
    regex_str = ".*?(\d+)年"
    line3 = "出生于2001年"
    match_obj =re.match(regex_str,line3)
    if match_obj:
    print(match_obj.group(1))
    # if re.match(regex_str,line):
    # print("yes")

    #line = "XXX出生于2001年6月1日"
    #line = "XXX出生于2001/6/1"
    #line = "XXX出生于2001-6-1"
    #line = "XXX出生于2001-06-01"
    #line = "XXX出生于2001-06"
    regex_str = ".*出生于(\d{4}[年/-]\d{1,2}([月/-]\d{1,2}|[月/-]$|$))"

    match_obj =re.match(regex_str,line)
    if match_obj:
    print(match_obj.group(1))

    ```

    第五节:深度优先和广度优先
    1.网站的树结构
    url结构图
    www.jobbole.com
    然后再分类,下面的文章,等等
    可以分为一级域名,二级域名....(有可能可以相互访问)

    2.深度优先算法和实现
    先从一级域名到二级域名到三级域名,然后走完了
    再退回二级域名,再重新到另外一个三级域名

    3.广度优先算法和实现
    先遍历一级域名
    然后再遍历二级域名
    接着再遍历三级域名....

    第六节:爬虫去重策略
    1.将访问过的url保存到数据库中
    2.将访问过的url保存到set中,只需要o(1)的代价就可以查询url
    100000000*2byte*50个字符/1024/1024/1024 = 9G
    3.url经过md5等方法哈希后保存到set中
    4.用bitmap方法,将访问过的url通过hash函数映射到某一位
    5.bloomfilter方法对bitmap进行改进,多重hash函数降低冲突

    第七节:彻底搞清楚unicode和utf8编码
    字符串编码
    1.计算机只能处理数字,文本转换为数字才能处理。计算机中8个 bit作为1个字节,所以一个字节能表示的最大的数字是255
    2.计算机是美国人发明的,所以一个字节可以表示所有字符了,所以ASCII编码就成为美国人的标准编码
    3.但是ASCII处理中文明显是不够的,中文不止255个汉字,所以中国制定了GB2312编码,用两个字节表示一个汉字。GB2312还把ASCII包含进去了,同理,日文,韩文等等上百个国家为了解决这个问题都发展了一套字节的编码,标准就越来越多,如果出现多种语言混合显示就一定会出现乱码
    4.越是unicode出现了,将所有语言统一到一套编码里
    5.看一下ASCII和unicode编码:
    1):字母A用ASCII编码十进制是65
    2):汉字“中”已近超出了ASCII编码的范围,用unicode编码是20013,二进制是01001110 00101101
    3):A用unicode编码只需要前面补0二进制是00000000 0100 0001
    6.乱码问题解决了,但是如果内容全是英文,unicode编码比ASCII需要多一倍的存储空间,同时如果传输需要多一倍的传输
    7.所以出现了可变长的编码 utf-8,把英文变长一个字节,汉字3个字节,特别生僻的变成4-6字节,如果传输大量的英文,utf8作用就很明显了
    encode("utf-8")

       
       
  • 相关阅读:
    教你一招Linux下文本比对方法
    Linux下find与exec的联手干大事
    Linux下Shell日期的格式,你知道几种?
    Linux下Python3.6的安装及避坑指南
    多线程中使用CompletableFuture
    ElasticSearch7.6.2中语法使用(更新中)
    ElasticSearch7.6.2使用_update_by_query语法
    ElasticSearch7.6.2使用_delete_by_query产生版本冲突问题
    filebeat7.6.2进程运行一段时间后自动退出问题解决
    把本地项目提交到gitLab
  • 原文地址:https://www.cnblogs.com/linyujin/p/9795112.html
Copyright © 2020-2023  润新知