Magician_liu 2023-08-12 20:16 采纳率: 57.1%
浏览 42
已结题

selenium的爬虫运用

这是我按照学习教程写的爬取斗鱼主播界面的简单代码,代码如下:

from selenium import  webdriver
from selenium.webdriver.common.by import By
class Douyu():
    def __init__(self):
        self.url='https://www.douyu.com/directory/all'
        self.driver=webdriver.Chrome()
    def parse_data(self):
        self.driver.implicitly_wait(2)
        room_list=self.driver.find_elements(By.XPATH,'//*[@id="listAll"]/section[2]/div[2]/ul/li/div')


        #遍历房间列表,从每一个房间节点中获取数据

        for room in room_list:
            try:
                haha = {}
                haha['title'] = room.find_element(By.XPATH, './a/div[2]/div[1]/h3').text
                haha['type'] = room.find_element(By.XPATH, './a/div[2]/div[1]/span').text
                haha['owner'] = room.find_element(By.XPATH, './a/div[2]/div[2]/h2/div').text
                haha['num'] = room.find_element(By.XPATH, './a/div[2]/div[2]/span').text
                haha['src'] = room.find_element(By.XPATH, './a/div[1]/div[1]/picture/img').get_attribute('src')
                print(haha)
            except:
                pass
    # def save_data(self,data_list):
    #     for data in data_list:
    #         print(data)
    def run(self):
        #url
        #driver
        #get
        self.driver.get(self.url)
        self.parse_data()
if __name__ == '__main__':
    douyu=Douyu()
    douyu.run()

可是爬取出来的却是两条,有时候一条,这是怎么回事?

{'title': 'AG 0:0 狼队', 'type': '王者荣耀', 'owner': '王者荣耀官方赛事', 'num': '708.8万', 'src': 'https://rpic.douyucdn.cn/live-cover/coverupdate/2023/08/12/e112a2e164dd4657c434a4b9bb0a5f80.jpg/dy1'}
{'title': '七圣召唤主播资格赛决赛进行中!', 'type': '原神', 'owner': '丘丘人大队队长', 'num': '69.3万', 'src': 'https://rpic.douyucdn.cn/live-cover/coverupdate/2023/08/08/8c40ce9a0f97a89813f94a38ec1324f8.jpg/dy1'}

当我去掉try时,报如下错误:

selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: stale element not found
  (Session info: chrome=115.0.5790.171); For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#stale-element-reference-exception
Stacktrace:

望解决,谢谢!

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-08-12 22:38
    关注

    【以下回答由 GPT 生成】

    根据您提供的代码,以下是我认为可以优化的几个方面:

    1. 使用显式等待代替隐式等待: 隐式等待会导致每次查找元素时都会等待固定的时间,而显式等待可以在满足某个条件时立即进行下一步操作,提高效率和可靠性。您可以使用expected_conditions模块来定义等待条件,并传递给WebDriverWait类来设置等待时间。
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    # 在初始化方法中使用显式等待
    def __init__(self):
        self.url = 'https://www.douyu.com/directory/all'
        self.driver = webdriver.Chrome()
    
        # 设置显式等待
        self.wait = WebDriverWait(self.driver, 10)  # 最多等待10秒
    
    def parse_data(self):
        # 使用显式等待查找元素
        room_list = self.wait.until(EC.visibility_of_all_elements_located((By.XPATH, '//*[@id="listAll"]/section[2]/div[2]/ul/li/div')))
    
    1. 使用更精确的定位方式: XPath 可以非常强大和灵活,但是也可能因为选择的路径不准确导致解析错误。在XPath路径中使用"./"表示相对路径,但如果不需要使用相对路径,可以直接省略。
    data['title'] = room.find_element(By.XPATH, 'a/div[2]/div[1]/h3').text
    data['type'] = room.find_element(By.XPATH, 'a/div[2]/div[1]/span').text
    data['owner'] = room.find_element(By.XPATH, 'a/div[2]/div[2]/h2/div').text
    data['num'] = room.find_element(By.XPATH, 'a/div[2]/div[2]/span').text
    
    1. 合理利用 find_elements 方法: 您可以使用 find_elements 方法一次性查找到多个元素,然后逐个处理,以减少与浏览器的通信次数。
    room_list = self.wait.until(EC.visibility_of_all_elements_located((By.XPATH, '//*[@id="listAll"]/section[2]/div[2]/ul/li/div')))
    
    # 遍历房间列表
    for room in room_list:
        data = {}
        data['title'] = room.find_element(By.XPATH, 'a/div[2]/div[1]/h3').text
        data['type'] = room.find_element(By.XPATH, 'a/div[2]/div[1]/span').text
        data['owner'] = room.find_element(By.XPATH, 'a/div[2]/div[2]/h2/div').text
        data['num'] = room.find_element(By.XPATH, 'a/div[2]/div[2]/span').text
    
        # 处理数据
        ...
    
    1. 关闭 WebDriver: 在爬取完成后,记得关闭 WebDriver 以释放资源。
    def __del__(self):
        self.driver.quit()
    

    以上是我认为可以优化代码的几个方面,希望对您有所帮助。如果您有任何疑问,请随时提问。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 8月23日
  • 已采纳回答 8月15日
  • 创建了问题 8月12日

悬赏问题

  • ¥15 AnolisOs7.9如何安装 Qt_5.14.2的运行库
  • ¥20 求:怎么实现qt与pcie通信
  • ¥50 前后端数据顺序不一致问题,如何解决?(相关搜索:数据结构)
  • ¥15 基于蒙特卡罗法的中介效应点估计代码
  • ¥15 罗技G293和UE5.3
  • ¥20 Tesla 特斯拉K80显卡 如果需要使用该设备,你需要禁用系统上的另一个设备。
  • ¥30 QT调用百度智能云千帆模型无法取得返回文本
  • ¥50 CCD工业视觉相机检测出现光边
  • ¥60 二次元手游日常任务自动化代肝(相关搜索:自动化)
  • ¥15 mysql将查询的结果作为动态列名怎么实现