看了许久的斗鱼直播,突然心血来潮,想用爬虫对斗鱼所有直播间的信息抓取
一开始,我简单对斗鱼代码进行了分析,直观地认为所有直播间都在html文件里。
就直接 选择了 requests — bs4 路线 对其进行爬取。
思路是:先从获取所有游戏分类直播页面的url
在 用bs4库进行对当前页面进行数据提取
然后将其以文本形式输出 或者存入数据库
然而 在我要处理翻页的时候却返现,找不到对应的url链接 ,源代码里也没有包含翻页url标签
既然没法获取翻页链接,那么我们爬取全站直播间信息的目标是否到此为止了呢?
当然不能拉~~~
这时 一般有两种方法处理:第一种继续打开Chrome的开发者工具,当我们点击“下一页”之后,浏览器发送了如下请求:
接着 我们查看这些请求文件 点击它们
我们发现这个文件里面包含了当前页面的直播间的相关信息,是json格式
接着我们切回Headers一栏
General 是我们需要请求的地址、方式、状态
headers 是我们请求的头部信息
接下来
我经过仔细的分析发现 General 栏里的url 最后的两个数字是我们爬取全站的关键
至此 目标网站分析完毕
我们开始编写代码:
先导入requests库 : import requests
页面是json格式直接包含了我们要的信息
不用进行解析但是需要处理下json格式
导入json库:import simplejson
鉴于 url 的特性 我们采取for循环的手段进行循环访问
data_url = 'https://www.douyu.com/gapi/rkc/directory/'
for i in range(1,300):
'''
这是初始url:https://www.douyu.com/gapi/rkc/directory/2_1/1
我们只需要关注最后面的两个数字就可以了 分别代表 游戏分类 和 页码
1 = 英雄联盟 1 = 第一页
'''
start_url = data_url '2_' str(i) '/1'
r = requests.get(start_url,headers).text
由于我们访问的页面是json格式,所以需要先处理成python对象便于后续操作
#页面是就json格式 有json库方法转换成python字典
json_obj = simplejson.loads(r)
#我们已经将其转换成字典,其中的pgcnt键对应的值是页码我们获取它
n = json_obj['data']['pgcnt']
#以循环的方式,对当前游戏分类的每一页进行遍历
for x in range(1,n 1):
json = requests.get(data_url '2_' str(i) '/' str(x)).text
jsobj = simplejson.loads(json)#再次对json格式进行转换
我们接下来创建一个字典保存我们需要的信息:(直播间的标题,主播昵称,热度,主播所在游戏分区
#我们需要的信息是rl键(key)对应的 值(value) 这个值是一个列表
for j in jsobj['data']['rl']:
item = {}
item['title'] = j['rn']
item['name'] = j['nn']
item['game'] = j['c2name']
item['hot'] = j['ol']
lst.append(item)
这样每一个游戏分区的每一页所包含的信息我们已经获取到了
接下来 我们把他存入到一个文件:
with open('斗鱼1.txt', 'a ',encoding='utf-8') as f:
f.write(str(lst))
如果不满意排序,请诸位自行采用格式化输出 如:.format()
我们对斗鱼直播信息的提取就算完了
纵观整篇代码,都非常简单,没有定义函数,没有定义类,就直接十来行代码就完事了
当然一是斗鱼没有反爬虫,我们获取的信息也都比较简单,出发点也只是心血来潮。再者我们找到了包含了直播间的信息的页面,不需要再进行网页解析和信息提取,json格式也有助于我们保存
至于第二种方法,是用selenium库 模拟浏览器进行点击翻页
但是在我找到了json格式的页面后,采用第二种方法反倒麻烦了!有兴趣的小伙伴可以去了解下selenium库
建议大家在对网页爬取时,先查看网站的robots协议,不要以盈利的目的进行深度爬取。并且不要频繁的访问 给网站服务器带来压力
本次文章 仅作学习交流,未经许可,不得私自盗用
就酱!!!