zoukankan      html  css  js  c++  java
  • Python笔记⑤爬虫

    爬虫的前奏

    # 爬虫前奏

    # 明确目的

    # 找到数据对应的网页

    # 分析网页的结果找到数据所在的标签位置

    # 模拟HTTP请求,向服务器发送这个请求,获取到服务器返回给我们的HTML

    # 用正则表达式提取我们要的数据(名字,人气)

    http://longzhu.com/channels/lol?from=left

    VSCode中调试代码:

    用面向对象来构建爬虫

    #断点调试

    F5 启动

    F10 单步运行

    F5 跳断点

    F11 进入某一个函数或对象的内部

    鼠标悬停在变量上方后会出现变量的详细内容

    爬虫分析流程:寻找到一个标签或者标识符,因为我们需要一个标签帮助“定位”抓取的信息

    两个原则:

    1.寻找哪个作为定位标识符,尽量选择具有唯一标识性的标签

    2.尽量寻找接近于提取数据的标签。从需要查找的数据附近寻找

    数据提取层级分析及原则

    数据提取层级分析

    为了分析 名字和人气 所以将它们认为一起的 然后找上层的闭合标签 即找父级标签不能用兄弟标签如video-title

    圈红部分

    #用正则表达式取得信息

    匹配所有字符的方式:

    wW; sS;

    [sS]*?

    []表示或关系,*表示匹配0次到无限多次,

    ?表示非贪婪模式。表示只匹配到下个</div>就结束,不然一次就会匹配多个livecard-modal

    圆括号表示组的概念,去除圆括号外部内容

    通过正则表达式进行提取根节点下的名字

    1,定义字典函数 anchor = {key:value},在这里 {'name':name,'number':number}

    2,多个anchor需要存入一个列表中,因此定义多个字典的列表 anchors,即anchor单词的复数.

    3,在anchors中插入anchor,即 anchors.append(anchor)

    4,需要精简分析人数和名字,需要定义此类函数,需用refine函数表示

    5,在入口go函数中增加self.__refine(param),这里的param则是anchors,

       因此为 self.__refine(anchors)

    数据精炼

    (这个练习中)数据精炼目的

    1.把换行符和空格去掉

    2.把列表形式转换成单一字符串

    def __refine(self,anchors):

      l=lambda anchor:{

        'name':anchor['name'][0].strip(),

        'number':anchor['number][0]

        }

      return map(l, anchors)

    #列表中每个字典元素的内部的name和number属性又都是一个列表,取出元素,列表就转换成了字符串

    #内置函数strip可以去除字符串前后不需要的部分,默认值时空格和换行符(见【内置函数】)

    案例总结

    go是入口方法,里面展现了数据处理的流程步骤:

    1. 提取内容(fetch)

    2. 分析内容(analysis)

    3. 精炼内容(refine)

    4. 业务处理(如sort)

    5. 展示方法show)

    这段代码直白,平铺直叙,可读性尚可

    而最大的问题在于抵御业务变化的能力太差

    如果要换一个不同的视频网站抓取,

    代码就基本全部要改

    如果要写中大型爬虫,

    老师推荐BeautifulSoup库和Scrapy爬虫框架

    对于框架,能不用就不用,因为研究框架要花费大量时间,

    如果只是小项目,没有必要

    应该从解决问题的角度出发

    对于爬虫,还有反爬虫,和反反爬虫

    而且爬虫只是手段,怎么处理分析爬到的数据同样重要

    还有一个问题是ip被封,为了减少这种情况,把抓取的频率设置的小一点。

    为了防止被封ip号 可以通过代理ip库来解决

    注释的方法

    类的注释和方法注释和模块注释是一样的

    单行注释 在代码的上面写上注释 不推荐在代码后方注释

    用字典映射代替switch case语句--(键值)

    一,用原始的字典访问方式,不能解决default,也不能解决代码块的问题

    1,键--对应case

    2,值--对应的简单赋值语句

    二,使用内置方法get(),第二个参数返回默认值(即key不存在时),解决默认值问题,但代码块问题也没能解决

    三,使用函数式编程,解决case语句里面多个语句的问题

    Switch case的解决方式

    字典的解决方式

  • 相关阅读:
    bzoj1724[Usaco2006 Nov]Fence Repair 切割木板*
    vue-cli脚手架和webpack-simple模板项目
    Vue-router 进阶
    前端路由vue-router介绍
    vue的一些特殊特性
    生命周期钩子
    过滤器
    RSA加密算法
    欧几里得算法
    动态规划
  • 原文地址:https://www.cnblogs.com/flowercatnice/p/11875713.html
Copyright © 2011-2022 走看看