爬虫反爬:CSS位置偏移反爬案例分析与实战案例

news2025/2/28 5:17:56

文章目录

    • 1. 反爬机制概述
    • 2. 反爬原理
    • 3. 案例分析
    • 4. 破解思路
    • 5. 实战样例
      • 样例1:使用Python和Selenium破解CSS位置偏移反爬
      • 样例2:电商网站商品列表CSS位置偏移反爬破解
    • 6. 总结

1. 反爬机制概述

CSS位置偏移反爬是一种常见的反爬虫技术,通过CSS样式将网页内容的位置进行偏移,使得爬虫难以直接获取正确的文本内容。这种技术通常用于保护网页上的敏感信息或防止自动化工具抓取数据。

2. 反爬原理

CSS偏移:指网站通过JavaScript动态修改页面元素的style属性,如top、left、margin、padding等,使元素在页面上的位置不断变化。这种动态变化使得基于固定定位的爬虫难以准确抓取目标数据。

伪元素:使用::before和::after伪元素插入额外的字符或内容,干扰爬虫的解析。

字体加密:结合自定义字体,使得字符的显示与实际编码不一致,增加解析难度。

反爬原理:

  • 动态渲染:网站使用JavaScript在客户端动态渲染页面,元素的最终位置只有在页面加载完成后才能确定。
  • ​​随机偏移:元素的位置可能每次加载时都有所不同,增加了定位难度。
  • ​​防爬检测:网站可能通过检测浏览器行为(如鼠标移动、点击等)来判断是否为爬虫,结合CSS位置偏移进一步增强防护。

3. 案例分析

假设有一个网页,其HTML结构如下:

<div class="content">
  <span style="position: absolute; left: 10px;">H</span>
  <span style="position: absolute; left: 30px;">e</span>
  <span style="position: absolute; left: 50px;">l</span>
  <span style="position: absolute; left: 70px;">l</span>
  <span style="position: absolute; left: 90px;">o</span>
</div>

运行 HTML
在这个例子中,每个字符都被绝对定位到不同的位置,爬虫如果直接获取文本内容,可能会得到乱序的字符。

4. 破解思路

解析CSS样式:通过解析每个字符的position、left、top等属性,重新排列字符顺序。

模拟浏览器渲染:使用无头浏览器(如Puppeteer、Selenium)加载页面,获取渲染后的文本内容。

字体解密:如果使用了自定义字体,需要解析字体文件,将字符映射到正确的编码。

有些网站会通过AJAX动态加载内容,导致部分数据在初始HTML中不可见。此时,可以通过模拟滚动、点击加载更多按钮等方式,确保所有数据加载完毕。

此外也要注意采取以下策略:

  • 使用无头浏览器:如Selenium、Playwright,模拟真实用户行为,处理动态渲染页面。
  • ​​随机化操作:模拟人类操作,如随机等待时间、随机点击位置,避免被检测为爬虫。
  • ​​IP代理池:使用多个IP地址轮换请求,减少单个IP的请求频率。
  • ​​数据校验:通过多维度数据校验,确保抓取的数据准确性和完整性。

5. 实战样例

样例1:使用Python和Selenium破解CSS位置偏移反爬

以下是一个使用Python和Selenium破解CSS位置偏移反爬的样例:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options

# 配置Chrome选项
chrome_options = Options()
chrome_options.add_argument('--headless')  # 无头模式
chrome_options.add_argument('--disable-gpu')

# 设置ChromeDriver路径
service = Service('/path/to/chromedriver')

# 启动浏览器
driver = webdriver.Chrome(service=service, options=chrome_options)

# 打开目标网页
driver.get('https://example.com')

# 获取所有字符元素
char_elements = driver.find_elements(By.CSS_SELECTOR, '.content span')

# 按left属性排序
sorted_chars = sorted(char_elements, key=lambda x: int(x.value_of_css_property('left').replace('px', '')))

# 提取并拼接字符
text = ''.join([char.text for char in sorted_chars])

print(f"解析后的文本内容: {text}")

# 关闭浏览器
driver.quit()

样例2:电商网站商品列表CSS位置偏移反爬破解

假设有一个电商网站,商品列表页通过CSS位置偏移来展示商品信息,每次刷新页面时,商品的位置会有所不同。我们的目标是抓取每个商品的名称和价格。技术栈有

  • 编程语言:Python
  • 爬虫框架:Selenium(用于模拟浏览器行为)
  • 解析库:BeautifulSoup(用于解析HTML)
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import time

# 配置Chrome选项
chrome_options = Options()
chrome_options.add_argument("--headless")  # 无头模式
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--no-sandbox")

# 配置WebDriver路径
service = Service('/path/to/chromedriver')
driver = webdriver.Chrome(service=service, options=chrome_options)

# 目标URL
url = 'https://example.com/products'

