在Web自动化测试和爬虫开发中,Selenium作为一种强大的自动化工具,被广泛用于模拟用户行为、数据抓取等场景。然而,随着网站反爬虫技术的日益增强,直接使用Selenium很容易被目标网站识别并阻止。因此,掌握Selenium的防爬策略与参数设置变得尤为重要。本文将详细介绍几种常见的Selenium防爬方法,并列出关键的防爬参数,同时提供详细的代码案例。
关于Selenium防止被检测到实战可以参考这几篇文章:
selenium实战指南:如何防止被浏览器检测?_selenium防止被检测-CSDN博客
Selenium自动化爬取BOSS招聘数据:一个完整的指南(实测有效)_selenium爬取并存储boss网站招聘数据过程-CSDN博客
Selenium实战:深度解析Python中嵌套Frame与iFrame的定位与切换技巧,解决Selenium定位不到的问题-CSDN博客
User-Agent是浏览器向服务器发送请求时携带的一种标识,通过修改它可以使Selenium的请求看起来更像是来自真实用户的浏览器。
一些网站会通过检测浏览器窗口大小来判断是否为自动化脚本。设置合理的窗口大小可以使请求更加自然。
加载图片会增加请求次数和响应时间,同时也可能暴露自动化脚本的特征。禁用图片加载可以加快请求速度并减少被识别的风险。
频繁使用同一IP地址进行请求容易被目标网站封禁。使用代理IP可以隐藏真实IP地址,增加请求的匿名性。
通过模拟真实的用户行为(如点击、滚动、等待等)来减少被识别的风险。
合理的请求间隔可以减少对目标网站服务器的压力,并降低被识别为爬虫的风险。
在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)
driver.set_window_size(1280, 1024) # 设置浏览器窗口大小为1280x1024
chrome_prefs = {}
chrome_options.add_experimental_option("prefs", chrome_prefs)
chrome_prefs["profile.default_content_settings.images"] = 2 # 2代表禁用图片
注意:Chrome的最新版本可能不支持通过这种方法直接禁用图片加载,需要寻找其他方法或使用浏览器插件。
由于Selenium本身不直接支持代理设置,可以使用第三方库如selenium-wire来实现。
from seleniumwire import webdriver
driver = webdriver.Chrome()
driver.options.add_argument('--proxy-server=http://your-proxy-server:port')
# 注意:selenium-wire的使用方式可能与原生Selenium有所不同,具体请参考其文档
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")))
增加请求间隔是防止因过于频繁地发送请求而被目标网站识别为爬虫的有效手段。在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()
浏览器指纹是指浏览器在访问网站时展现的一系列特征,如操作系统、浏览器类型、分辨率、字体列表、插件列表等。这些特征可以被网站用来识别用户或区分爬虫与真实用户。为了伪装浏览器指纹,可以使用一些高级技术,如使用Selenium WebDriver的模拟浏览器指纹插件或自行修改WebDriver的源代码。
然而,这些方法通常比较复杂且需要较高的技术门槛,且随着网站反爬虫技术的升级,伪装浏览器指纹的有效性也会逐渐降低。
虽然Selenium主要用于自动化测试和爬虫开发,但如果你正在使用Selenium来抓取网站数据,那么遵守该网站的robots.txt
协议是非常重要的。robots.txt
文件是一个文本文件,它告诉搜索引擎哪些页面可以抓取,哪些不可以。虽然robots.txt
协议主要针对搜索引擎,但遵守它也是对网站所有者权益的尊重,并有助于避免法律纠纷。
在开发Selenium脚本时,监控和调试是必不可少的环节。你可以使用Selenium的日志功能来记录脚本运行过程中的详细信息,或者使用浏览器的开发者工具来调试页面和脚本。此外,还可以使用一些第三方工具来监控网络请求和响应,以便及时发现和解决问题。
为了避免Chrome浏览器在自动化测试时显示被控制的提示,可以通过配置add_argument来实现。
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的更新来支持新的反检测策略。
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
,代码试图告诉浏览器不要使用或加载与自动化控制相关的特定扩展或功能。
使用参数之前
使用参数之后
浏览器不再显示正受到自动测试软件的控制
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的更新而发生变化。浏览器开发者可能会不断改进其自动化检测机制,使得基于排除特定开关的方法来绕过检测变得不再有效。
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")
配置浏览器后,当你启动浏览器时,它将在无头模式下运行,执行你指定的任务,但不会显示任何窗口或界面。这对于自动化脚本来说非常有用,因为它可以减少对系统资源的需求(如屏幕和图形处理),并且可以在没有图形界面的服务器或容器中运行。
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相关的兼容性问题或性能问题,特别是在自动化测试、远程桌面会话、虚拟机或某些特定的硬件配置上。
通过这篇文章给大家分享我在学习过程中的一些经验和心得,希望能够对大家有所帮助,同时也接受大家的建议和意见,共同进步、共同学习。
如果你觉得我的文章对你有所帮助,我诚挚地邀请你关注、点赞和分享。