网页抓取混淆与嵌套数据处理流程

news2025/6/9 20:26:02

当我们在网页抓取中,遇到混淆和多层嵌套的情况是比较常见的挑战。混淆大部分都是为了防止爬虫而设计的,例如使用JavaScript动态加载、数据加密、字符替换、CSS偏移等。多层嵌套则可能是指HTML结构复杂,数据隐藏在多层标签或者多个iframe中。

在这里插入图片描述

那么遇到这样的问题,通常的情况的需要结合多种技术手段来处理,一下就是我整理的具体系统化的解决方案:

一、混淆处理策略

  1. 动态渲染对抗

    • 使用无头浏览器:Playwright/Puppeteer/Selenium
    from playwright.sync_api import sync_playwright
    
    with sync_playwright() as p:
        browser = p.chromium.launch()
        page = browser.new_page()
        page.goto(url)
        # 处理延迟加载
        page.wait_for_selector('.target-element', timeout=10000)
        html = page.content()
        browser.close()
    
  2. CSS偏移混淆

    • 解析CSS样式规则:
    from bs4 import BeautifulSoup
    import re
    
    def decrypt_css_offset(html):
        soup = BeautifulSoup(html, 'lxml')
        style_tags = soup.find_all('style')
        mapping = {}
        for tag in style_tags:
            # 提取CSS规则
            rules = re.findall(r'\.(.+?){left:(.+?)px', tag.text)
            for class_name, offset in rules:
                mapping[class_name] = -int(offset.replace(';', ''))
        return mapping
    
  3. 字体反爬破解

    • 字体文件解析:
    from fontTools.ttLib import TTFont
    
    def parse_font(font_path):
        font = TTFont(font_path)
        cmap = font.getBestCmap()
        glyph_names = [font['glyf'][g].getGlyphName() for g in cmap.values()]
        # 建立编码到实际字符的映射
        return {hex(k): v for k, v in zip(cmap.keys(), glyph_names)}
    

二、多层嵌套处理技巧

  1. 智能路径生成

    def smart_extract(html):
        soup = BeautifulSoup(html, 'lxml')
        # 寻找数据密集区域
        data_container = soup.find(lambda tag: len(tag.find_all()) > 10 and tag.text.strip())
        # 自动化生成XPath
        path = []
        while data_container:
            path.insert(0, data_container.name)
            data_container = data_container.parent
        return " > ".join(path)
    
  2. 多级JSON解析

    import json
    
    def extract_nested_json(data):
        results = []
        if isinstance(data, dict):
            for key, value in data.items():
                if key == 'targetKey':
                    results.append(value)
                else:
                    results.extend(extract_nested_json(value))
        elif isinstance(data, list):
            for item in data:
                results.extend(extract_nested_json(item))
        return results
    

三、综合解决方案

处理流程:

CSS混淆
字体混淆
JS加密
多层嵌套
JSON数据
启动无头浏览器
加载目标页面
检测混淆类型
解析样式表
下载字体文件
执行解密函数
获取纯净HTML
结构复杂度
动态路径分析
深度遍历解析
数据规范化
输出结构化数据

四、高级技巧

  1. 机器学习辅助

    • 使用预训练模型识别数据区域
    # 伪代码示例
    from sklearn.ensemble import RandomForestClassifier
    
    # 特征:标签深度/子节点数/文本长度等
    clf = RandomForestClassifier()
    clf.fit(features, labels)  # 预先标注样本训练
    
  2. 动态XPath生成

    def generate_xpath(element):
        components = []
        while element.parent is not None:
            siblings = element.find_previous_siblings(element.name)
            position = len(siblings) + 1 if siblings else 1
            components.insert(0, f"{element.name}[{position}]")
            element = element.parent
        return '/' + '/'.join(components)
    
  3. 反调试绕过

    # Playwright 示例
    page = browser.new_page()
    # 屏蔽开发者工具检测
    page.add_init_script("""
    window.console.debug = () => {};
    Object.defineProperty(navigator, 'webdriver', {get: () => false});
    """)
    

