zoukankan      html  css  js  c++  java
  • 记录一下自己爬虎牙LOL主播的爬虫思路

    1.明确爬虫目的

    爬虫目的需要我们明确的,没有目的的爬虫都是耍流氓!像我这次爬虫目的能不能从网页上爬下来。

    2.怎么来爬?

    a. 先要找到具有唯一性的标签

    <li class="game-live-item" gid="1">
            <a href="http://www.huya.com/baozha" class="video-info new-clickstat " target="_blank" report="{&quot;eid&quot;:&quot;click/position&quot;,&quot;position&quot;:&quot;lol/0/1/1&quot;,&quot;game_id&quot;:&quot;1&quot;,&quot;ayyuid&quot;:&quot;17363578&quot;}">
            <img class="pic" data-original="//screenshot.msstatic.com/yysnapshot/1801cfa4fc99aabc841eb9e25fa43f15a608b02d1055?imageview/4/0/w/338/h/190/blur/1" src="//screenshot.msstatic.com/yysnapshot/1801cfa4fc99aabc841eb9e25fa43f15a608b02d1055?imageview/4/0/w/338/h/190/blur/1/format/webp" onerror="this.onerror=null; this.src='//a.msstatic.com/huya/main/assets/img/default/338x190.jpg';" alt="炸姐ADC的直播" title="炸姐ADC的直播">
            <em class="tag tag-recommend">大神推荐</em>        <div class="item-mask"></div>
            <i class="btn-link__hover_i"></i>
            <p class="tag-right">
                <!-- 蓝光 -->
                            <!-- 热舞 -->
                            <!-- 存活人数 -->
                        </p>
        </a>
        <a href="http://www.huya.com/baozha" class="title new-clickstat" report="{&quot;eid&quot;:&quot;click/position&quot;,&quot;position&quot;:&quot;lol/0/1/1&quot;,&quot;game_id&quot;:&quot;1&quot;,&quot;ayyuid&quot;:&quot;17363578&quot;}" title="S8定位赛开始了11-0  裁决已解决" target="_blank">S8定位赛开始了11-0  裁决已解决</a>
        <span class="txt">
            <span class="avatar fl">
                <img data-original="//huyaimg.msstatic.com/avatar/1095/83/2aa2f6905fe4382221d08b66d7cdcb_180_135.jpg" src="//huyaimg.msstatic.com/avatar/1095/83/2aa2f6905fe4382221d08b66d7cdcb_180_135.jpg" onerror="this.onerror=null; this.src='//a.msstatic.com/huya/main/assets/img/default/84x84.jpg';" alt="炸姐ADC" title="炸姐ADC">
                <i class="nick" title="炸姐ADC">炸姐ADC</i>
            </span>
                    <span class="num"><i class="num-icon"></i><i class="js-num">67.0万</i></span>
        </span>
    </li>
    开始的时候我选取的是<span class="txt"></span>,虽然这个标签中涵盖了我们需要的主播名字和主播的粉丝量,但是,如果我们用正则表达式提取的时候,如果使用贪婪模式的时候,提取的信息就比上面多太多了,如果用非贪婪模式的时候,
    提取的内容也就只有下面这些:
    <span class="txt">
            <span class="avatar fl">
                <img data-original="//huyaimg.msstatic.com/avatar/1095/83/2aa2f6905fe4382221d08b66d7cdcb_180_135.jpg" src="//huyaimg.msstatic.com/avatar/1095/83/2aa2f6905fe4382221d08b66d7cdcb_180_135.jpg" onerror="this.onerror=null; this.src='//a.msstatic.com/huya/main/assets/img/default/84x84.jpg';" alt="炸姐ADC" title="炸姐ADC">
                <i class="nick" title="炸姐ADC">炸姐ADC</i>
            </span>
    缺失了主播的粉丝数,那么选取的标签就是不合理的。
    如果我们选择<li class="game-live-item" gid="1"></li>这个标签的时候就不会出现问题的。

    b. 尽量选取匹配的信息

    假想一下,如果我们只是获得主播名字,然后再获取主播粉丝,那么信息就对不上了,所以我们要选取匹配的信息。选取下面的就很合理。
    <li class="game-live-item" gid="1">
            <a href="http://www.huya.com/baozha" class="video-info new-clickstat " target="_blank" report="{&quot;eid&quot;:&quot;click/position&quot;,&quot;position&quot;:&quot;lol/0/1/1&quot;,&quot;game_id&quot;:&quot;1&quot;,&quot;ayyuid&quot;:&quot;17363578&quot;}">
            <img class="pic" data-original="//screenshot.msstatic.com/yysnapshot/1801cfa4fc99aabc841eb9e25fa43f15a608b02d1055?imageview/4/0/w/338/h/190/blur/1" src="//screenshot.msstatic.com/yysnapshot/1801cfa4fc99aabc841eb9e25fa43f15a608b02d1055?imageview/4/0/w/338/h/190/blur/1/format/webp" onerror="this.onerror=null; this.src='//a.msstatic.com/huya/main/assets/img/default/338x190.jpg';" alt="炸姐ADC的直播" title="炸姐ADC的直播">
            <em class="tag tag-recommend">大神推荐</em>        <div class="item-mask"></div>
            <i class="btn-link__hover_i"></i>
            <p class="tag-right">
                <!-- 蓝光 -->
                            <!-- 热舞 -->
                            <!-- 存活人数 -->
                        </p>
        </a>
        <a href="http://www.huya.com/baozha" class="title new-clickstat" report="{&quot;eid&quot;:&quot;click/position&quot;,&quot;position&quot;:&quot;lol/0/1/1&quot;,&quot;game_id&quot;:&quot;1&quot;,&quot;ayyuid&quot;:&quot;17363578&quot;}" title="S8定位赛开始了11-0  裁决已解决" target="_blank">S8定位赛开始了11-0  裁决已解决</a>
        <span class="txt">
            <span class="avatar fl">
                <img data-original="//huyaimg.msstatic.com/avatar/1095/83/2aa2f6905fe4382221d08b66d7cdcb_180_135.jpg" src="//huyaimg.msstatic.com/avatar/1095/83/2aa2f6905fe4382221d08b66d7cdcb_180_135.jpg" onerror="this.onerror=null; this.src='//a.msstatic.com/huya/main/assets/img/default/84x84.jpg';" alt="炸姐ADC" title="炸姐ADC">
                <i class="nick" title="炸姐ADC">炸姐ADC</i>
            </span>
                    <span class="num"><i class="num-icon"></i><i class="js-num">67.0万</i></span>
        </span>
    </li>

    c. 尽量选取他们的父级标签

    3. 简单点的爬虫思路

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

    b.用正则表达式获取我们想要的数据

    4.开始爬

    附上源码(每个函数都解释的很清楚):

    from urllib import request
    import re
    
    
    class Spider():
        url = 'http://www.huya.com/g/lol'
        root_pattern = '<li class="game-live-item" gid="1">([wW]*?)</li>'
        one_pattern = '<i class="nick" title="[sS]*?</i>'
        two_pattern = '<i class="js-num">([sS]*?)</i>'
        one_pattern_name = '>([sS]*?)</i>'
        
        
        #模拟HTTP请求(私有方法)
        def __fetch_content(self):
            
            r = request.urlopen(Spider.url)
            htmls=r.read()
            #如果不转成str的格式的话,就会造成机器卡顿
            htmls= str(htmls,encoding='utf-8')
            return htmls
    
        #数据分析
        def __analynize(self,htmls):
            rs = re.findall(Spider.root_pattern,htmls)
            star_lists = []
            
            for r in rs:
                rz = re.findall(Spider.one_pattern,r)
                #粉丝数
                follwers = re.findall(Spider.two_pattern,r)
                #主播名字
                name = re.findall(Spider.one_pattern_name,str(rz))
                #Spider.result[str(rzz[0])]=str(rx[0])
                star_list = {'name':name,'follwers':follwers}
                star_lists.append(star_list)
    
            return star_lists
    
        #数据精炼(提高数据的可靠性)
        def __refine(self,star_lists):
            func = lambda star_list:{
                'name':star_list['name'][0],
                'follwers':star_list['follwers'][0]
                }
            return map(func,star_lists)
    
        #业务处理(这里以排序代替)
        def __sort(self,star_end_lists):
            star_end_lists = sorted(star_end_lists,key=self.__key_access,reverse=True)
            return star_end_lists
    
    
        #key的排序规则
        def __key_access(self,star_end_list):
            num = re.findall('d*',star_end_list['follwers'])
            num = float(num[0])
            
            if '' in star_end_list['follwers']:
                num=num*10000
            return num
    
        #数据的后续处理(可以存入数据库)
        def __show(self,star_end_lists_sorted):
            print('------虎牙LOL主播粉丝的排行榜------')
            for i in range(1,len(star_end_lists_sorted)):
                print('排名:'+str(i)+'   '+star_end_lists_sorted[i-1]['name']+'   '+star_end_lists_sorted[i-1]['follwers'])
    
    
        #爬虫入口    
        def go(self):
            r1 = self.__fetch_content()
            star_lists = self.__analynize(r1)
            star_end_lists = self.__refine(star_lists)
            star_end_lists_sorted = self.__sort(list(star_end_lists))
            self.__show(star_end_lists_sorted)
    
    
    spider = Spider()
    spider.go()

    运行结果:

    ------虎牙LOL主播粉丝的排行榜------
    排名:1   卡尔   71.9万
    排名:2   毒纪   36.1万
    排名:3   LCK冠军联赛   17.7万
    排名:4   LPL职业联赛   16.0万
    排名:5   MH、金灿毅ChanE   12.6万
    排名:6   聆听-旋律   9.5万
    排名:7   董月月   8.2万
    排名:8   完美OB   7.9万
    排名:9   芜湖神   6.3万
    排名:10   叶子yasuo   5.2万
    排名:11   第一吸血鬼屿水   3.5万
    排名:12   灭世冷漠   3.3万
    排名:13   最快锐雯风神   3.4万
    排名:14   娇宝的老公李青强   2.2万
    排名:15   纪小鹿   2.1万
    排名:16   菜鸡文   1.9万
    排名:17   八神   1.4万
    排名:18   幼灵梦   1.5万
    排名:19   虎牙丶柯南   1.0万
    排名:20   小僧空空   9972
    排名:21   潘神丶   9392
    排名:22   开森的小唯美   8888
    排名:23   阿俊z   8712
    排名:24   90818丶追梦   8678
    排名:25   铸哥   8010
    排名:26   二A   7915
    排名:27   烟雨丶青蛙瑞兹   7824
    排名:28   吐司   6774
    排名:29   正恒丶小白   6635
    排名:30   844-暮笙小爷   5972
    排名:31   国服第一赵信小雨   5655
    排名:32   雨雾-小杰人马   5564
    排名:33   正恒丶兔子   5479
    排名:34   先锋丶婉清   5417
    排名:35   可乐剑姬   5379
    排名:36   节奏   4985
    排名:37   腾嘉-熊大   4959
    排名:38   正恒丶小鱼   4923
    排名:39   844-雯雯   4779
    排名:40   雨雾-阿龙赵信   4416
    排名:41   娱加-萌小希   4373
    排名:42   虎丶牙莎莉   4020
    排名:43   十年锐雯   4013
    排名:44   正恒丶伊芙神   3999
    排名:45   亚古兽   3972
    排名:46   虎牙东方梦魇   3888
    排名:47   猴王一心   3806
    排名:48   谁明浪子心   3694
    排名:49   浩东德莱文   3539
    排名:50   正恒丶芒果   3350
    排名:51   兆辉-风度人影剑度天   3347
    排名:52   耀弟-最强武器   3120
    排名:53   觅寻哟   3049
    排名:54   天亿-Aarou   2916
    排名:55   先锋GJ丶空城男刀   2812
    排名:56   爱拍-阿浩   2682
    排名:57   Autism   2672
    排名:58   叶包包丶   2571
    排名:59   固执   2529
    排名:60   Huya丶薄荷   2505
    排名:61   阿明   2490
    排名:62   兆辉-瑶神皎月   2475
    排名:63   何遇是个帅卡特i   2472
    排名:64   悦儿   2416
    排名:65   5斧德莱文丶秒杀   2211
    排名:66   正恒丶小雪   2197
    排名:67   会好的   2151
    排名:68   飘逸   2147
    排名:69   娱加-U妮   2144
    排名:70   铭人丶千姿   2038
    排名:71   虎牙直播-蔸   1992
    排名:72   无心瑞兹   1979
    排名:73   逍遥   1954
    排名:74   悟道沙皇   1934
    排名:75   光锡兰博   1918
    排名:76   开开皇子   1874
    排名:77   正恒丶小贼   1782
    排名:78   泽佳琴女   1713
    排名:79   娱加-杨思涵   1712
    排名:80   武神诺手丶强者灌篮   1654
    排名:81   烟雨丶陈年剑圣   1646
    排名:82   娱加-辣么萌   1642
    排名:83   LCK备用1   1595
    排名:84   聆听-鑫哥卡萨丁   1582
    排名:85   雨雾-火鸡兰博   1571
    排名:86   老唐家糯米饭   1570
    排名:87   正恒丶逗比空   1552
    排名:88   拔哥丶卡特   1540
    排名:89   菲菲   1532
    排名:90   辗转辗转辗转   1517
    排名:91   虎牙鱼王-洛水尘   1505
    排名:92   国服第一卡特   1495
    排名:93   极限哥   1477
    排名:94   Huya丶风男   1431
    排名:95   王吉吉先生   1424
    排名:96   小风手速亚索   1402
    排名:97   魔魅大少   1401
    排名:98   LCK备用2   1396
    排名:99   虎牙嗨少   1371
    排名:100   北北   1365
    排名:101   坑货的提莫   1346
    排名:102   正恒丶烧肉粽   1320
    排名:103   甲第-乔仪   1298
    排名:104   提百万   1297
    排名:105   十四剑姬   1277
    排名:106   正恒丶啤梨   1241
    排名:107   我是钟钟   1166
    排名:108   天天天   1121
    排名:109   RiotGame1   1109
    排名:110   兆辉-章鱼哥   1090
    排名:111   河蟹i   1090
    排名:112   京酱Rose   1063
    排名:113   零一c   1063
    排名:114   冷三指   1059
    排名:115   喵喵   1058
    排名:116   腾嘉-陈小艾   1026
    排名:117   虎牙野区剑圣皓児   1006
    排名:118   小姚姚   1001
    排名:119   虎牙丶Hope   991

    声明:以上数据是时间在2018.1.18.13:53统计的

    5.爬虫有什么用

    存到数据库中,就可以自己做小程序,或者其他的了。

    转载请注明出处,谢谢!

  • 相关阅读:
    关于IE11浏览器同意请求只执行一次的解决方法
    基于Vue+iView+OpenLayer在IE11上运行的方法总结
    vue 树形目录结构
    css中DIV中字过多时,使用省略号的方法
    hls.js在vue中的使用
    SQL优化
    Python 实现自动化 Excel 报表
    C# HttpClient 请求认证、数据传输笔记
    任务队列处理
    判断是否包含中文
  • 原文地址:https://www.cnblogs.com/huhu1203/p/8309826.html
Copyright © 2011-2022 走看看