selenium+PhantomJS爬取斗鱼动态js分页实例

斗鱼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方法进行下一页的点击


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值