五、调试与优化

  1. 数据校验机制

    def validate_data(data):
        patterns = {
            'phone': r'\d{3}-\d{4}-\d{4}',
            'email': r'[\w.-]+@[\w.-]+\.\w+'
        }
        for field, pattern in patterns.items():
            if not re.match(pattern, data.get(field, '')):
                logging.warning(f"Invalid {field} format: {data[field]}")
    
  2. 自适应重试策略

    import random
    from tenacity import retry, wait_exponential
    
    @retry(wait=wait_exponential(multiplier=1, max=60))
    def fetch_with_retry(url):
        # 随机切换UA
        headers = {'User-Agent': random.choice(USER_AGENTS)}
        response = requests.get(url, headers=headers)
        response.raise_for_status()
        return response
    

最佳实践建议:

  1. 分层处理:先解决渲染问题,再处理结构混淆,最后解析数据
  2. 模块化设计:将渲染引擎、解析器、校验模块分离
  3. 缓存机制:对字体文件/CSS规则进行本地缓存
  4. 熔断机制:设置异常阈值自动停止爬取
  5. 分布式处理:使用Scrapy+Scrapy-Redis处理大规模数据

遇到具体案例时,建议:

  1. 使用浏览器开发者工具的"元素覆盖检测"功能
  2. 分析网络请求中的XHR/Fetch请求
  3. 对比多页面结构寻找稳定特征
  4. 对混淆代码进行AST语法树分析

最后需要提醒的是:处理复杂网站时,我们优先检查是否有官方API可用,并遵守robots.txt协议。对于商业项目,建议使用专业级爬虫框架如Scrapy配合Splash渲染服务配合API代理效率杠杠的。

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

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

相关文章

高性能MYSQL:复制同步的问题和解决方案

一、复制的问题和解决方案 中断MySQL的复制并不是件难事。因为实现简单,配置相当容易,但也意味着有很多方式会导致复制停止,陷入混乱并中断。 (一)数据损坏或丢失的错误 由于各种各样的原因,MySQL 的复制…

大话软工笔记—架构模型

1. 架构模型1—拓扑图 (1)拓扑图概念 拓扑图,将多个软件系统用网络图连接起来的表达方式。 (2)拓扑图分类 总线型结构 比较普遍采用的方式,将所有的系统接到一条总线上。 星状结构 各个系统通过点到…

javaweb -html -CSS

HTML是一种超文本标记语言 超文本&#xff1a;超过了文本的限制&#xff0c;比普通文本更强大&#xff0c;除了文字信息&#xff0c;还可以定义图片、音频、视频等内容。 标记语言&#xff1a;由标签"<标签名>"构成的语言。 CSS:层叠样式表&#xff0c;用于…

spring task定时任务快速入门

spring task它基于注解和配置&#xff0c;可以轻松实现任务的周期性调度、延迟执行或固定频率触发。按照我们约定的时间自动执行某段代码。例如闹钟 使用场景 每月还款提醒&#xff0c;未支付的订单自动过期&#xff0c;收到快递后自动收货&#xff0c;系统自动祝你生日快乐等…

搭建nginx的负载均衡

