selenium 之百度搜索,结果列表翻页查询

selenium百度搜索,结果列表翻页查询

by:授客 QQ1033553122

实例:百度搜索,结果列表翻页查询

解决问题:解决selenium driver获取web页面元素时,元素过期问题

 

思路1:获取所有“页面翻页链接”元素,然后遍历元素并点击

# -*- coding: utf-8 -*-

from selenium import webdriver

import time

 

if __name__ == "__main__":

    driver = webdriver.Firefox()

    driver.maximize_window()   

    driver.get('http://www.baidu.com')   

    driver.implicitly_wait(5)

   

    driver.find_element_by_id('kw1').send_keys('selenium')

    driver.find_element_by_id('su1').click()   

   

    page = driver.find_element_by_id('page')      

    pages = page.find_elements_by_tag_name('a')  #查找所有翻页跳转链接

   

#设置滚动条位置为底部

    js = 'document.documentElement.scrollTop=10000'

    for each in pages:

        driver.execute_script(js)   #拖动滚动条到底部

        each.click()

        driver.execute_script(js)

           

    time.sleep(3)     

driver.quit()

 

结果:点击第3页时,程序出错

selenium.common.exceptions.StaleElementReferenceException: Message: u'Element not found in the cache - perhaps the page has changed since it was looked up' ; Stacktrace:

 

cache中找不到元素,可能是在元素被找到之后页面变换了。 这就说明,当前页面发生跳转之后,存在cache中的与这个页面相关的元素也被清空了

 

思路2:基于思路1的错误结果分析>先获取每个页面数,然后每次点击某个页面,跳转后重新获取下一个页面翻页链接,然后点击,循环。。

# -*- coding: utf-8 -*-

 

from selenium import webdriver

import time

 

if __name__ == "__main__":

    driver = webdriver.Firefox()

    driver.maximize_window()   

    driver.get('http://www.baidu.com')   

    driver.implicitly_wait(5)

   

    driver.find_element_by_id('kw1').send_keys('selenium')

    driver.find_element_by_id('su1').click()   

   

    page = driver.find_element_by_id('page')      

    pages = page.find_elements_by_tag_name('a')

   

    js = 'document.documentElement.scrollTop=10000'

    total = len(pages)

    has_pre_page = False

    page_num = 0

    for i in range(total):

        driver.execute_script(js)

        pn=10

        page_num = page_num + 1 #设置页面号

        one_page = driver.find_element_by_css_selector('p[id="page"]>a:nth-of-type('+str(page_num)+')')

        one_page.click()

    

        #备注以下小段代码描述了页面变化规律,这个得自己去研究

  if not has_pre_page:   #点击第2页时会出现上一页,页号加1

            has_pre_page = True

            page_num = page_num + 1

        if page_num % 7 == 0: #page_num等于7时,页号减1

            page_num = page_num - 1

     

  time.sleep(2)

        driver.execute_script(js)

        time.sleep(2)

           

    time.sleep(3)     

driver.quit()

 

 

改进版(自动翻页,前翻页后翻页)

# -*- coding: utf-8 -*-

 

from selenium import webdriver

import time

 

if __name__ == "__main__":

    driver = webdriver.Firefox()

    driver.maximize_window()   

    driver.get('http://www.baidu.com')   

    driver.implicitly_wait(5)

   

    driver.find_element_by_id('kw1').send_keys('selenium selenium')#测试数据 selenium zhidashso dld#selenium zhidashso dldld

    driver.find_element_by_id('su1').click()   

   

    js = 'document.documentElement.scrollTop=10000'

               

    total = 0  #页面数

    is_next_page = True  #存在下一页

    page_num = 0   #要点击的页面号

 

    #往后翻页

    while is_next_page:#'sv_page\=1' in one_page.get_attribute('href')

        driver.execute_script(js)

        page_num = page_num + 1    #设置页号为下一页

        total = page_num   #记录页面数

        value=str(page_num)      

        try:       

            #查找指定页面

            one_page = driver.find_element_by_css_selector('p[id="page"]>a[href*=pn\='+value+']')  

            one_page.click()

            time.sleep(1)

            driver.execute_script(js)

            time.sleep(1)

        except:

            print('no next page')

            is_next_page = False

            total = total - 1

            break      

 

    #往前翻页

    while total >= 0:

        driver.execute_script(js) 

        try:

            total = total -1

            value = str(total)

            one_page = driver.find_element_by_css_selector('p[id="page"]>a[href*=pn\='+value+']')

            one_page.click()

            time.sleep(1)

            driver.execute_script(js)

            time.sleep(1)

        except:

            print('no pre page')

            break;  

   

    time.sleep(3)     

    driver.quit()

 

 

posted @   授客  阅读(856)  评论(0编辑  收藏  举报
编辑推荐:
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示