在 Web 自动化测试和爬虫开发中,Selenium 作为一种强大的自动化工具,被广泛用于模拟用户行为、数据抓取等场景。然而,随着网站反爬虫技术的日益增强,直接使用 Selenium 很容易被目标网站识别并阻止。因此,掌握 Selenium 的防爬策略与参数设置变得尤为重要。本文将详细介绍几种常见的 Selenium 防爬方法,并列出关键的防爬参数,同时提供详细的代码案例。
一、Selenium 防爬方法概述
修改 User-Agent
User-Agent 是浏览器向服务器发送请求时携带的一种标识,通过修改它可以使 Selenium 的请求看起来更像是来自真实用户的浏览器。
设置浏览器窗口大小
一些网站会通过检测浏览器窗口大小来判断是否为自动化脚本。设置合理的窗口大小可以使请求更加自然。
禁用图片加载
加载图片会增加请求次数和响应时间,同时也可能暴露自动化脚本的特征。禁用图片加载可以加快请求速度并减少被识别的风险。
使用代理 IP
频繁使用同一 IP 地址进行请求容易被目标网站封禁。使用代理 IP 可以隐藏真实 IP 地址,增加请求的匿名性。
模拟用户行为
通过模拟真实的用户行为(如点击、滚动、等待等)来减少被识别的风险。
增加请求间隔
合理的请求间隔可以减少对目标网站服务器的压力,并降低被识别为爬虫的风险。
二、Selenium 防爬设置
修改 User-Agent
在 Selenium 中,可以通过设置 ChromeOptions 或 FirefoxOptions 来修改 User-Agent。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# Chrome浏览器
chrome_options = Options()
chrome_options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36')
driver = webdriver.Chrome(options=chrome_options)
# Firefox浏览器(类似设置)
# from selenium.webdriver.firefox.options import Options
# firefox_options = Options()
# firefox_options.add_argument('--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36')
# driver = webdriver.Firefox(options=firefox_options)
复制代码
2. 设置浏览器窗口大小
driver.set_window_size(1280, 1024) # 设置浏览器窗口大小为1280x1024
复制代码
3. 禁用图片加载(Chrome 为例)
chrome_prefs = {}
chrome_options.add_experimental_option("prefs", chrome_prefs)
chrome_prefs["profile.default_content_settings.images"] = 2 # 2代表禁用图片
复制代码
注意:Chrome 的最新版本可能不支持通过这种方法直接禁用图片加载,需要寻找其他方法或使用浏览器插件。
4. 使用代理 IP(需额外库支持,如 selenium-wire)
由于 Selenium 本身不直接支持代理设置,可以使用第三方库如 selenium-wire 来实现。
from seleniumwire import webdriver
driver = webdriver.Chrome()
driver.options.add_argument('--proxy-server=http://your-proxy-server:port')
# 注意:selenium-wire的使用方式可能与原生Selenium有所不同,具体请参考其文档
复制代码
5. 模拟用户行为(示例:模拟点击)
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 假设已经定位到一个可点击的元素
element = driver.find_element(By.ID, "clickable-element")
element.click()
# 等待页面加载完成(示例)
wait = WebDriverWait(driver, 10)
wait.until(EC.visibility_of_element_located((By.ID, "some-other-element")))
复制代码
6. 增加请求间隔
增加请求间隔是防止因过于频繁地发送请求而被目标网站识别为爬虫的有效手段。在 Selenium 脚本中,你可以使用 Python 的 time 模块中的 sleep()函数来实现这一点。然而,过度依赖 sleep()可能会导致脚本运行效率低下,因为无论目标网站是否已准备好响应,脚本都会等待指定的时间。
一个更优化的做法是使用 Selenium 的显式等待(Explicit Wait)功能,它允许你等待某个条件成立后再继续执行脚本,而不是简单地等待一段时间。显式等待通过 WebDriverWait 类和一系列预定义的等待条件(如元素可见性、可点击性等)来实现。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
driver = webdriver.Chrome()
driver.get("你的网页URL")
# 使用显式等待等待某个元素可见
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "someElementId"))
)
# 对元素进行操作...
element.click()
except Exception as e:
print(e)
# 在需要的时候使用time.sleep()增加额外的延迟
# 例如,在两次请求之间等待
time.sleep(2) # 等待2秒
# 继续执行其他操作...
# 脚本结束前关闭浏览器
driver.quit()
复制代码
7. 伪装浏览器指纹
浏览器指纹是指浏览器在访问网站时展现的一系列特征,如操作系统、浏览器类型、分辨率、字体列表、插件列表等。这些特征可以被网站用来识别用户或区分爬虫与真实用户。为了伪装浏览器指纹,可以使用一些高级技术,如使用 Selenium WebDriver 的模拟浏览器指纹插件或自行修改 WebDriver 的源代码。
然而,这些方法通常比较复杂且需要较高的技术门槛,且随着网站反爬虫技术的升级,伪装浏览器指纹的有效性也会逐渐降低。
8. 遵守 robots.txt 协议
虽然 Selenium 主要用于自动化测试和爬虫开发,但如果你正在使用 Selenium 来抓取网站数据,那么遵守该网站的 robots.txt 协议是非常重要的。robots.txt 文件是一个文本文件,它告诉搜索引擎哪些页面可以抓取,哪些不可以。虽然 robots.txt 协议主要针对搜索引擎,但遵守它也是对网站所有者权益的尊重,并有助于避免法律纠纷。
9. 监控与调试
在开发 Selenium 脚本时,监控和调试是必不可少的环节。你可以使用 Selenium 的日志功能来记录脚本运行过程中的详细信息,或者使用浏览器的开发者工具来调试页面和脚本。此外,还可以使用一些第三方工具来监控网络请求和响应,以便及时发现和解决问题。
三、Selenium 自动化防爬参数配置
为了避免 Chrome 浏览器在自动化测试时显示被控制的提示,可以通过配置 add_argument 来实现。
1、禁用自动化检测功能:
import time
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
# 禁用浏览器自动化检测功能,使浏览器无法检测到它是被自动化工具控制的。
chrome_options.add_argument("--disable-blink-features=AutomationControlled")
# 启动Chrome浏览器
driver = webdriver.Chrome(options=chrome_options)
#打开网站
driver.get('https://www.baidu.com/')
#等待10秒(非必须,只是为了演示)
time.sleep(10)
# 关闭浏览器
driver.quit()
复制代码
"--disable-blink-features=AutomationControlled" 是一个传递给 Chrome 浏览器的命令行参数,其目的是为了绕过或禁用 Chrome 浏览器内置的一种自动化检测机制。
Chrome 浏览器(及其底层的 Blink 渲染引擎)包含一些用于检测浏览器是否被自动化工具(如 Selenium WebDriver)控制的特性。这些特性可以帮助网站区分真正的用户访问和自动化脚本的访问。当检测到自动化工具时,网站可能会采取一些措施,如限制访问、增加验证码等,来防止自动化脚本的滥用。
"--disable-blink-features=AutomationControlled" 参数的作用就是尝试禁用这种自动化检测特性。通过禁用这个特性,你的 Selenium 自动化脚本可能能够更顺利地模拟用户行为,而不被网站的反爬机制轻易识别出来。
然而,需要注意的是,这种方法的有效性可能会随着 Chrome 浏览器版本的更新而变化。Chrome 浏览器的开发者可能会修复或改进这些特性,以更好地检测和阻止自动化脚本。因此,如果你发现这个参数不再有效,可能需要寻找其他方法或等待 Selenium 的更新来支持新的反检测策略。
2、禁用 Chrome 的自动化扩展:
import time
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
# 禁用Chrome的自动化扩展,这有助于减少被检测到的风险。
chrome_options.add_experimental_option('useAutomationExtension', False)
# 启动Chrome浏览器
driver = webdriver.Chrome(options=chrome_options)
#打开网站
driver.get('https://www.baidu.com/')
#等待10秒(非必须,只是为了演示)
time.sleep(10)
# 关闭浏览器
driver.quit()
复制代码
useAutomationExtension 的作用是尝试禁用或绕过浏览器内部与自动化工具检测相关的某种机制或扩展。通过将 useAutomationExtension 设置为 False,代码试图告诉浏览器不要使用或加载与自动化控制相关的特定扩展或功能。
3、关闭浏览器显示正受到自动化的控制
使用参数之前
使用参数之后
浏览器不再显示正受到自动测试软件的控制
import time
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
# 从Chrome的启动参数中排除enable-automation开关,进一步防止浏览器显示被控制的提示。
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
# 启动Chrome浏览器
driver = webdriver.Chrome(options=chrome_options)
#打开网站
driver.get('https://www.baidu.com/')
#等待10秒(非必须,只是为了演示)
time.sleep(10)
# 关闭浏览器
driver.quit()
复制代码
enable-automation 是 Chrome 的一个内部标志,当 ChromeDriver 启动 Chrome 浏览器时,它通常会被自动启用。这个标志的存在可能会告诉网站或网页上的脚本,浏览器正在被自动化工具控制。一些网站会使用这种检测机制来阻止自动化脚本的执行,或者提供与正常用户不同的体验。
通过 excludeSwitches 选项排除 enable-automation,你试图让浏览器在启动时表现得更加“正常”,即不向网站透露它正在被自动化工具控制。这有助于绕过一些基于 enable-automation 标志存在的自动化检测机制。
然而,需要注意的是,这种方法的有效性可能会随着 Chrome 和 ChromeDriver 的更新而发生变化。浏览器开发者可能会不断改进其自动化检测机制,使得基于排除特定开关的方法来绕过检测变得不再有效。
4、启用无头模式:
import time
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
# 启用无头模式,使Chrome在后台运行,没有可视化窗口。这不仅可以避免被检测,还可以提高测试效率,因为不需要加载和渲染UI界面。
chrome_options.add_argument("--headless")
# 启动Chrome浏览器
driver = webdriver.Chrome(options=chrome_options)
#打开网站
driver.get('https://www.baidu.com/')
#等待10秒(非必须,只是为了演示)
time.sleep(10)
# 关闭浏览器
driver.quit()
复制代码
"--headless" 是一个命令行参数,用于指示浏览器在无头(headless)模式下运行。在无头模式下,浏览器不会显示图形用户界面(GUI),即它不会在屏幕上显示窗口。这意味着浏览器可以在没有物理显示的情况下运行,这对于自动化测试、服务器端渲染、爬虫等场景非常有用,因为它们不需要图形界面来执行任务。
使用 options.add_argument("--headless") 配置浏览器后,当你启动浏览器时,它将在无头模式下运行,执行你指定的任务,但不会显示任何窗口或界面。这对于自动化脚本来说非常有用,因为它可以减少对系统资源的需求(如屏幕和图形处理),并且可以在没有图形界面的服务器或容器中运行。
5、禁用 GPU 加速:
import time
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
# 在某些情况下,特别是Linux系统上,可能需要禁用GPU加速,以确保无头模式能正常工作。
chrome_options.add_argument("--disable-gpu")
# 启动Chrome浏览器
driver = webdriver.Chrome(options=chrome_options)
#打开网站
driver.get('https://www.baidu.com/')
#等待10秒(非必须,只是为了演示)
time.sleep(10)
# 关闭浏览器
driver.quit()
复制代码
"--disable-gpu" 是一个命令行参数,用于指示 Chrome 浏览器在启动时禁用 GPU 加速。GPU 加速是浏览器利用计算机的图形处理单元(GPU)来加速页面渲染和图形密集型任务的过程。然而,在某些情况下,GPU 加速可能会导致问题,如性能下降、崩溃或渲染错误。
通过在 ChromeOptions 中添加"--disable-gpu"参数,你告诉浏览器在启动时不要使用 GPU 加速。这通常用于解决与 GPU 相关的兼容性问题或性能问题,特别是在自动化测试、远程桌面会话、虚拟机或某些特定的硬件配置上。
评论