selenium接管chrome,并增加自定义的参数

一 、 背景

在使用selenium模拟人的操作时候,程序会启动一个进程,会调用一系列的Webdriver 库、API和各个常见的浏览器驱动进程进行交互通信,浏览器驱动进程处理命令,执行相应的操作或返回结果。

但是,有些网站是可以识别出通过Webdriver启动的浏览器。js通过执行window.webdriver.navigator可以判断当前的浏览器是否使用的是webdriver。如果是的,会返回true(见图1), 如果不是,会返回false(见图2)

图1

图2

像有些网站,会采用这种反爬方式来阻挡使用selenium进行访问,会检测到是否存在webdriver以及相关的一些属性,一旦检测到,尽管当前正在执行正常的操作,同样会被拒绝访问。

二 、 selenium接管chrome浏览器

为了越过这种检测webdriver的反爬手段,selenium是可以接管正常的浏览器来执行相关操作,通过window.navigator.webdriver得到的结果就为false,从而不会被网站检测出来。

既然我们道了解决方案,接下来我们顺腾摸瓜,思考如何接管?

计算机上打开每个浏览器,都会创建相应的进程,占用一个端口号。Chrome开发者工具提供了很多参数来对浏览器自定义化,包括指定调试的端口

--remote-debugging-port

通过命令行启动一个浏览器,并指定调试使用的端口号(启动后先不要关)

.\chrome.exe --remote-debugging-port=9222 --user-data-dir="D:\no\test"

会打开一个浏览器,如下:

image-20211101180710928

接下来,简单写一个脚本,尝试使用selenium接管端口号为9222的Chrome浏览器进程。

1
2
3
4
5
6
7
from selenium import webdriver

chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("debuggerAddress", '127.0.0.1:9222')
driver = webdriver.Chrome(executable_path=r'D:\bug666\chromedriver.exe', chrome_options=chrome_options)
driver.get('https://hexo-syz247179876.vercel.app/')
print(driver.title)

打印结果为:云中小站

浏览器如下:

image-20211101180753956

由此可以看到,页面跳转。控制台打印一下window.navigator.webdriver,为false。至此,selenium成功接管chrome浏览器。之后仍然可以像操作webdriver一样,操作被接管的浏览器。

image-20211101180844781