1、编写一个configMap的配置文件 events {worker_connections 1024; # 定义每个worker进程的最大连接数 }http {# 定义通用代理参数&#xff08;替代proxy_params文件&#xff09;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-F…

Appium+python自动化(八)- 认识Appium- 下章

1、界面认识 在之前安装appium的时候说过我们有两种方法安装&#xff0c;也就有两种结果&#xff0c;一种是有界面的&#xff08;客户端安装&#xff09;&#xff0c;一种是没有界面的&#xff08;终端安装&#xff09;&#xff0c;首先我们先讲一下有界面的&#xff0c;以及界…

LabVIEW的MathScript Node 绘图功能

该VI 借助 LabVIEW 的 MathScript Node&#xff0c;结合事件监听机制&#xff0c;实现基于 MathScript 的绘图功能&#xff0c;并支持通过交互控件自定义绘图属性。利用 MathScript 编写脚本完成图形初始化&#xff0c;再通过LabVIEW 事件结构响应用户操作&#xff0c;动态修改…

每日Prompt:治愈动漫插画

提示词 现代都市治愈动漫插画风格&#xff0c;现代女子&#xff0c;漂亮&#xff0c;长直发&#xff0c;20岁&#xff0c;豆沙唇&#xff0c;白皙&#xff0c;气质&#xff0c;清纯现代都市背景下&#xff0c;夕阳西下&#xff0c;一位穿着白色露脐短袖&#xff0c;粉色工装裤…

6.8 note

paxos算法_初步感知 Paxos算法保证一致性主要通过以下几个关键步骤和机制&#xff1a; 准备阶段 - 提议者向所有接受者发送准备请求&#xff0c;请求中包含一个唯一的编号。 - 接受者收到请求后&#xff0c;会检查编号&#xff0c;如果编号比它之前见过的都大&#xff0c;就会承…

面试心得 --- 车载诊断测试常见的一些面试问题

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

跟进一下目前最新的大数据技术

搭建最新平台 40C64G服务器&#xff0c;搭建3节点kvm&#xff0c;8C12G。 apache-hive-4.0.1-bin apache-tez-0.10.4-bin flink-1.20.1 hadoop-3.4.1 hbase-2.6.2 jdk-11.0.276 jdk8u452-b09 jdk8终于可以不用了 spark-3.5.5-bin-hadoop3 zookeeper-3.9.3 trino…

系统模块与功能设计框架

系统模块与功能设计框架&#xff0c;严格遵循专业架构设计原则&#xff0c;基于行业标准&#xff08;如微服务架构、DDD领域驱动设计&#xff09;构建。设计采用分层解耦模式&#xff0c;确保可扩展性和可维护性&#xff0c;适用于电商、企业服务、数字平台等中大型系统。 系统…

我爱学算法之—— 前缀和(中)

一、724. 寻找数组的中心下标 题目解析 这道题&#xff0c;给定数组nums&#xff0c;要求我们找出这个数组的中心下标。 **中心下标&#xff1a;**指左侧所有元素的和等于右侧所有元素的和。 如果存在多个中心数组下标&#xff0c;就返回最左侧的中心数组下标。 算法思路 暴…

Elasticsearch从安装到实战、kibana安装以及自定义IK分词器/集成整合SpringBoot详细的教程ES(三)

DSL官方地址&#xff1a; DSL查询分类 Elasticsearch提供了基于JSON的DSL&#xff08;https://www.elastic.co/docs/explore-analyze/query-filter/languages/querydsl&#xff09;来定义查询。常见的查询类型包括&#xff1a; 查询所有&#xff1a;查询出所有数据&#xff0…

React Hooks 指南:何时使用 useEffect ?

在 React 的函数组件中&#xff0c;useEffect Hook 是一个强大且不可或缺的工具。它允许我们处理副作用 (side effects)——那些在组件渲染之外发生的操作。但是&#xff0c;什么时候才是使用 useEffect 的正确时机呢&#xff1f;让我们深入探讨一下&#xff01; 什么是副作用…

API标准的本质与演进:从 REST 架构到 AI 服务集成

在当今数字化浪潮中&#xff0c;API 已成为系统之间沟通与协作的“语言”&#xff0c;REST&#xff08;Representational State Transfer&#xff0c;表述性状态转移&#xff09;是一种基于 HTTP 协议的 Web 架构风格。它不仅改变了 Web 应用开发的方式&#xff0c;也成为构建现…

html - <mark>标签

<mark> 标签在HTML中用于高亮显示文本&#xff0c;通常用于突出显示某些重要的部分。它的默认样式通常是背景色为黄色&#xff0c;但你可以通过CSS自定义其外观。 1. 基本用法 <mark> 标签用于标记文本的高亮显示。它常用于搜索结果中&#xff0c;突出显示匹配的…

JavaWeb:前端工程化-Vue

Vue工程化 介绍 什么是Vue? 小白眼里前端开发 前端工程化 环境准备 D:\Program Files\nodejs Vue项目-快速入门 步骤 D:\front\vue 安装依赖 目录结构 code . vscode打开 启动 VScode侧边栏左下角&#xff0c;没有NPM脚本&#xff0c;如何打开&#xff1f;&…

AT_abc409_e [ABC409E] Pair Annihilation

AT_abc409_e [ABC409E] Pair Annihilation 赛时没开longlong挂了。 思路 首先我们可以把这棵树转化为一颗有根树&#xff0c;且所有电子的都朝根节点移动。 那么接下来我们就需要选择一个最优的树根。 考虑换根dp。 但是可以发现换根时答案其实是没有变化的。 我们设 f…

开疆智能Ethernet/IP转Modbus网关连接西门子BW500积算仪配置案例

本案例是通过Ethernet转Modbus网关将皮带秤数据接入到罗克韦尔1769L32E型PLC中。 首先进行ABB PLC的设置 1&#xff0c; 运行 RSLogix 5000 程序加载Ethernet转Modbus网关的EDS 文件&#xff1a; 2&#xff0c;新建工程并添加PLC 3&#xff0c;New Module添加网关&#xff…