Python学习:爬虫示例

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

一、实现Python爬虫的思路

第一步:明确目的

1.找到想要爬取数据的网页

2.分析网页结构,找到需要爬取数据所在的标签位置

第二步:模拟Http请求,提取数据,加工数据

1.模拟Http网络请求,向服务器发送请求,获取服务器返回给我们的html

2.使用正则表达式从Html中提取我们需要的数据(比如本例中的主播名字和人气)

3.对提取的数据进行加工,显示成我们可以直观查看的形式

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

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

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

三、实现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 numbe

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()

推荐我们的Python学习扣qun:784758214 ,看看前辈们是如何学习的!从基础的python脚本到web开发、爬虫、django、数据挖掘等【PDF,实战源码】,零基础到项目实战的资料都有整理。送给每一位python的小伙伴!每天都有大牛定时讲解Python技术,分享一些学习的方法和需要注意的小细节,点击加入我们的 python学习者聚集地

发布了44 篇原创文章 · 获赞 13 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/ITHHH777/article/details/104224305