爬虫反爬: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:使用Python和Selenium破解CSS位置偏移反爬样例2:电商网站商品列表CSS位置偏移反爬破解 6. 总结 1. 反爬机制概述 CSS位置偏移反爬是一种常见的反爬虫技术,通过C…...
Ubuntu20.04安装Redis
目录 切换到root用户 使用 apt install redis 安装redis 修改配置文件 编辑 重新启动服务器 使用Redis客户端连接服务器 切换到root用户 如果没有切换到root用户的,切换到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 (如数字2231) 参考docker 支持nvidia ,注释了需要的取消注释即可 42行-92行一定要重启服务器…...
OkHttp、Retrofit、RxJava:一文讲清楚
一、okHttp的同步和异步请求 Call 是 OkHttp 的核心接口,代表一个已准备好执行的 HTTP 请求。它支持 同步 和 异步 两种模式: enqueue——>okHttp异步 OkHttpClient client new OkHttpClient();Request request new Request.Builder().url("…...
星环科技推出DeepSeek全场景解决方案:即开即用、企业级部署、端侧智能三位一体
星环科技(688031.SH)正式发布DeepSeek全场景解决方案,全面覆盖个人用户、企业客户及行业场景需求,为用户提供从个人到企业、从云端到本地的全方位AI应用支持,为不同需求的用户提供了灵活、高效且安全的AI解决方案。 省…...
Redis缓存一致性难题:如何让数据库和缓存不“打架”?
标题:Redis缓存一致性难题:如何让数据库和缓存不“打架”?(附程序员脱发指南) 导言:当数据库和缓存成了“异地恋” 想象一下:你刚在美团下单了一份麻辣小龙虾,付款后刷新页面&#…...
动态部署Web应用程序与web.xml配置详解
文章目录 前言一、动态部署Web应用程序1.1 什么是动态部署?1.2 动态部署的步骤1.3 动态部署的优势 二、web.xml 配置文件2.1 什么是web.xml?2.2 web.xml 文件的结构2.2.1常见配置(1) 配置上下文参数(2) 配置Servlet(3)配置过滤器(…...
2025年软考报名费用是多少?全国费用汇总!
软考报名时间终于确定了!想要参加2025年软考的同学们注意啦!特别是那些一年只有一次考试机会的科目,千万不要错过哦!这里为大家整理了各地的报名时间、科目、费用等信息,快来看看吧! 一、2025年软考时间安…...
DeepSeek 15天指导手册——从入门到精通 PDF(附下载)
DeepSeek使用教程系列--DeepSeek 15天指导手册——从入门到精通pdf下载: https://pan.baidu.com/s/1PrIo0Xo0h5s6Plcc_smS8w?pwd1234 提取码: 1234 或 https://pan.quark.cn/s/2e8de75027d3 《DeepSeek 15天指导手册——从入门到精通》以系统化学习路径为核心&…...
【Javascript】js精度丢失
当JS处理大整数或者浮点数的时候会出现精度丢失的情况。 Javascript的数字都使用双精度浮点数表示,遵循IEEE754标准 比如我遇到的问题,对一个小数的四舍五入,保留2位小数: 235.985≈235.98 235.9851≈235.99 原理请大家参考百度&…...
让Word插上AI的翅膀:如何把DeepSeek装进Word
在日常办公中,微软的Word无疑是我们最常用的文字处理工具。无论是撰写报告、编辑文档,还是整理笔记,Word都能胜任。然而,随着AI技术的飞速发展,尤其是DeepSeek的出现,我们的文字编辑方式正在发生革命性的变…...
秒杀系统的常用架构是什么?怎么设计?
架构 秒杀系统需要单独部署,如果说放在订单服务里面,秒杀的系统压力太大了就会影响正常的用户下单。 常用架构: Redis 数据倾斜问题 第一步扣减库存时 假设现在有 10 个商品需要秒杀,正常情况下,这 10 个商品应该均…...
【文件基础操作】小笔记
Step1: 现在项目文件夹(我的项目叫做RunPony)下创建一个a.txt文本文件,手动写入一些数字,保存 Step2: 现在在main.c内写一个基本的文件处理的程序 Step3: 现在已经知道如何打开关闭文件,下一步要搞懂如何读取txt内的…...
RabbitMQ系列(七)基本概念之Channel
RabbitMQ 中的 Channel(信道) 是客户端与 RabbitMQ 服务器通信的虚拟会话通道,其核心作用在于优化资源利用并提升消息处理效率。以下是其核心机制与功能的详细解析: 一、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. 冷启动监督微调(Cold Start SFT)**该阶段的主要目标**: 2. 面向推理的强化学习(RL for Reasoning)**该阶段的主要目标**: 3. 拒绝采样和监督微调&…...
【博资考4】网安学院-硕转博考试内容
【博资考4】硕转博考试内容 - 网络安全与基础理论 写在最前面一. **21年硕转博面试内容回顾**网络、逆向、操作系统、攻防、漏洞1. **网络安全常见攻击方式及其防范措施**1.1 **DDoS攻击(分布式拒绝服务)**1.2 **SQL注入攻击**1.3 **XSS攻击(…...
30 分钟从零开始入门 CSS
HTML CSS JS 30分钟从零开始入门拿下 HTML_html教程-CSDN博客 30 分钟从零开始入门 CSS-CSDN博客 JavaScript 指南:从入门到实战开发-CSDN博客 前言 最近也是在复习,把之前没写的博客补起来,之前给大家介绍了 html,现在是 CSS 咯…...
C语言综合案例:学生成绩管理系统
C语言综合案例:学生成绩管理系统 需求 1.存储最多50名学生的信息(不使用结构体) 2.每个学生包含: 学号(字符数组)姓名(字符数组)3门课程成绩(一维数组) …...
使用python做http代理请求
有这样一个需求现在有两台A,B两台电脑组成了一个局域网,在A电脑上开发webjava应用,需要调用第三方接口做http请求,但是这个请求只能在B电脑上请求。 一种解决方案:自定义一个中间服务,在电脑B上运行一个简…...
如何解决数位板跨平台兼容难题?OpenTabletDriver开源驱动的一站式配置体验
如何解决数位板跨平台兼容难题?OpenTabletDriver开源驱动的一站式配置体验 【免费下载链接】OpenTabletDriver Open source, cross-platform, user-mode tablet driver 项目地址: https://gitcode.com/gh_mirrors/op/OpenTabletDriver OpenTabletDriver是一款…...
第十五节:启动序列——从 claude 命令到 REPL 就绪
知识图谱定位:前面两节我们分别拆解了终端 UI(第13节 React Ink)和命令系统(第14节 斜杠路由)——它们都假设一个前提:REPL 已经就绪。但从用户在终端敲下 claude 按回车,到他看到交互界面,这中间到底发生了什么?答案是一个精心设计的三阶段启动序列:cli.tsx::main()…...
彻底搞懂Pinecone、Chroma、Weaviate:向量数据库架构拆解,看这篇就够了!
向量数据库存储 Embedding,也就是文本、图像或音频的数值表示,并在查询时检索语义上最接近的结果。RAG 系统正是基于这一机制运作。本文对比三个主流方案,每个都附有 Python 代码,均来自实际在生产环境中使用三者的经验。 三种选择…...
3个技术维度重构教育评价:OCRAutoScore的智能阅卷革新
3个技术维度重构教育评价:OCRAutoScore的智能阅卷革新 【免费下载链接】OCRAutoScore OCR自动化阅卷项目 项目地址: https://gitcode.com/gh_mirrors/oc/OCRAutoScore 教育评价领域正面临数字化转型的关键期,传统阅卷模式在大规模考试场景下逐渐暴…...
BiliTools:重构B站资源管理的跨平台工具箱
BiliTools:重构B站资源管理的跨平台工具箱 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools 价值定位&…...
QWEN-AUDIO语音合成教程:中文四声调建模对自然度的关键影响
QWEN-AUDIO语音合成教程:中文四声调建模对自然度的关键影响 你有没有遇到过这样的语音合成效果?文字念得都对,但听起来就是“怪怪的”,像机器人在念稿,没有真人说话的那种抑扬顿挫和情感起伏。尤其是在说中文的时候&a…...
Skills 编写学习凰
简介 AI Agent 不仅仅是一个能聊天的机器人(如普通的 ChatGPT),而是一个能够感知环境、进行推理、自主决策并调用工具来完成特定任务的智能系统,更够完成更为复杂的AI场景需求。 AI Agent 功能 根据查阅的资料,agent的…...
如何快速掌握DankDroneDownloader:无人机固件管理的完整指南
如何快速掌握DankDroneDownloader:无人机固件管理的完整指南 【免费下载链接】DankDroneDownloader A Custom Firmware Download Tool for DJI Drones Written in C# 项目地址: https://gitcode.com/gh_mirrors/da/DankDroneDownloader 当你想完全掌控自己的…...
电源管理入门-18 Power Domain管理
SoC中通常有很多IP,按逻辑可以把几个相关功能的IP划为一个电源域。一个电源域内的IP,通常按相同的方式由同一个硬件模块PMIC供电,电压一样并且电源管理例如休眠唤醒一致。为什么有设备电源管理还需要power domain划分? 对每个设备…...
打卡信奥刷题(3085)用C++实现信奥题 P7095 [yLOI2020] 不离
P7095 [yLOI2020] 不离 题目背景乱玄黄时序,探风林实虚。 我要你共我奇谈怪趣。 任日月斑斓,待春秋兴残。 我要我们有聚无散。——银临《不离》 题目描述 这道题目来自 zxy 哔哔,咕咕让哔哔选一首歌作为题目名,但是哔哔说没有想好…...
