40行代码的Python爬虫案例:虎牙-王者荣耀主播的人气排行
爬虫:对网页(HTML文件)进行文本分析,提取所需要的数据,通常使用正则表达式来处理数据.
运行结果:
1.明确爬虫目的:从虎牙直播平台爬取各个王者荣耀主播的人气数,并按照排名显示各个主播的名字,观看人数和主播间名字.
2.找到数据对应的网页,并分析网页的结构找到数据所在的标签,抓取数据
源码:
import re # 引入正则表达式的re模块from urllib import request # 引入网络访问模块urllib的request对象data = '<li class="game-live-item" gid="2336">[\s\S]*?</span>\s*</span>' # 爬取主播数据:把每个主播的名字、热度、直播间标题作为一组数据进行爬取name_data = '<i class="nick" title="([\s\S]*?)">' # 主播名字 #()的作用:不显示小括号外相同的标签number_data = '<i class="js-num">([\s\S]*?)</i>'# 主播热度,即观看人数title_data = 'target="_blank">([\s\S]*?)</a>' # 直播间标题#用到的正则表达式#*:零次或多次#?:非贪婪匹配#\s:空白字符#\S:非空白字符def fetch_content(): #定义一个抓取函数fetch_content(),返回html文件htmls = str(request.urlopen('/g/2336').read(), encoding='utf-8') #用urlopen方法接收url# read方法读取文件 #设置编码格式utf8,防止中文出现乱码return htmlsdef analysis(htmls): #定义函数analysis(),分析html文件list_data = [] #定义一个空列表[]for html in re.findall(data, htmls):name = re.findall(name_data,html)number = re.findall(number_data,html)title = re.findall(title_data, html)dict_data = {'name':name,'number':number,'title':title } # 把结果拼接存入字典{}list_data.append(dict_data) #把字典数据放入列表return list_data # 返回处理过的列表def format(list_data): #规范数据格式data2 = lambda dict_data:{'name':dict_data['name'][0].strip(),'number':dict_data['number'][0],'title':dict_data['title'][0]}return map(data2,list_data)#使用map()函数做映射def sort(list_data): #定义排序函数sort(),进行数据处理list_data = sorted(list_data, key=sort_key,reverse=True) #使用python内置排序函数sorted()完成,reverse=True降序排列return list_datadef sort_key(dict_data): #处理观看人数数据r = re.findall('\d*',dict_data['number']) #提取数字number = float(r[0]) #转换为浮点型if '万' in dict_data['number']: #去除"万"字number *= 10000return numberdef show(list_data): #输出排序后的函数print('虎牙-王者荣耀-主播人气排行:')print('排名 主播 人气 直播间名称')for rank in range(0,len(list_data)):print('排名-' + str(rank + 1) + ': ' + list_data[rank]['name'] + ' ' + list_data[rank]['number'] + '' + list_data[rank]['title'])print(show(sort(list(format(analysis(fetch_content()))))))