目录
FingerprintJS 原理概述
Selenium 基础与应对思路
代码实现
实战(结合Selenium 和 Undetected Chromedriver绕过FingerprintJS)
Canvas指纹随机化
FingerprintJS 原理概述
FingerprintJS 主要通过收集浏览器的各种特征信息来生成独一无二的指纹,这些信息包括但不限于:
- 浏览器版本信息:不同浏览器版本在处理网页元素、执行 JavaScript 等方面可能存在细微差异,这些差异成为指纹的一部分。
- 操作系统信息:操作系统的类型、版本等会影响浏览器的行为和一些底层功能的表现,例如字体渲染、系统默认设置等。
- 屏幕分辨率与颜色深度:独特的屏幕显示设置可以帮助识别特定的设备或浏览器环境。
- 浏览器插件列表:安装的各种插件及其版本,每个插件都可能对浏览器的功能和网络请求产生影响。
- 时区设置:反映了用户所在的地理位置信息。
- 语言设置:浏览器所使用的语言偏好。
通过综合这些多维度的信息,FingerprintJS 能够生成一个高度独特的指纹,用于识别和跟踪用户(或爬虫)的身份,即使在使用代理、清除 cookie 等常规反追踪手段的情况下,仍然能够准确地识别出同一来源的访问。
Selenium 基础与应对思路
Selenium 是一个强大的自动化测试工具,它可以模拟用户在浏览器中的各种操作,如点击、输入、浏览页面等。在应对 FingerprintJS 反爬时,我们的核心思路是利用 Selenium 来操控浏览器,对浏览器的指纹相关信息进行伪装或干扰,使网站无法准确识别出我们的爬虫身份。
代码实现
去除webdriver特征
from selenium.webdriver import ChromeOptions from selenium import webdriver option = ChromeOptions() option.add_experimental_option('excludeSwitches', ['enable-automation']) option.add_argument('--disable-blink-features=AutomationControlled') driver = webdriver.Chrome(options=option)driver.get("https://www.example.com")
使用Undetected_chromedriver
import undetected_chromedriver as uc driver = uc.Chrome(use_subprocess=True) driver.get("https://www.example.com")
实战(结合Selenium 和 Undetected Chromedriver绕过FingerprintJS)
import undetected_chromedriver as uc from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def fetch_website_data(url): # 初始化Undetected Chromedriver driver = uc.Chrome(use_subprocess=True) try: # 打开网页 driver.get(url) # 等待页面加载完成(可选,根据实际情况调整) WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "some-element-id")) ) # 假设我们需要抓取某个元素的文本内容 element = driver.find_element(By.ID, "some-element-id") data = element.text print(data) finally: # 关闭浏览器 driver.quit() # 调用函数 fetch_website_data("https://www.example.com")
Canvas指纹随机化
# 在Selenium中注入JavaScript代码 canvas_randomizer_script = """ var oldDrawImage = CanvasRenderingContext2D.prototype.drawImage; CanvasRenderingContext2D.prototype.drawImage = function(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight) { // 在这里添加一些随机化逻辑,比如随机修改图像的颜色或像素// 注意:这只是一个示例,实际实现需要详细分析Canvas的使用情况 // 调用原始的drawImage方法 oldDrawImage.apply(this, arguments); }; """ driver.execute_script(canvas_randomizer_script)