最近闲着没事想统计一下目前很火的直播网站的观众数量究竟是多少,所以通过爬虫爬取了斗鱼(
http://www.douyu.com/directory/all)的观众数量。首先可以通过网页源代码获取此时直播的页数,之后利用正则表达式取出主播名字以及对应主播的观众数量,存入数据库,接着再对每页都进行相同的操作,并且每间隔10分钟就统计一次,由此来获得人数随着时间变化的关系。
下图是某一时间得到的直播情况的一部分。
下图是某一时间得到的直播情况的一部分。
将两天得到的数据做成表:
两条竖线分别代表两天的零点,由这段图像可以看出两天的走向大致相同,大约在9、10点钟时达到最高点,接着持续下降,在第二天的6点左右达到最低点,8月28日(周日)的最高观看人数大约为两千万左右,周一的最高观看人数约为一千七百万左右,最低点都大概为一百四十万左右。不过这些人数肯定含有很大的水分,但是具体的趋势应该差不多。两条竖线分别代表两天的零点,由这段图像可以看出两天的走向大致相同,大约在9、10点钟时达到最高点,接着持续下降,在第二天的6点左右达到最低点,8月28日(周日)的最高观看人数大约为两千万左右,周一的最高观看人数约为一千七百万左右,最低点都大概为一百四十万左右。不过这些人数肯定含有很大的水分,但是具体的趋势应该差不多。
代码如下,由于初学所以代码很不规范,如果有人觉得有问题的话还请指正
import requests
import re
import pymongo
import time
ISOTIMEFORMAT='%Y-%m-%d %X'
connection = pymongo.MongoClient()
att = connection.douyu
while(True):
time_now = time.strftime(ISOTIMEFORMAT, time.localtime(time.time()))
if(not((time_now.endswith('0:00')) or (time_now.endswith('0:01')) or (time_now.endswith('0:02')) or (time_now.endswith('0:03')) or (time_now.endswith('0:04')) or (time_now.endswith('0:05')) or (time_now.endswith('0:06')))):
continue
post_info = att[time_now]
total = []
url = 'http://www.douyu.com/directory/all?page=' + str(1) + '&isAjax=0'
try:
response = requests.get(url)
data = response.text
pages = re.findall('count: "(.*?)"', data)
contents = re.findall('<span class="dy-name ellipsis fl">(.*?)</span>[\s]*?<span class="dy-num fr">(.*?)</span>', data)
for content in contents:
post_info.insert({'主播名字': content[0], '观看人数': content[1]})
for i in range(2, eval(pages[0])): # 防止在运行到最后一页的时候所播的人数恰好减少一页以至于又重新redirect到第一页
# 也就是说最后一页的主播将不会被遍历到
url = 'http://www.douyu.com/directory/all?page=' + str(i) + '&isAjax=0'
response = requests.get(url)
data = response.text
contents = re.findall('<span class="dy-name ellipsis fl">(.*?)</span>[\s]*?<span class="dy-num fr">(.*?)</span>', data)
for content in contents:
post_info.insert({'主播名字': content[0], '观看人数': content[1]})
time.sleep(500) #每10分钟运行一次,但运行时发现如果sleep(600)每次都会比10分钟长,所以就sleep(500)之后接着循环了,其实560估计也可以<pre name="code" class="python">time.sleep(500)