import re from urllib import request class Spider(): # 将所需要的数据进行缩小范围: url = 'http.tv/cate/lol?pdt=1.24.s1.3.2p03g5k38l9'#考虑问题:‘*’所有字符 ‘?’非贪婪 57min ()组里的内容 即<div class="video-info">[\s\S]*?</div>里面的内容 root_pattern ='<div class="video-info">([\s\S]*?)</div>' name_pattern = '</i>(\s\S*?)</span>' number_pattern = '<span class="video-number">(\s\S*?)</span>' # 定义一个私有方法(获取HTML内容) def __fetch_content(self): r = request.urlopen(Spider.url)# 实例中读取类变量的方法(读取url),需要从urllib引入request htmls = r.read()#读取文件 htmls = str(htmls, encoding='utf-8')# 获取的是自检码(bytes) 需要字符串 需要进行转化 str(自检码,转换类型) return htmls#将字符串返回 # 定义一个方法分析文本(分析字符串) def __analysis(self, htmls): root_html = re.findall(Spider.root_pattern, htmls)# (类变量,分析的内容) anchors = []# 定义一个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}# 定义一个字典,将主播名字和人气组合在一起 anchors.append(anchor)# (将定义的字典放到列表中) 给列表中添加一个元素——append return anchors#将列表返还回去 # 数据精炼(去掉空格和换行符) def __refine(self, anchors): l = lambda anchor:{'name': anchor['name'][0].strip(),# 内置函数(strip)消除字符串中的空格和换行 'number': anchor['number'][0]# 转换成字符串 } return map(l, anchors)# lambda表达式,处理的列表(map会根据提供的函数对指定序列做映射。) # 为比较做准备的种子key 这里接受的anchor是字典(名字不可以进行比较,人气进行比较) def __sort_seed(self, anchor): r = re.findall('\d*',anchor['number'])# 正则表达式提取人气 number = float(r[0])# 提取出来后还是文本,将文本转换成数字(文本中有小数所以不能用int) if '万'in anchor['number']:# 某些带有‘万’对这种情况进行处理 number *= 10000 return number # 排序:(利用内置函数sorted(要排序的列表,key=一个函数(这里的作用是指导哪个字典进行大小比较)(具有可比较性sorted才能用))进行排序) def __sort(self, anchors): anchors = sorted(anchors, key=self.__sort_seed, reverse=True)# (操作对象,函数,reverse True降序,False升序) return anchors def __show(self,anchors):#对字典的比较进行标序 for rank in range(0,len(anchors)): print('rank ' + str(rank + 1) #输出‘rank’加上标序 + ':' + anchors[rank]['name']#输出主播的姓名 +' '+anchors[rank]['number']#输出主播的人气 ) def go(self, htmls):#定义一个入口方法(又是一个总控方法,将所有方法总控调用) htmls = self.__fetch_content()# 提取内容(返回回来字符串) anchors = self.__analysis(htmls)# 分析内容(得到列表) anchors = list(self.__refine(anchors))# 精炼内容 返还过来的是map列表 将格式转换成列表 anchors = self.__sort(anchors)# 业务处理(人气排名比较) self.__show(anchors)# 展示 # 实例化Splider: splider = Spider() splider.go()
精慕门9227090
Stardust1001
相关分类