当前位置: 首页 > news >正文

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

文章目录

    • 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:breaklast_height = new_height# 获取页面源代码html = driver.page_sourcesoup = 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').textprice = product.find_element(By.CLASS_NAME, 'product-price').textprint(f'商品名称: {name}, 价格: {price}')

6. 总结

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

相关文章:

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

文章目录 1. 反爬机制概述2. 反爬原理3. 案例分析4. 破解思路5. 实战样例样例1&#xff1a;使用Python和Selenium破解CSS位置偏移反爬样例2&#xff1a;电商网站商品列表CSS位置偏移反爬破解 6. 总结 1. 反爬机制概述 CSS位置偏移反爬是一种常见的反爬虫技术&#xff0c;通过C…...

Ubuntu20.04安装Redis

目录 切换到root用户 使用 apt install redis 安装redis 修改配置文件 ​编辑 重新启动服务器 使用Redis客户端连接服务器 切换到root用户 如果没有切换到root用户的&#xff0c;切换到root用户。 使用 apt install redis 安装redis 遇到y/n直接y即可。 redis安装好之…...

Ubuntu 22.04 安装Nvidia驱动加速deepseek

一键安装22.04 nvidia 驱动 nvidia 官网下载驱动我的环境是NVIDIA RTX A5000nvidia 文档参考没有安装驱动之前确认自己的型号 lspci | grep -i vga &#xff08;如数字2231&#xff09; 参考docker 支持nvidia &#xff0c;注释了需要的取消注释即可 42行-92行一定要重启服务器…...

OkHttp、Retrofit、RxJava:一文讲清楚

一、okHttp的同步和异步请求 Call 是 OkHttp 的核心接口&#xff0c;代表一个已准备好执行的 HTTP 请求。它支持 同步 和 异步 两种模式&#xff1a; enqueue——>okHttp异步 OkHttpClient client new OkHttpClient();Request request new Request.Builder().url("…...

星环科技推出DeepSeek全场景解决方案:即开即用、企业级部署、端侧智能三位一体

星环科技&#xff08;688031.SH&#xff09;正式发布DeepSeek全场景解决方案&#xff0c;全面覆盖个人用户、企业客户及行业场景需求&#xff0c;为用户提供从个人到企业、从云端到本地的全方位AI应用支持&#xff0c;为不同需求的用户提供了灵活、高效且安全的AI解决方案。 省…...

Redis缓存一致性难题:如何让数据库和缓存不“打架”?

标题&#xff1a;Redis缓存一致性难题&#xff1a;如何让数据库和缓存不“打架”&#xff1f;&#xff08;附程序员脱发指南&#xff09; 导言&#xff1a;当数据库和缓存成了“异地恋” 想象一下&#xff1a;你刚在美团下单了一份麻辣小龙虾&#xff0c;付款后刷新页面&#…...

动态部署Web应用程序与web.xml配置详解

文章目录 前言一、动态部署Web应用程序1.1 什么是动态部署&#xff1f;1.2 动态部署的步骤1.3 动态部署的优势 二、web.xml 配置文件2.1 什么是web.xml&#xff1f;2.2 web.xml 文件的结构2.2.1常见配置&#xff08;1&#xff09; 配置上下文参数(2) 配置Servlet(3)配置过滤器(…...

2025年软考报名费用是多少?全国费用汇总!

软考报名时间终于确定了&#xff01;想要参加2025年软考的同学们注意啦&#xff01;特别是那些一年只有一次考试机会的科目&#xff0c;千万不要错过哦&#xff01;这里为大家整理了各地的报名时间、科目、费用等信息&#xff0c;快来看看吧&#xff01; 一、2025年软考时间安…...

DeepSeek 15天指导手册——从入门到精通 PDF(附下载)

DeepSeek使用教程系列--DeepSeek 15天指导手册——从入门到精通pdf下载&#xff1a; https://pan.baidu.com/s/1PrIo0Xo0h5s6Plcc_smS8w?pwd1234 提取码: 1234 或 https://pan.quark.cn/s/2e8de75027d3 《DeepSeek 15天指导手册——从入门到精通》以系统化学习路径为核心&…...

【Javascript】js精度丢失

当JS处理大整数或者浮点数的时候会出现精度丢失的情况。 Javascript的数字都使用双精度浮点数表示&#xff0c;遵循IEEE754标准 比如我遇到的问题&#xff0c;对一个小数的四舍五入&#xff0c;保留2位小数&#xff1a; 235.985≈235.98 235.9851≈235.99 原理请大家参考百度&…...

让Word插上AI的翅膀:如何把DeepSeek装进Word

在日常办公中&#xff0c;微软的Word无疑是我们最常用的文字处理工具。无论是撰写报告、编辑文档&#xff0c;还是整理笔记&#xff0c;Word都能胜任。然而&#xff0c;随着AI技术的飞速发展&#xff0c;尤其是DeepSeek的出现&#xff0c;我们的文字编辑方式正在发生革命性的变…...

