使用selenium爬取网页数据,一运行程序就报错:
selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 114
Current browser version is 117.0.5938.149 with binary path C:\Program Files\Google\Chrome\Application\chrome.exe
就很奇怪,之前都是没问题的,今天就不行了,查了网上的资料说是浏览器升级了,跟selenium的浏览器驱动不一致造成的,解决办法就是:
1)换浏览器版本;
2)换浏览器驱动版本;
第一种感觉不靠谱,后面浏览器自动升级了还得出现这个问题;所以就用第二种,参考网上的说法,去CNPM Binaries Mirror这里下载浏览器对应的驱动,可是我的浏览器是117版本的,这里面根本找不到
要正确解决这个问题,一个好方法是使用WebDriverManager库。它是一个开源的Java库,以完全自动化的方式执行Selenium WebDriver所需的驱动程序的管理(即下载、设置和维护)。其最新版本提供了其他相关功能,如发现本地系统中安装的浏览器的能力,无缝运行Docker容器中的浏览器,以及监控能力,废话不多说,直接上代码。
1、添加maven依赖
在java项目中添加如下依赖(我的是springboot项目):
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>5.5.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
<version>5.2.1</version>
<scope>test</scope>
</dependency>
2、使用
新建一个WebDriverManagerTests测试类
import io.github.bonigarcia.wdm.WebDriverManager;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
/**
* @description:
* @author: ndf
* @create: 2023-10-30 11:29
**/
public class WebDriverManagerTests {
static WebDriver browser;
@BeforeAll
static void setup() {
WebDriverManager.chromedriver().setup();
ChromeOptions options = new ChromeOptions();
options.setHeadless(false);
options.addArguments("start-maximized"); // open Browser in maximized mode
options.addArguments("disable-infobars"); // disabling infobars
options.addArguments("--disable-extensions"); // disabling extensions
options.addArguments("--disable-gpu"); // applicable to Windows os only
options.addArguments("--disable-dev-shm-usage"); // overcome limited resource problems
options.addArguments("--no-sandbox"); // Bypass OS security model
options.addArguments("--disable-in-process-stack-traces");
options.addArguments("--disable-logging");
options.addArguments("--log-level=3");
options.addArguments("--remote-allow-origins=*");
browser = new ChromeDriver(options);
}
@Test
@DisplayName("The google.com web site should have the correct title")
void testProjectWebSiteShouldHaveCorrectTitle() {
browser.get("https://google.com/");
Assertions.assertEquals("Google", browser.getTitle());
}
}
执行上面代码后,setup()方法会尝试查找机器上安装的浏览器版本。然后,使用浏览器版本,它试图通过各种方法找到合适的驱动程序版本。一旦发现驱动程序版本,WebDriverManager会将驱动程序下载到本地缓存(位于~/.cache/selenium/)。在控制台也可看到打印日志:
类似地,我们可以使用以下语句之一来设置Firefox、Edge、Opera、Chromium和Internet Explorer的驱动程序,如下所示 :
WebDriverManager.firefoxdriver().setup();
WebDriverManager.edgedriver().setup();
WebDriverManager.operadriver().setup();
WebDriverManager.chromiumdriver().setup()
WebDriverManager.iedriver().setup();
3、修改驱动路径
修改Python代码,添加executable_path参数,指定浏览器驱动路径
browser = webdriver.Chrome(executable_path=r'C:\Users\Administrator\.cache\selenium\chromedriver\win64\117.0.5938.149\chromedriver.exe',options=chrome_options)
运行程序,OK,大功告成!
注意: 在第2步中,运行java代码下载浏览器驱动这里,可能要爬梯到外网,反正我是开了vpn的!!!