以爬取虎牙直播某具体分类下的主播名称及访问量,并根据访问量排序
思路:
(1)获取网页内容
(2)分析所要获取的数据格式
(3)获取相应的数据
(4)将数据转化为所需要的格式
(5)数据展现
一、类里面所包含的函数
二、具体实现
1、引入request,通过request获取页面内容,注意编码问题!!!!
from urllib import request
url = 'https://www.huya.com/g/lol'
#私有方法
def __fetch__content(self):
r=request.urlopen(Spider.url)
htmls = r.read()
htmls = str(htmls, encoding='utf-8')
return htmls
2、分析页面内容,编写相应的正则表达式获取所需数据
一般选择最近一层能完整包含所需内容的标签
正则表达式:
#加上问号表示是非贪婪模式
#加上括号表示组的概念,去掉li
root_pattern='<span class="txt">([\s\S]*?)</li>'
name_pattern='<i class="nick" title="([\s\S]*?)">'
number_pattern='<i class="js-num">([\s\S]*?)</i>'
#分析页面结构,获取相应数据
def __analysis(self,htmls):
root_html = re.findall(Spider.root_pattern,htmls)
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)
return anchors
3、本案例中数据较为标准,在其他情况下,上述操作完成后可能需要删除空格获得换行等,然后将数据转化为所需格式
#数据精炼,将数据转化为需要的数据格式
def __refine(self,anchors):
l = lambda anchor:{
'name':anchor['name'][0].strip(),
'number':anchor['number'][0]
}
return map(l,anchors)
4、对获取到的数据进行处理,如排序
#排序函数
def __sort(self,anchors):
#用key指定按照什么排序
#???为什么这里可以不用传参数???
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
5、数据展现
#展示数据
def __show(self,anchors):
for rank in range(0,len(anchors)):
print('rank ' + str(rank + 1) + ' : ' + anchors[rank]['name']
+' '+anchors[rank]['number'])
三、结果
四、完整代码
from urllib import request
import re
class Spider():
'''
< span class ="txt" >
< span class ="avatar fl" >
< img data - original = "https://huyaimg.msstatic.com/avatar/1084/b7/896bc815db9560eabbcb4a227f62ba_180_135.jpg"
src = "https://huyaimg.msstatic.com/avatar/1084/b7/896bc815db9560eabbcb4a227f62ba_180_135.jpg"
onerror = "this.onerror=null; this.src='//a.msstatic.com/huya/main/assets/img/default/84x84.jpg';"alt = "卡尔"title = "卡尔" >
< i class ="nick" title="卡尔" > 卡尔 < / i >
< / span >
< span class ="num" >
< i class ="num-icon" > < / i >
< i class ="js-num" > 273.7万 < / i >
< / span >
< / span >
'''
url = 'https://www.huya.com/g/lol'
#加上问号表示是非贪婪模式
#加上括号表示组的概念,去掉li
root_pattern='<span class="txt">([\s\S]*?)</li>'
name_pattern='<i class="nick" title="([\s\S]*?)">'
number_pattern='<i class="js-num">([\s\S]*?)</i>'
#私有方法
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)
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)
return anchors
#数据精炼,将数据转化为需要的数据格式
def __refine(self,anchors):
l = lambda anchor:{
'name':anchor['name'][0].strip(),
'number':anchor['number'][0]
}
return map(l,anchors)
#排序函数
def __sort(self,anchors):
#用key指定按照什么排序
#???为什么这里可以不用传参数???
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 rank in range(0,len(anchors)):
print('rank ' + str(rank + 1) + ' : ' + anchors[rank]['name']
+' '+anchors[rank]['number'])
#入口函数
def go(self):
htmls = self.__fetch__content()
anchors = self.__analysis(htmls)
anchors= list(self.__refine(anchors))
anchors = self.__sort(anchors)
self.__show(anchors)
spider = Spider()
spider.go()