防止Selenium被检测

很多网站或者防火墙针对Selenium进行了检测,对程序控制的浏览器不予响应,导致我们的网页自动化无法运行。

可以通过这个网站进行检测 https://bot.sannysoft.com/


原因是webdriver有一些特征是完全可能被服务器端或防火墙检测到的。
传统的应对方法基本都失效了,比如stealth.js,cdp command等等。

undetected_chromedriver

undetected_chromedriver可以通过检测,但是如果你的程序大都是webdriver写的,迁移到undetected_chromedriver也是不小的工作量。

1
2
3
4
import undetected_chromedriver as uc
import time
driver = uc.Chrome()
driver.get('https://bot.sannysoft.com/')

试试webdriver驱动firefox

顺利通过检测,为了避免以后firefox自动升级而driver不能适配,最好把firefox打包成portable版的。
以前webdriver编写的大部分代码不需要更改。

1
2
3
4
5
6
7
from selenium import webdriver
from selenium.webdriver.firefox.service import Service
option = webdriver.FirefoxOptions()
option.binary_location = '.\FirefoxPortable\App\Firefox64\Firefox.exe'
driverService = Service('.\FirefoxPortable\geckodriver.exe')
browser = webdriver.Firefox(options=option,service=driverService)
browser.get('https://bot.sannysoft.com/')

国产drissionpage,摆脱了对selenium的依赖,经测试顺利通过检测。

用 requests 做数据采集面对要登录的网站时,要分析数据包、JS 源码,构造复杂的请求,往往还要应付验证码、JS 混淆、签名参数等反爬手段,门槛较高,开发效率不高。 使用浏览器,可以很大程度上绕过这些坑,但浏览器运行效率不高。
因此,这个库设计初衷,是将它们合而为一,同时实现“写得快”和“跑得快”。能够在不同须要时切换相应模式,并提供一种人性化的使用方法,提高开发和运行效率。
除了合并两者,本库还以网页为单位封装了常用功能,提供非常简便的操作和语句,使用户可减少考虑细节,专注功能实现。 以简单的方式实现强大的功能,使代码更优雅。
以前的版本是对 selenium 进行重新封装实现的。从 3.0 开始,作者另起炉灶,对底层进行了重新开发,摆脱对 selenium 的依赖,增强了功能,提升了运行效率。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from DrissionPage import ChromiumPage

# 用 d 模式创建页面对象(默认模式)
page = ChromiumPage()
# 跳转到登录页面
page.get('https://gitee.com/login')

# 定位到账号文本框并输入账号
page.ele('#user_login').input('您的账号')
# 定位到密码文本框并输入密码
page.ele('#user_password').input('您的密码')

# 点击登录按钮
page.ele('@value=登 录').click()