try:
    driver.get(url)
    time.sleep(3)  # 等待页面加载

    # 模拟滚动,确保所有商品加载
    last_height = driver.execute_script("return document.body.scrollHeight")
    while True:
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(2)
        new_height = driver.execute_script("return document.body.scrollHeight")
        if new_height == last_height:
            break
        last_height = new_height

    # 获取页面源代码
    html = driver.page_source
    soup = BeautifulSoup(html, 'html.parser')

    # 解析商品信息
    products = soup.find_all('div', class_='product-item')
    for product in products:
        name = product.find('span', class_='product-name').get_text(strip=True)
        price = product.find('span', class_='product-price').get_text(strip=True)
        print(f'商品名称: {name}, 价格: {price}')

finally:
    driver.quit()

由于商品位置动态变化,直接通过固定定位(如XPath或CSS选择器)可能无法准确定位。可以采取以下策略:

  • ​元素属性识别:通过元素的唯一属性(如ID、特定的class、文本内容)进行定位,而不是依赖位置。
  • ​​相对定位:先定位一个稳定的父元素,再通过相对位置查找子元素。
  • ​​动态等待:使用Selenium的显式等待(WebDriverWait)等待特定元素出现,而不是固定等待时间。

示例优化:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 等待商品列表加载完成
wait = WebDriverWait(driver, 10)
products = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'product-item')))

for product in products:
    name = product.find_element(By.CLASS_NAME, 'product-name').text
    price = product.find_element(By.CLASS_NAME, 'product-price').text
    print(f'商品名称: {name}, 价格: {price}')

6. 总结

CSS位置偏移反爬技术通过改变字符的显示位置来干扰爬虫的解析,但通过解析CSS样式或使用无头浏览器模拟渲染,可以有效破解这种反爬机制。在实际应用中,还需要结合其他反爬技术(如字体加密、动态加载等)进行综合处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2307202.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

向量数据库milvus部署

官方文档 Milvus vector database documentationRun Milvus in Docker (Linux) | Milvus DocumentationMilvus vector database documentation 按部署比较简单&#xff0c;这里说一下遇到的问题 一&#xff1a;Docker Compose 方式部署 1、镜像无法拉取,(docker.io被禁) …

修改`FSL Yocto Project Community BSP`用到的u-boot源码,使其能适配百问网(100ask)的开发板

前言 在博文 https://blog.csdn.net/wenhao_ir/article/details/145547974 中,我们利用官方提供的BSP(FSL Yocto Project Community BSP)构建了写到SD卡中的完整镜像,然后启动后发现存在不少问题,首要的问题就是u-boot不能识别网卡,在这篇博文中,我们就找到FSL Yocto Pro…

(python)Arrow库使时间处理变得更简单

前言 Arrow库并不是简单的二次开发,而是在datetime的基础上进行了扩展和增强。它通过提供更简洁的API、强大的时区支持、丰富的格式化和解析功能以及人性化的显示,填补了datetime在某些功能上的空白。如果你需要更高效、更人性化的日期时间处理方式,Arrow库是一个不错的选择…

【亲测有效】百度Ueditor富文本编辑器添加插入视频、视频不显示、和插入视频后二次编辑视频标签不显示,显示成img标签,二次保存视频被替换问题,解决方案

【亲测有效】项目使用百度Ueditor富文本编辑器上传视频相关操作问题 1.百度Ueditor富文本编辑器添加插入视频、视频不显示 2.百度Ueditor富文本编辑器插入视频后二次编辑视频标签不显示&#xff0c;在编辑器内显示成img标签&#xff0c;二次保存视频被替换问题 问题1&#xff1…

二、IDE集成DeepSeek保姆级教学(使用篇)

各位看官老爷好&#xff0c;如果还没有安装DeepSeek请查阅前一篇 一、IDE集成DeepSeek保姆级教学(安装篇) 一、DeepSeek在CodeGPT中使用教学 1.1、Edit Code 编辑代码 选中代码片段 —> 右键 —> CodeGPT —> Edit Code, 输入自然语言可编辑代码&#xff0c;点击S…

四、Redis主从复制与读写分离

一、环境搭建 准备环境 IP角色192.168.10.101Master192.168.10.102Slave192.168.10.103Slave 创建配置/数据/日志目录 # 创建配置目录 mkdir -p /usr/local/redis/conf # 创建数据目录 mkdir -p /usr/local/redis/data # 创建日志目录 mkdir -p /usr/local/redis/log修改配置…

数据如何安全“过桥”?分类分级与风险评估,守护数据流通安全

信息化高速发展&#xff0c;数据已成为企业的核心资产&#xff0c;驱动着业务决策、创新与市场竞争力。随着数据开发利用不断深入&#xff0c;常态化的数据流通不仅促进了信息的快速传递与共享&#xff0c;还能帮助企业快速响应市场变化&#xff0c;把握商业机遇&#xff0c;实…

Apache DolphinScheduler系列1-单节点部署及测试报告

文章目录 整体说明一、部署环境二、版本号三、部署方案四、部署步骤4.1、上传部署包4.2、创建外部数据库4.3、修改元数据库配置4.4、上传MySQLl驱动程序4.5、初始化外部数据库4.6、启停服务4.7、访问页面五、常见问题及解决方式5.1、时间不一致5.2、异常终止5.3、大量日志5.4、…

