用python基础语法简单写个原生小爬虫获取主播排名(下)

最近在忙着写自己的线上展示项目,很久没更新博客了。想着之前落下原生爬虫的坑,今天把它补全一下。本文将直接引用上一篇里用到的代码和变量继续下去,如果有不懂的小伙伴请查看前两篇。

传送门: 用python基础语法简单写个原生小爬虫获取主播排名(上)

传送门:用python基础语法简单写个原生小爬虫获取主播排名(中)

##八、最终精炼
在上一步return得到的anchors列表,其实里面已经包含了我们要爬取的所有主播名字和观看人数。但是除此之外,在数据之间还有其他不需要的元素,比如空格等。那么接下来我们自定义一个简单的lambda方法把它精炼一下。

def __refine(self, anchors):
        A = lambda anchor: {
            'name':anchor['name'][0].strip(),  
             #'strip'方法用来移除字符串开头结尾的字符,一般默认是空格
            'number':anchor['number'][0]
        }
        return map(A, anchors)
#为什么要用map来输出呢?因为map()方法可以将列表anchors中附和lambda格式的结果遍历出来

里面的[0]是指所需数据在anchors列表中的第一个元素

九、排序显示
数据都已经精炼好了。但是,里面是无序的,我们需要自己排序才知道谁是目前的NO.1人气王。这里自定义个sort函数。

def __sort(self, anchors):   #sort()方法用来排序,这个入门都应该知道的了
        anchors = sorted(anchors, key = self.__sort_seed, reverse = True)
        return anchors

后来我发现排序之后的观看人数里是‘万’字结尾,我们虽然知道万的单位大小,可是在python里它只是个字符串,这个区排序的话,就只会以万字前的数字排序,结果一定有问题的,所以再加个函数去把‘万’转化为真是的数字

def __sort_seed(self, anchor):
        r = re.findall('\d*',anchor['number'])
        number = float(r[0])
        if '万' in anchor['number']:
            number *= 10000
        return number

十、显示和调用
全部操作已经完成啦。接下来我们只需要定义一下显示的格式和调用方法就行了。

def __show(self, anchors):
        for rank in range(0, len(anchors)):
            print('rank' + str(rank + 1)
            + ':' + anchors[rank]['name']
            + '    ' + anchors[rank]['number'])

#还记得我一直强调,每新建一个函数都要及时在run()里加上吗?这是入口方法
    def run(self):
         htmls = self.__get_content()
         anchors = self.__analysis(htmls)
         anchors = list(self.__refine(anchors))
         anchors = self.__sort(anchors)
         self.__show(anchors)


spider = Spider()
spider.run()

##效果图入下:
在这里插入图片描述

最后放出整体源码:

import re
from urllib import request

class Spider():
    url = 'https://www.panda.tv/cate/pubg?pdt=1.24.s1.18.3nd8ke922g2'
    root_pattern = '<div class="video-info">([\s\S]*?)</div>'
    name_pattern = '</i>([\s\S]*?)</span>'
    number_pattern = '<span class="video-number">([\s\S]*?)</span>'


    def __get_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):
        A = lambda anchor: {
            'name':anchor['name'][0].strip(),
            'number':anchor['number'][0]
        }
        return map(A, anchors)

    def __sort(self, anchors):
        anchors = sorted(anchors, key = self.__sort_seed, reverse = True)
        return 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 __show(self, anchors):
        for rank in range(0, len(anchors)):
            print('rank' + str(rank + 1)
            + ':' + anchors[rank]['name']
            + '    ' + anchors[rank]['number'])


    def run(self):
         htmls = self.__get_content()
         anchors = self.__analysis(htmls)
         anchors = list(self.__refine(anchors))
         anchors = self.__sort(anchors)
         self.__show(anchors)


spider = Spider()
spider.go()

猜你喜欢

转载自blog.csdn.net/weixin_42833042/article/details/82920167