前言

关于上次发布的文章《【Python爬虫 • selenium】selenium4新版本使用指南》很多人反馈说自动获取的驱动会导致闪退,本次文章给出详细配置。

首先说一下大家闪退的问题。我在低版本的python中,安装selenium,发现安装的是旧版本,并不是selenium4的版本,就导致用法还是selenium3,此时用我之前提供的selenium4的代码必然会报错,因此在本次文章中将会给出各种驱动的selenium3和selenium4版本的代码,供大家直接cv。

其次,本次文章还要让大家学会如何排错。selenium闪退原因其实很好排查的,一般来说,运行报错就会有提示,这些东西在正文中将会说明。


一、安装驱动

当前环境配置,python=3.10,

注意,确保你的python版本是高版本,低版本会自动安装selenium3,高版本会自动安装selenium4,如果你不明白你安装的selenium版本是多少,建议你使用pip list命令来查看一下

我是用的python3.10安装了默认是4.7版本的selenium。

pip install webdriver-manager

然后安装selenium

pip install selenium

二、使用步骤

本次以Edge为例,因为我目前只有Edge是空闲的。

1.导入包

代码如下:

from selenium import webdriver
from selenium.webdriver.edge.service import Service as EdgeService
from webdriver_manager.microsoft import EdgeChromiumDriverManager

2.生成驱动

代码如下:

driver = webdriver.Edge(service=EdgeService(EdgeChromiumDriverManager().install()))

3.打开网站

我这里以打开我的博客为例,注意这里要做延时,否则闪退。

driver.get('https://blog.csdn.net/weixin_47754149?spm=1010.2135.3001.5343')
sleep(10000)

运行效果图如下

运行10秒后会自动关闭,说明确实是没有问题的。

二、selenium闪退问题处理

selenium闪退正常情况下是有两种问题导致的,一是selenium和你的代码版本不兼容,或者说你代码写错了,二是浏览器闪了一下就没了,这种情况不是你代码写错了,而是浏览器打开的时候代码执行完了。你只需要做一点适当的延迟即可。因此这里展开对第一种情况进行处理。

1. selenium版本与代码不匹配

这部分是最有可能遇到的错误。通常来说,你安装selenium的时候会自动识别你的python版本进行安装对应的版本,比如你用的python3.6,就会默认安装selenium3,如果你用的python3.10就会自动安装selenium4,因此确定你安装的selenium是哪个版本是非常重要的。

首先要确认你的selenium版本,使用以下命令

pip list

然后就会输出你当前环境中的包和版本号
其中需要找你的selenium,查看是哪个版本的

然后根据你对应版本号来看你应该写selenium3还是selenium4的代码,这样就不闪退了。

2. selenium代码异常

这部分闪退问题基本上就说明了你代码功底不够扎实,这种问题属于语法错误,因为python是边解释边执行的,代码正确的会执行,错误代码及以后就不执行了,而且一些没有的字段和属性在开发中不会标注出来,所以新手是不好看出来的。

这种问题我的建议是使用IDE来进行开发,我推荐使用visual studio code,然后安装python插件,在状态栏那里选择你的python版本


此时代码就会有提示了,如果你写的代码有问题就会在这里显示出来

有点开发经验的就直接加个异常处理就好了,就不细说了。

三、代码示例

此处代码专供cv使用,让你在cv的时候更爽,更直接。

1.selenium4代码示例

1. Chrome

# selenium 4
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))

2. Chromium

# selenium 4
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromiumService
from webdriver_manager.chrome import ChromeDriverManager
from webdriver_manager.core.utils import ChromeType

driver = webdriver.Chrome(service=ChromiumService(ChromeDriverManager(chrome_type=ChromeType.CHROMIUM).install()))

3. Brave

# selenium 4
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as BraveService
from webdriver_manager.chrome import ChromeDriverManager
from webdriver_manager.core.utils import ChromeType

driver = webdriver.Chrome(service=BraveService(ChromeDriverManager(chrome_type=ChromeType.BRAVE).install()))

4. Firefox

# selenium 4
from selenium import webdriver
from selenium.webdriver.firefox.service import Service as FirefoxService
from webdriver_manager.firefox import GeckoDriverManager

driver = webdriver.Firefox(service=FirefoxService(GeckoDriverManager().install()))

5. IE

# selenium 4
from selenium import webdriver
from selenium.webdriver.ie.service import Service as IEService
from webdriver_manager.microsoft import IEDriverManager

driver = webdriver.Ie(service=IEService(IEDriverManager().install()))

6. Edge

# selenium 4
from selenium import webdriver
from selenium.webdriver.edge.service import Service as EdgeService
from webdriver_manager.microsoft import EdgeChromiumDriverManager

driver = webdriver.Edge(service=EdgeService(EdgeChromiumDriverManager().install()))

7. Opera

# selenium 3 & 4
from selenium import webdriver
from webdriver_manager.opera import OperaDriverManager

driver = webdriver.Opera(executable_path=OperaDriverManager().install())

2.selenium3代码示例

1. Chrome

# selenium 3
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(ChromeDriverManager().install())

2. Chromium

# selenium 3
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from webdriver_manager.core.utils import ChromeType

driver = webdriver.Chrome(ChromeDriverManager(chrome_type=ChromeType.CHROMIUM).install())

3. Brave

# selenium 3
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from webdriver_manager.core.utils import ChromeType

driver = webdriver.Chrome(ChromeDriverManager(chrome_type=ChromeType.BRAVE).install())

4. Firefox

# selenium 3
from selenium import webdriver
from webdriver_manager.firefox import GeckoDriverManager

driver = webdriver.Firefox(executable_path=GeckoDriverManager().install())

5. IE

# selenium 3
from selenium import webdriver
from webdriver_manager.microsoft import IEDriverManager

driver = webdriver.Ie(IEDriverManager().install())

6. Edge

# selenium 3
from selenium import webdriver
from webdriver_manager.microsoft import EdgeChromiumDriverManager

driver = webdriver.Edge(EdgeChromiumDriverManager().install())

7. Opera

# selenium 3 & 4
from selenium import webdriver
from webdriver_manager.opera import OperaDriverManager

driver = webdriver.Opera(executable_path=OperaDriverManager().install())

3. 提供的操作框架

import os

import requests
from requests import Response

from webdriver_manager.chrome import ChromeDriverManager
from webdriver_manager.core.download_manager import WDMDownloadManager
from webdriver_manager.core.http import HttpClient
from webdriver_manager.core.logger import log

class CustomHttpClient(HttpClient):

    def get(self, url, params=None, **kwargs) -> Response:
        """
        在这里添加你的操作,session,代理等
        """
        log("这些将会被自定义的http客户端调用")
        return requests.get(url, params, **kwargs)


def test_can_get_chrome_driver_with_custom_http_client():
    http_client = CustomHttpClient()
    download_manager = WDMDownloadManager(http_client)
    path = ChromeDriverManager(download_manager=download_manager).install()
    assert os.path.exists(path)

总结

以上就是本期文章的所有内容了,主要是处理大家在使用自动获取驱动的时候遇到的问题,尽管问题总结不是很全面,但是已经触及到根本的方面了,那就是selenium和python版本一定要匹配才能安装selenium4。其次就是将一些selenium的代码贴出来便于大家直接cv,我相信这是很有用的,当你看到这篇文章发现可以直接cv那必然是很舒服的,我也是这么想的。

如果说你遇到了问题,并且不是以上这种的问题,那么请直接私信我。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