python 斗鱼爬虫

2018-01-04 09:17:48 浏览数 (1)

看了许久的斗鱼直播,突然心血来潮,想用爬虫对斗鱼所有直播间的信息抓取

一开始,我简单对斗鱼代码进行了分析,直观地认为所有直播间都在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协议,不要以盈利的目的进行深度爬取。并且不要频繁的访问 给网站服务器带来压力

本次文章 仅作学习交流,未经许可,不得私自盗用

就酱!!!

0 人点赞