Python3使用selenium爬取斗鱼直播平台数据

进入斗鱼平台首页,点击页面底部下一页,发现url地址没有发生变化,这样的话再使用urllib2发送请求将获取不到完整的数据,这时候我们可以使用selenium和Chrome来模拟浏览器点击下一页,这样就可以获取到完整的响应数据了

程序代码:

from selenium import webdriver
from bs4 import BeautifulSoup


class Douyu():

    def __init__(self):
        # 使用Chrome浏览器创建浏览器对象
        self.driver = webdriver.Chrome()
        self.num = 0
        self.count = 0


    def douyuSpider(self):
        # 使用get方法加载页面
        self.driver.get("http://www.douyu.com/directory/all")
        while True:
            # BeautifulSoup基本的用法
            # lxml HTML解析库 BeautifulSoup(html,’lxml’)速度快;容错能力强
            # 创建对象
            soup = BeautifulSoup(self.driver.page_source, "lxml")
            # 使用BeatuifulSoup获取元素
            # 房间名,返回列表
            # <span class="dy-name ellipsis fl">xxx</span>
            # find_all 函数返回的是一个序列,可以对它进行循环,依次得到想到的东西.
            names = soup.find_all("span", {"class": "dy-name ellipsis fl"})
            # 观众人数,返回列表
            # <span class="dy-num fr">500万</span>
            numbers = soup.find_all("span", {"class": "dy-num fr"})

# zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。

# strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。

# get_text() 是返回文本,这个对每一个BeautifulSoup处理后的对象得到的标签都是生效的。你可以试试 print soup.p.get_text()

            for name, number in zip(names, numbers):
                print(u"观众人数:-" + number.get_text().strip() + u"-\t房间名:" + name.get_text().strip())
                self.num += 1
                count = number.get_text().strip()
                if count[-1] == "万":
                    # 统计
                    countNum = float(count[:-1])*10000
                else:
                    countNum = float(count)
                self.count += countNum

            # 一直点击下一页 会发现执行后的页面一直在刷新翻页
            # <a href="#" class="shark-pager-next">下一页</a>
            self.driver.find_element_by_class_name('shark-pager-next').click()
            # 如果在页面源码里找到“下一页”为隐藏的标签,就退出循环
            # 如果在页面源码里没有找到"shark-pager-disable-next",其返回值为-1,可依次作为判断条件
            # <a href="#" class="shark-pager-next shark-pager-disable shark-pager-disable-next">下一页</a>
            if self.driver.page_source.find("shark-pager-disable-next") != -1:
                break

        print("当前网站直播人数:%s" % self.num)
        print("当前网站观众人数:%s" % self.count)


if __name__ == "__main__":
    d = Douyu()
    d.douyuSpider()

猜你喜欢

转载自blog.csdn.net/phpzhi/article/details/80630618