Java+SpringBoot+Vue+数据可视化的音乐推荐与可视化平台(程序+论文+讲解+安装+调试+售后)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 在互联网技术以日新月异之势迅猛发展的浪潮下&#xff0c;5G 通信技术的普及、云计算能力…

LVS+Keepalived 高可用集群搭建

一、高可用集群&#xff1a; 1.什么是高可用集群&#xff1a; 高可用集群&#xff08;High Availability Cluster&#xff09;是以减少服务中断时间为目地的服务器集群技术它通过保护用户的业务程序对外不间断提供的服务&#xff0c;把因软件、硬件、人为造成的故障对业务的影响…

PydanticToolsParser 工具(tool call)把 LLM 生成的文本转成结构化的数据(Pydantic 模型)过程中遇到的坑

PydanticToolsParser 的作用 PydanticToolsParser 是一个工具&#xff0c;主要作用是 把 LLM 生成的文本转成结构化的数据&#xff08;Pydantic 模型&#xff09;&#xff0c;让代码更容易使用这些数据进行自动化处理。 换句话说&#xff0c;AI 生成的文本通常是自然语言&…

python-leetcode-乘积最大子数组

152. 乘积最大子数组 - 力扣&#xff08;LeetCode&#xff09; class Solution:def maxProduct(self, nums: List[int]) -> int:if not nums:return 0max_prod nums[0]min_prod nums[0]result nums[0]for i in range(1, len(nums)):if nums[i] < 0:max_prod, min_prod…

江协科技/江科大-51单片机入门教程——P[1-1] 课程简介P[1-2] 开发工具介绍及软件安装

本教程也力求在玩好单片机的同时了解一些计算机的基本概念&#xff0c;了解电脑的一些基本操作&#xff0c;了解电路及其元器件的基本理论&#xff0c;为我们学习更高级的单片机&#xff0c;入门IT和信息技术行业&#xff0c;打下一定的基础。 目录 1.课程简介 2.开发工具及…

简单介绍JVM

1.什么是JVM&#xff1f; JVM就是Java虚拟机【Java Virtual Machine】&#xff0c;简称JVM。主要部分包括类加载子系统&#xff0c;运行时数据区&#xff0c;执行引擎&#xff0c;本地方法库等&#xff0c;接下来我们一一介绍 2.类加载子系统 JVM中运行的就是我们日常写的JA…

【对话推荐系统】Towards Topic-Guided Conversational Recommender System 论文阅读

Towards Topic-Guided Conversational Recommender System 论文阅读 Abstract1 Introduction2 Related Work2.1 Conversation System2.2 Conversational Recommender System2.3 Dataset for Conversational Recommendation 3 Dataset Construction3.1 Collecting Movies for Re…

当下弹幕互动游戏源码开发教程及功能逻辑分析

当下很多游戏开发者或者想学习游戏开发的人&#xff0c;想要了解如何制作弹幕互动游戏&#xff0c;比如直播平台上常见的那种&#xff0c;观众通过发送弹幕来影响游戏进程。需要涵盖教程的步骤和功能逻辑的分析。 首先&#xff0c;弹幕互动游戏源码开发教程部分应该分步骤&…

STM32——HAL库开发笔记21(定时器2—输出比较)(参考来源:b站铁头山羊)

本文主要讲述输出比较及PWM信号相关知识。 一、概念 所谓输出比较&#xff0c;就是通过单片机的定时器向外输出精确定时的方波信号。 1.1 PWM信号 PWM信号即脉冲宽度调制信号。PWM信号的占空比 &#xff08;高电压 所占周期 / 整个周期&#xff09; * 100% 。所以PWM信号…

YOLOv12 ——基于卷积神经网络的快速推理速度与注意力机制带来的增强性能结合

概述 实时目标检测对于许多实际应用来说已经变得至关重要&#xff0c;而Ultralytics公司开发的YOLO&#xff08;You Only Look Once&#xff0c;只看一次&#xff09;系列一直是最先进的模型系列&#xff0c;在速度和准确性之间提供了稳健的平衡。注意力机制的低效阻碍了它们在…

动态内容加载的解决方案:Selenium与Playwright对比故障排查实录

方案进程 2024-09-01 09:00 | 接到亚航航班数据采集需求 2024-09-01 11:30 | 首次尝试使用Selenium遭遇Cloudflare验证 2024-09-01 14:00 | 切换Playwright方案仍触发反爬机制 2024-09-01 16:30 | 引入爬虫代理IPUA轮换策略 2024-09-02 10:00 | 双方案完整实现并通过压力测试故…

NLP学习记录十:多头注意力

一、单头注意力 单头注意力的大致流程如下&#xff1a; ① 查询编码向量、键编码向量和值编码向量分别经过自己的全连接层&#xff08;Wq、Wk、Wv&#xff09;后得到查询Q、键K和值V&#xff1b; ② 查询Q和键K经过注意力评分函数&#xff08;如&#xff1a;缩放点积运算&am…