引言
本篇是在学习Python基础知识之后的一次小小尝试,这次将会爬取斗鱼TV网页上的王者荣耀主播排名,在不借助第三方框架的前提下演示一个爬虫的原理。
一、实现Python爬虫的思路
第一步:明确目的
1.找到想要爬取数据的网页
2.分析网页结构,找到需要爬取数据所在的标签位置
第二步:模拟Http请求,提取数据,加工数据
1.模拟Http网络请求,向服务器发送请求,获取服务器返回给我们的html
2.使用正则表达式从Html中提取我们需要的数据(比如本例中的主播名字和人气)
3.对提取的数据进行加工,显示成我们可以直观查看的形式
二、查看网页源码,观察关键值
我们应该首先找到需要处理的网页,即:斗鱼TV网页上的英雄联盟,然后查看这个网页的源代码,观察我们需要关注的数据在哪个位置,下面是截取的网页效果图。
然后,我们需要在浏览器中查看当前网页的Html源码,不同的浏览器中查看的操作会有所不同,这个需要自行百度一下。此次我们需要拿到每个主播的名字和视频浏览量,从下面源码中我们可以很快发现这些关键数据的位置,如图中的标注。
三、实现Python爬虫的具体实践
下面就是实现爬取数据的具体操作了,这里是创建了一个爬虫类Spider,然后使用不同的正则获取Html标签里的数据,进而将其重新整理后打印显示,具体的代码如下。注释中标记了各处的作用。
from urllib import request
import re
class Spider():
p = '<p>([\s\S]*)</p>'
num = '<span class="dy-num fr">([\s\S]*?)</span>' # 匹配主播人气
name = '<span class="dy-name ellipsis fl">([\s\S]*?)</span>' # 匹配主播名
url ='https://www.douyu.com/g_LOL'
# 抓取网页数据
def __fetch_content(self):
r = request.urlopen(Spider.url)
print(r)
htmls = r.read()
htmls = str(htmls, encoding='utf-8')
return htmls
# 将数据放入到字典中
def __analysis(self, htmls):
auchors = []
p = re.findall(self.p, htmls)
for html in p:
num = re.findall(Spider.num, html)
name = re.findall(Spider.name, html)
auchor = {'name': name,'number':num}
auchors.append(auchor)
return auchors
# 提取name
def __name(self,anchors):
c=[]
for a in anchors:
for b in a['name']:
c.append(b)
return c
# 提取number
def __number(self, anchors):
d = []
for a in anchors:
for b in a['number']:
d.append(b)
return d
#整理数据
def __show(self,name,number):
for x,y in zip(name, number):
print('主播名:'+x+'-------------------'+'人气:'+y)
# 入口方法
def go(self):
htmls = self.__fetch_content()
anchors = self.__analysis(htmls)
live_name = self.__name(anchors)
live_number = self.__number(anchors)
anchors = self.__show(live_name,live_number)
spider = Spider()
spider.go()