秒杀系统的常用架构是什么?怎么设计?

架构 秒杀系统需要单独部署&#xff0c;如果说放在订单服务里面&#xff0c;秒杀的系统压力太大了就会影响正常的用户下单。 常用架构&#xff1a; Redis 数据倾斜问题 第一步扣减库存时 假设现在有 10 个商品需要秒杀&#xff0c;正常情况下&#xff0c;这 10 个商品应该均…...

【文件基础操作】小笔记

Step1: 现在项目文件夹&#xff08;我的项目叫做RunPony&#xff09;下创建一个a.txt文本文件&#xff0c;手动写入一些数字&#xff0c;保存 Step2: 现在在main.c内写一个基本的文件处理的程序 Step3: 现在已经知道如何打开关闭文件&#xff0c;下一步要搞懂如何读取txt内的…...

RabbitMQ系列(七)基本概念之Channel

RabbitMQ 中的 Channel&#xff08;信道&#xff09; 是客户端与 RabbitMQ 服务器通信的虚拟会话通道&#xff0c;其核心作用在于优化资源利用并提升消息处理效率。以下是其核心机制与功能的详细解析&#xff1a; 一、Channel 的核心定义 虚拟通信链路 Channel 是建立在 TCP 连…...

本地搭建Koodo Reader书库结合内网穿透打造属于自己的移动图书馆

文章目录 前言1. Koodo Reader 功能特点1.1 开源免费1.2 支持众多格式1.3 多平台兼容1.4 多端数据备份同步1.5 多功能阅读体验1.6 界面简洁直观 2. Koodo Reader安装流程2.1 安装Git2.2 安装Node.js2.3 下载koodo reader 3. 安装Cpolar内网穿透3.1 配置公网地址3.2 配置固定公网…...

DeepSeek R1 训练策略4个阶段解析

DeepSeek R1 训练策略解析 DeepSeek R1 训练策略解析1. 冷启动监督微调&#xff08;Cold Start SFT&#xff09;**该阶段的主要目标**&#xff1a; 2. 面向推理的强化学习&#xff08;RL for Reasoning&#xff09;**该阶段的主要目标**&#xff1a; 3. 拒绝采样和监督微调&…...

【博资考4】网安学院-硕转博考试内容

【博资考4】硕转博考试内容 - 网络安全与基础理论 写在最前面一. **21年硕转博面试内容回顾**网络、逆向、操作系统、攻防、漏洞1. **网络安全常见攻击方式及其防范措施**1.1 **DDoS攻击&#xff08;分布式拒绝服务&#xff09;**1.2 **SQL注入攻击**1.3 **XSS攻击&#xff08;…...

30 分钟从零开始入门 CSS

HTML CSS JS 30分钟从零开始入门拿下 HTML_html教程-CSDN博客 30 分钟从零开始入门 CSS-CSDN博客 JavaScript 指南&#xff1a;从入门到实战开发-CSDN博客 前言 最近也是在复习&#xff0c;把之前没写的博客补起来&#xff0c;之前给大家介绍了 html&#xff0c;现在是 CSS 咯…...

C语言综合案例:学生成绩管理系统

C语言综合案例&#xff1a;学生成绩管理系统 需求 1.存储最多50名学生的信息&#xff08;不使用结构体&#xff09; 2.每个学生包含&#xff1a; 学号&#xff08;字符数组&#xff09;姓名&#xff08;字符数组&#xff09;3门课程成绩&#xff08;一维数组&#xff09; …...

使用python做http代理请求

有这样一个需求现在有两台A&#xff0c;B两台电脑组成了一个局域网&#xff0c;在A电脑上开发webjava应用&#xff0c;需要调用第三方接口做http请求&#xff0c;但是这个请求只能在B电脑上请求。 一种解决方案&#xff1a;自定义一个中间服务&#xff0c;在电脑B上运行一个简…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景

Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知&#xff0c;帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量&#xff0c;能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度&#xff0c;还为机器人、医疗设备和制造业的智…...

小木的算法日记-多叉树的递归/层序遍历

&#x1f332; 从二叉树到森林&#xff1a;一文彻底搞懂多叉树遍历的艺术 &#x1f680; 引言 你好&#xff0c;未来的算法大神&#xff01; 在数据结构的世界里&#xff0c;“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的&#xff0c;它…...

边缘计算网关提升水产养殖尾水处理的远程运维效率

一、项目背景 随着水产养殖行业的快速发展&#xff0c;养殖尾水的处理成为了一个亟待解决的环保问题。传统的尾水处理方式不仅效率低下&#xff0c;而且难以实现精准监控和管理。为了提升尾水处理的效果和效率&#xff0c;同时降低人力成本&#xff0c;某大型水产养殖企业决定…...