ITPub博客

首页 > IT职业 > IT生活 > Python爬虫原理

Python爬虫原理

IT生活 作者:wyvernw 时间:2021-09-09 09:29:33 0 删除 编辑

本篇是在学习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 = '
([sS]*?)
'        #正则:获取主播名     reString_name = '([sS]*?)'     #正则:获取视频浏览量     reString_number = '([sS]*?)'     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



作者:风恣
链接:https://www.jianshu.com/p/831598743fa1

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/835/viewspace-2810229/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-04-12

  • 博文量
    128
  • 访问量
    1297