爬虫之路——Day4

最近闲着没事想统计一下目前很火的直播网站的观众数量究竟是多少,所以通过爬虫爬取了斗鱼( 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)

 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值