import re
from urllib import request
class Spider():
url=‘https://www.panda.tv/cate/lol‘
root_pattern=‘<div class="video-info">([\s\S]*?)</div>‘
name_pattern=‘</i>([\s\S]*?)</span>‘
number_pattern=‘<i class="ricon ricon-eye"></i>([\s\S]*?)</span>‘
def __fetch_content(self):
r=request.urlopen(Spider.url) #发出打开url的请求
htmls=r.read() #让获取到的url内容进行可读操作,存储到htmls变量里。
htmls=str(htmls,encoding=‘utf-8‘) #将获取到的htmls文本转换编码‘utf-8’,并变成str数据类型。
return htmls
def __analysis(self,htmls):
root_html=re.findall(Spider.root_pattern,htmls) #正则表达式匹配出来root_pattern的内容,存储了所有lol主播的实时信息。
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} #存储到字典里面,以key:value的形式。
anchors.append(anchor) #将所有含有每个主播实时信息的字典放进去列表。
return anchors
def __refine(self,anchors):
l=lambda anchor:{
‘name‘:anchor[‘name‘][0].strip(), #strip()去掉左右所有空白。
‘number‘:anchor[‘number‘][0] #对数据进行精炼处理,去掉可能会匹配多个结果的可能。
}
return map(l,anchors) #使用匿名函数,简化了代码效率。
def __sort(self,anchors):
anchors=sorted(anchors,key=self.__sort_seed,reverse=True) #对列表内的主播进行排序处理,所以定义一个key排序方式,按人气的高低排序,
reverse=True是倒序处理,让人气从高到低排序。
return anchors
def __sort_seed(self,anchor): #为上面的排序函数进行服务,定义key的排序方式。
r=re.findall(‘\d*‘,anchor[‘number‘]) #贪婪模式只匹配出来数字。去掉万等其他符号。
number=float(r[0]) #对数据精炼处理,将str类型转换为float类型,方便下面的排序计算。
if ‘万‘ in anchor[‘number‘]: #有些数据是带着万的,但是在上面被剔除了,需要进一步处理,在数值上乘以一万。
number *=10000
return number #返回的结果作为key的参考,让上面的函数进行排序。
def __show(self,anchors): #处理数据展现的方式
for anchor in anchors:
print(anchor[‘name‘]+‘-----‘+anchor[‘number‘])
def go(self):
htmls=self.__fetch_content() #先找到对应的htmls文本。
anchors=self.__analysis(htmls) #将htmls文本进一步处理。得到一个字典anchors。
anchors=list(self.__refine(anchors)) #将字典anchors进行数据的提炼,去掉空白等多余符号。上个list是确保一直是列表的形式。
anchors=self.__sort(anchors) #将字典anchors内的人气进行排序处理。
self.__show(anchors) #展现出最后的爬虫数据。
spider=Spider()
spider.go()
输出结果我就忽略掉了,避免打广告的嫌疑,感兴趣的同学可以自行运行尝试。