Python爬虫原理

本篇是在学习Python基础知识之后的一次小小尝试,这次将会爬取熊猫TV网页上的王者荣耀主播排名,在不借助第三方框架的前提下演示一个爬虫的原理。

一、实现Python爬虫的思路

第一步:明确目的 1.找到想要爬取数据的网页 2.分析网页结构,找到需要爬取数据所在的标签位置

第二步:模拟Http请求,提取数据,加工数据 1.模拟Http网络请求,向服务器发送请求,获取服务器返回给我们的html 2.使用正则表达式从Html中提取我们需要的数据(比如本例中的主播名字和人气) 3.对提取的数据进行加工,显示成我们可以直观查看的形式

二、查看网页源码,观察关键值

我们应该首先找到需要处理的网页,即:熊猫TV网页上的王者荣耀,然后查看这个网页的源代码,观察我们需要关注的数据在哪个位置,下面是截取的网页效果图:

网页.png

然后,我们需要在浏览器中查看当前网页的Html源码,不同的浏览器中查看的操作会有所不同,这个需要自行百度一下。此次我们需要拿到每个主播的名字和视频浏览量,从下面源码中我们可以很快发现这些关键数据的位置,如图中的标注:

Html源码.png

三、实现Python爬虫的具体实践

下面就是实现爬取数据的具体操作了,这里是创建了一个爬虫类Spider,然后使用不同的正则获取Html标签里的数据,进而将其重新整理后打印显示,具体的代码如下:

from urllib import request   #导入模块urllib,用于发起网络请求,获取数据
import re                    #导入模块re,用于实现正则提取信息


class Spider():
    #需要抓取的网络链接
    url = "https://www.panda.tv/cate/kingglory"

    #正则:获取显示视频信息的div代码串
    reString_div = '<div class="video-info">([\s\S]*?)</div>'   
    #正则:获取主播名
    reString_name = '</i>([\s\S]*?)</span>'
    #正则:获取视频浏览量
    reString_number = '<span class="video-number">([\s\S]*?)</span>'


    def __fetch_content(self):
        '''
        请求网络,获取整个网页的Hmtl字符串
        '''
        r = request.urlopen(Spider.url)
        data = r.read()
        htmlString = str(data,encoding="utf-8")
        return htmlString


    def __alalysis(self,htmlString):
        '''
        使用正则初步获取数据,得到主播信息(主播名和浏览量)的数组
        '''
        videoInfos = re.findall(Spider.reString_div,htmlString)
        anchors = []
        #print(videoInfos[0])
        for html in videoInfos :
            name = re.findall(Spider.reString_name,html)
            number = re.findall(Spider.reString_number,html)
            anchor = {"name":name,"number":number}
            anchors.append(anchor)
        #print(anchors[0])
        return anchors


    def __refine(self,anchors):
        '''
        将数据进一步提炼,去除空格等多余字符
        '''
        f = lambda anchor :{"name":anchor["name"][0].strip(),"number":anchor["number"][0]}
        newAnchors = list(map(f,anchors))
        #print(newAnchors)
        return newAnchors


    def __sort(self,anchors):
        '''
        数据分析:排序浏览量从大到小 
        '''
        anchors = sorted(anchors,key=self.__sort_seed,reverse = True)
        return anchors


    def __sort_seed(self,anchor):
        '''
        排序规则
        '''
        list_nums = re.findall('\d*',anchor["number"])
        number = float(list_nums[0])
        if '万' in anchor["number"]:
            number = number * 10000
        return number


    def __show(self,anchors):
        '''
        展示数据,将已经排序好的数据打印出来
        '''
        for rank in range(0,len(anchors)):
            print("第" + str(rank+1) +"名:" + anchors[rank]["number"] + "\t"  + anchors[rank]["name"])


    def startRun(self):
       '''
       程序入口,开始运行爬虫
       '''
       htmlString = self.__fetch_content()
       anchors = self.__alalysis(htmlString)
       anchors = self.__refine(anchors)
       anchors  = self.__sort(anchors)
       self.__show(anchors)

        
#创建爬虫类,爬取数据
spider = Spider()
spider.startRun()

然后,我们将看到如下的打印效果:

执行爬虫.png

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏晨星先生的自留地

大数据比赛的一个小心得

47050
来自专栏玉树芝兰

如何用Markdown写论文?

本文用简明的样例,介绍如何使用Markdown和自动化工具帮你处理数学公式、参考文献引用、图片交叉索引等学术论文写作中常见的棘手问题。快来试试吧。

52220
来自专栏SpringBoot 核心技术

印象笔记下的MarkDown

印象笔记终于还是终于出了markdown语法编辑方式,苦苦等了几年的我们是一个什么样子的体验?

27420
来自专栏北京马哥教育

浅谈TCP优化

很多人常常对TCP优化有一种雾里看花的感觉,实际上只要理解了TCP的运行方式就能掀开它的神秘面纱。Ilya Grigorik 在「High Performanc...

74750
来自专栏韩东吉的Unity杂货铺

零基础入门 43:InputField虚拟键盘激活状态如何检查?

Hello,大家好,我是Jimin 韩东吉,因为公司的项目在前一段时间处于紧急开发阶段和紧接着的一测二测,导致又是时隔很久不更,现在节奏稍微慢了下来,还是抽空回...

25830
来自专栏CDA数据分析师

Excel2016四个超强的数据分析功能

摘要:三维地图、预测工作表、引用外部数据查询、数据透视表更强大的功能改进、将Excel 表格发布到Office 365 Power BI实现数据的商业智能分析…...

31550
来自专栏Android干货园

Reading:一款不错的Material Desgin风格的Kotlin版本的开源APP

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/81...

15530
来自专栏精讲JAVA

key / value 数据库的选型

这个项目有很多 key/value 数据(约 100 GB)需要使用,使用时基本是只读的,偶尔更新时才会批量导入,且可以忍受短暂的停机导入。我一想 TiKV 和...

54530
来自专栏刘望舒

Android绘制优化(一)绘制性能分析

前言 一个优秀的应用不仅仅是要有吸引人的功能和交互,同时在性能上也有很高的要求。运行Android系统的手机,虽然配置在不断的提升,但仍旧无法和PC相比,无法做...

23050
来自专栏owent

Blog切换到Hugo

其实很早就想把Blog迁移到静态化的博客系统了。不过一直没花时间来搞,当然主要原因还是懒。

39610

扫码关注云+社区

领取腾讯云代金券