在MOOC上学完了python的入门课程后,实现课后的一个小作业。
对之前学到的python的基础知识有了一个很好的回顾。用到的基本知识有:包的导入,类的定义,if语句,for语句,字典,列表,的操作,正则的应用,sort函数的应用,lambda表达式,map函数。
可以爬取某直播平台分区下主播的姓名及观众的人数,并对爬取得数据进行排序。
import re #导入库
from urllib import request #导入库中的方法
#定义一个类
class Spider():
url = 'https://www.panda.tv/cate/lol?pdt=1.24.s1.3.6mavo55dcno'
root_pattern = '([\s\S]*?)' #其中的“?”表示的是非贪婪的匹配
name_pattern = '([\s\S]*?)' #用正则表达式来提取有效的信息
number_pattern = '([\s\S]*?)'
def __fetch_content(self):
r = request.urlopen(Spider.url) #打开链接
htmls = r.read() #读取链接的内容
htmls = str(htmls, encoding = 'utf-8') #将其转化为字符串
return htmls
#对数据进行分析
def __analysis(self, htmls):
root_html = re.findall(Spider.root_pattern,htmls) #用正则表达式提取字符串中有效的部分,root_html的类型是list
anchors = []
#用for循环遍历list
for html in root_html:
name = re.findall(Spider.name_pattern, html) #用正则匹配有效名字
number = re.findall(Spider.number_pattern, html) #用正则匹配有效数字
anchor = {'name':name, 'number':number} #将信息封装成dict
anchors.append(anchor) #将字典放进新的list
return anchors
#排序函数
def __sort(self, anchors):
anchors = sorted(anchors, key= self.__sort_seed,reverse = True)
return anchors
#生成排序种子的函数
def __sort_seed(self, anchor):
r = re.findall('\d*', anchor['number']) #正则匹配数字
number = float(r[0])
if '万' in anchor['number']: #对“万”进行区别处理
number *= 10000
return number
#显示函数(排序结果)
def __show(self, anchors):
for anchor in anchors:
print(anchor['name']+ '------'+anchor['number'])
#精炼信息函数
def __refine(self, anchors):
l = lambda anchor:{'name':anchor['name'][0].strip(),
'number':anchor['number'][0]}
return map(l, anchors)
#入口函数
def go(self):
htmls = self.__fetch_content()
anchors = self.__analysis(htmls)
#print(anchors[8])
anchors = list(self.__refine(anchors))
anchors = self.__sort(anchors)
self.__show(anchors)
spider = Spider()
spider.go()
学习的过程中,写写博客记录一下自己的学习过程!
ps:大周末的导师早上比我来的早,现在还在做实验。老师都这个年纪了,还这么拼!实在让我汗颜。
年轻人就是要干到底!