【爬虫】针对FingerprintJS反爬,selenium破解策略

目录

FingerprintJS 原理概述

Selenium 基础与应对思路

代码实现

实战(结合Selenium 和 Undetected Chromedriver绕过FingerprintJS)

Canvas指纹随机化


FingerprintJS 原理概述

FingerprintJS 主要通过收集浏览器的各种特征信息来生成独一无二的指纹,这些信息包括但不限于:

  1. 浏览器版本信息:不同浏览器版本在处理网页元素、执行 JavaScript 等方面可能存在细微差异,这些差异成为指纹的一部分。
  2. 操作系统信息:操作系统的类型、版本等会影响浏览器的行为和一些底层功能的表现,例如字体渲染、系统默认设置等。
  3. 屏幕分辨率与颜色深度:独特的屏幕显示设置可以帮助识别特定的设备或浏览器环境。
  4. 浏览器插件列表:安装的各种插件及其版本,每个插件都可能对浏览器的功能和网络请求产生影响。
  5. 时区设置:反映了用户所在的地理位置信息。
  6. 语言设置:浏览器所使用的语言偏好。

通过综合这些多维度的信息,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)

你可能感兴趣的:(项目管理,爬虫,爬虫,selenium,测试工具)