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

xiaoxiao2021-02-28  65

进入斗鱼平台首页,点击页面底部下一页,发现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()
转载请注明原文地址: https://www.6miu.com/read-2623698.html

最新回复(0)