进入斗鱼平台首页,点击页面底部下一页,发现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()