斗鱼TV是一个采用js分页加载的网页,你点解下一页的时候网址是不变的都是https://www.douyu.com/directory/all
今天写一个用selenium+PhantomJS写一个实例先给出代码文章末尾说明出现的问题!
点击下一页的时候我们可以直接点到最后一页然后检查最后一页的元素信息得到了:
class = "shark-pager-next shark-pager-disable shark-pager-disable-next"
出现这种情况的时候是下一页点击不了
这时候我们再检查下一页能点击的情况下的下一页的元素信息:
class = "shark-pager-next"
然后我们进入ipython查找这个下一页的翻页规律发现
driver.page_source.find("shark-pager-disable-next")
等于-1 这就说明了当class中
shark-pager-disable-next 没有出现的时候等于-1
相当于下一页可以点击
!= -1 表示隐藏的这个属性出现了下一页就不能点击了
代码:
# -*- coding:utf-8 -*-
#https://www.douyu.com/directory/all
#直播间名字 h3 class="ellipsis"
#直播类型 span class = "tag ellipsis"
#主播名字 span class="dy-name ellipsis fl"
#观看人数 span class="dy-num fr"
# #下一页 class = "shark-pager-next"
#页面判断 if driver.page_source.find("shark-pager-disable-next") != -1 break
import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
import time
class douyu(unittest.TestCase):
#初始化方法
def setUp(self):
self.driver = webdriver.PhantomJS()
#测试方法必须有test字样开头
def testDouyu(self):
self.driver.get("https://www.douyu.com/directory/all")
while True:
soup = BeautifulSoup(self.driver.page_source,'lxml')
fnames = soup.find_all('h3',attrs={'class':'ellipsis'})
numbers = soup.find_all('span',attrs={'class':'dy-num fr'})
types = soup.find_all('span',attrs={'class':'tag ellipsis'})
for fname,number,type in zip(fnames,numbers,types):
print(u'房间名字\t\t'+ fname.get_text().strip()+u'\t\t观看人数\t\t' +number.get_text().strip()+u'\t\t类型\t\t'+ type.get_text().strip())
time.sleep(5) #这里是time模块等待5秒
# 点击前往下一页
self.driver.find_element_by_class_name("shark-pager-next").click() #有错误会出现因为页面刷新导致
#self.driver.find_element_by_xpath('//a[@class="shark-pager-next"]').click()
#判断条件当没有最后一页的时候为
if self.driver.page_source.find("shark-pager-disable-next") != -1:
break
#测试结束执行的方式
def tearDown(self):
self.driver.quit()
if __name__ == "__main__":
#启动测试模块
unittest.main()
采用测试模块进行程序的测试!
出现的错误:
org.openqa.selenium.StaleElementReferenceException: stale element reference: element is not attached to the page document意思就是Element已经过时,没有和当前页面进行绑定。
可能原因:当页面刷新或者跳转后,接下来对元素的操作过快。
解决方法:添加等待时间或者刷新页面。
或者用xpath方法进行下一页的点击