美文网首页
PandaTV爬取主播人气并排序

PandaTV爬取主播人气并排序

作者: Wei_Lai | 来源:发表于2018-12-19 17:37 被阅读0次

很早前,第一次爬虫,就用的re加urllib原生爬虫。这次重新来爬取一次PandaTV主播人气排名,来练一下手。毕竟看直播嘛,颜值区更喜欢一点。就以颜值区为例,颜值区url = 'https://www.panda.tv/cate/yzdr'。结果保存在运行目录下的PandaTV主播人气排名.md中。

发布的时候nickname和number如图
代码如下:
import re
from urllib import request
import os
import datetime
 
 
class Spider():
    url = 'https://www.panda.tv/all'
    root_pattern ='<div class="video-info">[\s\S]*?</div>'  # 因为number和name均在其下
    name_pattern = '<span class="video-nickname" title="([\s\S]*?)">\n'
    number_pattern = '<span class="video-number"><i class="ricon ricon-eye"></i>([\s\S]*?)</span>\n'

    # 获取htmls数据
    def __fetch_content(self):
        r = request.Request(Spider.url)
        r.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17758')
        r = request.urlopen(r)   # 打开网页    request 下面的urlopen方法
        htmls = r.read()     # 读取
        htmls = str(htmls, encoding='utf-8')   # 转为str
        return htmls   

    
    # 建立一个list为: [{'name':name,'number': number},{'name':name,'number': number},...]
    def __analysis(self, htmls):
        root_html = re.findall(Spider.root_pattern, htmls)  # 抓取所有的<div class="video-info">[\s\S]*?</div>
        anchors = []

        for html in root_html:  # 将<div class="video-info">[\s\S]*?</div>一个一个提取出来
            name = re.findall(Spider.name_pattern, html)  # 将一个的name提取出来 ,格式为[str]
            number = re.findall(Spider.number_pattern, html) # 将一个的number提取出来,格式为[str]
            anchor = {'name': name, 'number': number} # 将name 和 number 对应起来,组成一个字典
            anchors.append(anchor) # 将这个字典添加到 anchors列表中
        return anchors
 
    # 
    def __refine(self, anchors):
        l = lambda anchors: {
            'name': anchors['name'][0],  #strip()  内置函数,去掉空格
            'number': anchors['number'][0]   # 取出字符串
        }
        return map(l, anchors)  #{['name':'xxx','number':'yyy']},{['name':'xxx1','number':'yyy1']}...
 
    def __sort(self, anchors):   #排序
        anchors = sorted(anchors, key=self.__sort_seed, reverse=True) #reverse=True表示降序
        return anchors  #anchor['number']中的转为float格式,按转化后的数字大小进行排序
 
    def __sort_seed(self, anchor):  # 排序调用的方法
        r = anchor['number']
        if '万' in r:
            r = r.strip('万')
            r = float(r)
            r *= 10000
        number = float(r)
        return number
 
    def __show(self, anchors):  # 显示格式  
        time_stamp = datetime.datetime.now()
        b = str(time_stamp.strftime('%Y.%m.%d - %H:%M:%S') )
        with open('./PandaTV主播人气排名.md', 'a') as f:
                f.write('\n\n')
                f.write(b)
                f.write('\n\n') 
        for rank in range(0, len(anchors)):
            a = str(('rank  ' + str(rank + 1) + '    '   #加排名,因为是从0开始
                                           '主播姓名' + ':' + anchors[rank]['name'] +
                  '      ' + '观看人数:'+anchors[rank]['number']))
            with open('./PandaTV主播人气排名.md', 'a') as f:
                f.write(a)
                f.write('\n')
 
    def go(self):  #主方法
        htmls = self.__fetch_content()
        anchors = self.__analysis(htmls)
        anchors = list(self.__refine(anchors))
        anchors = self.__sort(anchors)
        self.__show(anchors)
 
spider = Spider()
spider.go()

附带本次成果


相关文章

网友评论

      本文标题:PandaTV爬取主播人气并排序

      本文链接:https://www.haomeiwen.com/subject/oknjkqtx.html