最近在忙着写自己的线上展示项目,很久没更新博客了。想着之前落下原生爬虫的坑,今天把它补全一下。本文将直接引用上一篇里用到的代码和变量继续下去,如果有不懂的小伙伴请查看前两篇。
传送门: 用python基础语法简单写个原生小爬虫获取主播排名(上)
传送门:用python基础语法简单写个原生小爬虫获取主播排名(中)
##八、最终精炼
在上一步return得到的anchors列表,其实里面已经包含了我们要爬取的所有主播名字和观看人数。但是除此之外,在数据之间还有其他不需要的元素,比如空格等。那么接下来我们自定义一个简单的lambda方法把它精炼一下。
def __refine(self, anchors):
A = lambda anchor: {
'name':anchor['name'][0].strip(),
#'strip'方法用来移除字符串开头结尾的字符,一般默认是空格
'number':anchor['number'][0]
}
return map(A, anchors)
#为什么要用map来输出呢?因为map()方法可以将列表anchors中附和lambda格式的结果遍历出来
里面的[0]是指所需数据在anchors列表中的第一个元素
九、排序显示
数据都已经精炼好了。但是,里面是无序的,我们需要自己排序才知道谁是目前的NO.1人气王。这里自定义个sort函数。
def __sort(self, anchors): #sort()方法用来排序,这个入门都应该知道的了
anchors = sorted(anchors, key = self.__sort_seed, reverse = True)
return anchors
后来我发现排序之后的观看人数里是‘万’字结尾,我们虽然知道万的单位大小,可是在python里它只是个字符串,这个区排序的话,就只会以万字前的数字排序,结果一定有问题的,所以再加个函数去把‘万’转化为真是的数字
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'])
#还记得我一直强调,每新建一个函数都要及时在run()里加上吗?这是入口方法
def run(self):
htmls = self.__get_content()
anchors = self.__analysis(htmls)
anchors = list(self.__refine(anchors))
anchors = self.__sort(anchors)
self.__show(anchors)
spider = Spider()
spider.run()
##效果图入下:
最后放出整体源码:
import re
from urllib import request
class Spider():
url = 'https://www.panda.tv/cate/pubg?pdt=1.24.s1.18.3nd8ke922g2'
root_pattern = '<div class="video-info">([\s\S]*?)</div>'
name_pattern = '</i>([\s\S]*?)</span>'
number_pattern = '<span class="video-number">([\s\S]*?)</span>'
def __get_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):
A = lambda anchor: {
'name':anchor['name'][0].strip(),
'number':anchor['number'][0]
}
return map(A, 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 rank in range(0, len(anchors)):
print('rank' + str(rank + 1)
+ ':' + anchors[rank]['name']
+ ' ' + anchors[rank]['number'])
def run(self):
htmls = self.__get_content()
anchors = self.__analysis(htmls)
anchors = list(self.__refine(anchors))
anchors = self.__sort(anchors)
self.__show(anchors)
spider = Spider()
spider.go()