• Python3(十一) 原生爬虫


    一.爬虫实例

    1.原理:文本分析并提取信息——正则表达式。

    2.实例目的:爬取熊猫TV某个分类下面主播的人气排行

                         分析网站结构

    操作:F12查看HTML信息,Ctrl+Shift+C鼠标选取后找到对应的HTML。

    3.步骤:

    前奏:

    1、明确目的(分析抓取目的确定抓取页面)

    2、找到数据对应网页

    3、分析网页的结构,找到数据所在标签的位置

    执行:

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

    5、用正则表达式提取我们要的数据

    ......

    4.代码

    二. VSCode中调试代码

    断点调试:F5启动,F10单步,F5跳断点,F11进内部

    三.HTML结构分析基本原则

    寻找到标签、标识符,使之能够定位要抓取的信息。

    1、尽量选取具有唯一性的标签

    2、尽量选取最接近于数据的标签

    四.数据提取层级分析及原则

    1.可以把两个数据看成是一组数据并再次寻找标签。

    2.尽量选取可以闭合的标签(父级标签),并包裹其需要的数据

    五.正则分析HTML及具体流程

    '''
    This is a spider,模块注释
    '''
     
     
    from urllib import request
     
    import re
     
     
     
    class Spider():
     
        '''
        This is a spider class
        '''
     
        url = 'https://www.panda.tv/cate/lol'
     
        root_pattern = '<div class="video-info">([sS]*?)</div>' #注意单双引号
     
        #[wW] [sS] . 匹配所有字符
     
        #* 匹配0次或者无限多次
     
        #? 非贪婪模式,匹配到第一个遇到的</div>
     
        name_pattern = '</i>([sS]*?)</span>'
     
        number_pattern = '<span class="video-number">([sS]*?)</span>'
     
    def __fetch_content(self):
     
        '''
        私有方法,获取网页内容
        '''
     
        r = request.urlopen(Spider.url)
     
        htmls = r.read()
     
        htmls = str(htmls,encoding = 'utf-8')
     
     
        return htmls
     
     
    def __analysis(self,htmls):
     
        '''
        正则表达式来提取数据
        '''
     
        root_html = re.findall(Spider.root_pattern,htmls)
     
     
        anchors = []
     
        for html in root_html:
     
            name = re.findall(Spider.name_pattern,html)
     
            number = re.findall(Spider.number_pattern,html)
     
            anchor = {'name':name,'number':number}
     
            anchors.append(anchor)
     
     
        return anchors
     
     
     
    def __refine(self,anchors):
     
        l = lambda anchor:{
     
        'name':anchor['name'][0].strip(),
     
        'number':anchor['number'][0] #列表转化为单一的字符串
     
        }
     
     
        return map(l,anchors)
     
     
     
    def __sort_seed(self,anchor):
     
        r = re.findall('d*',anchor['number']) #提取数字
     
        number = float(r[0])
     
        if '' in anchor['number']: #处理'万'
     
            number *= 10000
     
            
     
        return number
     
     
     
    def __sort(self,anchors):
     
        '''
        key确定比较对象
        sorted()默认升序排列,reverse = True 降序
        不能用str排序,要用int,并且要处理'万'
        '''
     
        anchors = sorted(anchors,key = self.__sort_seed,reverse = True)
     
        return anchors
     
     
     
    def __show(self,anchors):
     
        for rank in range(0,len(anchors)):
     
            print('rank ' + str(rank + 1) +
     
        ':' + ' ' + anchors[rank]['name'] +
     
        '————' + anchors[rank]['number'])
     
     
     
    def go(self): #Spider的入口方法
     
        htmls = self.__fetch_content()
     
        anchors = self.__analysis(htmls)
     
        anchors = list(self.__refine(anchors))
     
        anchors = self.__sort(anchors)
     
        self.__show(anchors)
     
     
     
    spider = Spider()
     
    spider.go()

    爬虫框架:

    Beautiful Soup

    Scrapy

  • 相关阅读:
    postgresql获取随机数
    windows环境中Tomcat实现开机自启动
    让Tomcat支持中文路径名和中文文件名
    CentOS 环境变量编辑、保存、立即生效的方法
    eclipse/intellij idea 远程调试hadoop 2.6.0
    利用Spring的@Async异步处理改善web应用中耗时操作的用户体验
    ssh 免密码设置失败原因总结
    hadoop 2.6伪分布安装
    weblogic.nodemanager.common.ConfigException: Native version is enabled but nodemanager native library could not be loaded 解决办法
    velocity模板引擎学习(3)-异常处理
  • 原文地址:https://www.cnblogs.com/wlgaojin/p/12300460.html
Copyright © 2020-2023  润新知