本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理
以下文章来源于腾讯云,作者:梧雨北辰
是在学习Python基础知识之后的一次小小尝试,这次将会爬取ipipgoTV网页上的王者荣耀主播排名,在不借助第三方框架的前提下演示一个爬虫的原理。
一、实现Python爬虫的思路
第一步:明确目的
1.找到想要爬取数据的网页
2.分析网页结构,找到需要爬取数据所在的标签位置
第二步:模拟Http请求,提取数据,加工数据
1.模拟Http网络请求,向服务器发送请求,获取服务器返回给我们的html
2.使用正则表达式从Html中提取我们需要的数据(比如本例中的主播名字和人气)
3.对提取的数据进行加工,显示成我们可以直观查看的形式
二、查看网页源码,观察关键值
我们应该首先找到需要处理的网页,即:ipipgoTV网页上的王者荣耀,然后查看这个网页的源代码,观察我们需要关注的数据在哪个位置,下面是截取的网页效果图:
网页.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
神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试