首先获得数据定位 按F12打开控制台,点击左上角抓取其中一个直播间的主播名称,观看人数同样操作
为了使得到的数据名称与观看人数对应,找到最近的闭合标签,图片中最上面的使闭合标签,第一行是主播名称,第二行是直播间观看人数。
标签选择执行“就近原则”
爬取内容结构如下
实现爬取直播间名称和人数的代码实现如下
1 import re 2 from urllib import request 3 4 class Spider(): 5 url="https://www.huya.com/g/lol" 6 #正则表达式 匹配内容,爬取的内容 7 root_pattern ='<div class ="txt">([\s\S]*?)</div>' 8 #root_pattern ='<div class ="txt">[\s\S]*?</div>' *可以读取多个字符 ?选择非贪婪模式 ()只选择前面标签里面的信息 9 #匹配的方式 10 #\w 单词字符 \W 11 #\s 空白字符\W 12 #. 匹配除换行符\n之外其他所有字符 13 name_pattern ='</i>([\s\S]*?)</span>' 14 number_pattern='<span class="num">[\s\S]*?)</span>' 15 def __fetch_content(self): 16 r= request.urlopen(Spider.url) 17 htmls = r.read() 18 htmls =str(htmls,encoding='utf-8') 19 return htmls 20 def __analysis(self, htmls): 21 root_html = re.findall(Spider.root_pattern,htmls) 22 anchors=[] 23 for htlm in root_html: 24 name = re.findall(Spider.name_pattern,html) 25 number = re.findall(Spider.number_pattern,html) 26 anchor ={'name':name,'number':number} 27 anchors.append(anchor) 28 return anchors 29 #已经获得数据,精炼数据,规范结构 30 def __refine(self,anchors): 31 l = lambda anchor:{ 32 'name':anchor['name'][0].strip(), 33 'number':anchor['number'][0] 34 } 35 return map(l,anchors) 36 #strip 去除空格python内置函数 37 def __sort(self,anchors): 38 anchors =sorted(anchors,key=self.__sort_seed(),reverse=True) 39 return anchors 40 41 def __sort_seed(self,anchor): 42 r=re.findall('\d*',anchor['number']) 43 # 加 * 是多个 相当于 *n 44 number = float(r[0]) 45 if '万' in anchor['number']: 46 number *=10000 47 return anchor['number'] 48 49 def _show(self,anchors): 50 for rank in range(0,len(anchors)): 51 print('rank ' + str(rank + 1)+ ':'+ anchors[rank]['name'] + ' '+ anchors[rank]['number']) 52 53 def go(self): 54 htmls =self.__fetch_content() 55 anchors=self.__fetch_content() 56 anchors=list(self.__refine(anchors)) 57 anchors =self.__sort(anchors) 58 self.__show(anchors) 59 60 61 62 spider =Spider() 63 spider.go()
运行结果如下
标签:直播间,anchors,self,number,爬取,虎牙,htmls,anchor,name From: https://www.cnblogs.com/Szxszx/p/17353714.html