python爬取斗鱼当前英雄联盟主播排名

python爬取斗鱼当前英雄联盟主播排名

代码

#  目的:爬取斗鱼英雄联盟当前主播的排名
#  找到对应网页
#  分析排名和名称相对的位置

#  模拟HTTP请求,获取HTML数据
#  用正则表达式获取对应数据(姓名,人气)

from urllib import request
#  斗鱼爬出来的式压缩过的,需要解压缩
from io import BytesIO
import gzip
import re


class Spider():
    url = 'https://www.douyu.com/g_LOL'
    header = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36'
    }

    root_pattern = '<div class="DyListCover-info">(.*?)</div>'  # 匹配所有内容,非贪婪
    name_pattern = '<div class="DyListCover-userName is-template">(.*)'
    number_pattern = '<use xlink:href="#icon-hot_8a57f0b"></use></svg>(.*?)</span>'

    def __fetch_content(self):
        req = request.Request(Spider.url, headers=Spider.header)
        r = request.urlopen(req)
        htmls = r.read()
        buff = BytesIO(htmls)
        f = gzip.GzipFile(fileobj=buff)
        #  htmls = str(htmls, encoding='utf-8')
        htmls = f.read().decode('utf-8')
        return htmls

    def __analysis(self, htmls):
        root_html = re.findall(Spider.root_pattern, htmls)
        root_html1 = root_html[1::2]  # 取偶数项,切片操作 (数据特殊,必须是第二个孩子)
        anchors = []
        for html in root_html1:
            name = re.findall(Spider.name_pattern, html)  # list
            number = re.findall(Spider.number_pattern, html)  # list
            anchor = {'name': name, 'number': number}
            anchors.append(anchor)
        return anchors

    def __save(self, htmls):
        fh = open('htmls.html', 'w', encoding='utf-8')
        fh.write(htmls)
        fh.close()

    def __transNumber(self, numberStr):
        if len(numberStr) == 0:
            return
        if not isinstance(numberStr[0], str):
            return

        number = re.findall("-?(([1-9]\\d*\\.\\d*)|(0\\.\\d*[1-9]\\d*)|([1-9]\\d*))", numberStr[0])
        number = float(number[0][0])
        if '万' in numberStr[0]:            
            number *= 10000
        return number

    def __vedioNumCmp(self, numberStr1, numberStr2):
        if not isinstance(numberStr1, str) and isinstance(numberStr2, str):
            return

        number1 = self.__transNumber(numberStr1)
        number2 = self.__transNumber(numberStr2)

        if number1 > number2:
            return True
        else:
            return False

    def __sort(self, vedio_list):
        if not isinstance(vedio_list, list):
            return

        anchors = []

        for vedio_dict in vedio_list:
            if len(vedio_dict['name']) == 0:
                break
            if len(anchors) == 0:
                anchors.append(vedio_dict)
                continue
            i = 0
            for anchors_dict in anchors:
                if self.__vedioNumCmp(vedio_dict['number'], anchors_dict['number']):
                    anchors.insert(i, vedio_dict)
                    break
                else:
                    i += 1
                    continue

            if len(anchors) == i:
                anchors.append(vedio_dict)
                continue

        return anchors

    def __show(self, anchors):
        if not isinstance(anchors, list):
            return

        rank = 0
        for vedio_dict in anchors:
            rank += 1
            print('排名第{}: 名称:{} 热度:{}'.format(rank, vedio_dict['name'][0], vedio_dict['number'][0]))

    def go(self):
        htmls = self.__fetch_content()
        self.__save(htmls)
        anchors = self.__analysis(htmls)
        #  print(anchors)
        anchors = self.__sort(anchors)
        self.__show(anchors)


if __name__ == '__main__':
    spider = Spider()
    spider.go()

结果展示:

排名第1: 名称:英雄联盟赛事 热度:842.8万
排名第2: 名称:东北大鹌鹑 热度:240.4万
排名第3: 名称:智勋勋勋勋 热度:234.5万
排名第4: 名称:南波儿大魔王丶 热度:205.4万
排名第5: 名称:洞主丨歌神洞庭湖 热度:203.9万
排名第6: 名称:不2不叫周淑怡 热度:201万
排名第7: 名称:灵药LoveLing 热度:183.9万
排名第8: 名称:叶音符 热度:155.1万
排名第9: 名称:梨落秋溪 热度:142.5万
排名第10: 名称:zzc啊哦额 热度:137.7万
排名第11: 名称:Xinyi新一丶 热度:126.4万
排名第12: 名称:杰克螳螂 热度:118.2万
排名第13: 名称:王纪超666 热度:112.6万
排名第14: 名称:小苏菲 热度:96.9万
排名第15: 名称:格局OoO 热度:95.4万
排名第16: 名称:魔獸后裔 热度:94.3万
排名第17: 名称:萌面酥 热度:82.5万
排名第18: 名称:Chogod虫王 热度:63.6万
排名第19: 名称:我也会饿龙咆哮嗷 热度:4.5万
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值