发布时间:2026/9/5 15:51:01
Crawl4AI 动态点击实战:用 Session 会话与 JS 注入实现“Load More”内容加载 Crawl4AI 动态点击实战用 Session 会话与 JS 注入实现“Load More”内容加载【免费下载链接】crawl4ai Crawl4AI: Open-source LLM Friendly Web Crawler Scraper. Dont be shy, join here: https://discord.gg/jP8KfhDhyN项目地址: https://gitcode.com/GitHub_Trending/craw/crawl4ai抓取动态网站时经常会遇到必须点击“Load More / Next”按钮才会加载新内容的页面。本文基于 Crawl4AI 官方教程 教程点击按钮加载更多内容完整讲解两种点击加载内容的实战方案——基于 Session 的分步调用方案与单次调用方案并结合仓库源码解释session_id、js_code、wait_for、js_only四个关键参数在 Crawl4AI 内部是如何落地的帮助你按需选择正确的动态内容抓取姿势。核心参数速览点击加载依赖哪四个参数两种方案都围绕crawler.arun()的以下参数展开理解它们的语义是后续实操的基础参数作用源码依据session_id保持同一个浏览器上下文Page BrowserContext跨多次arun()存活状态不丢失browser_manager.py 中按session_id复用已缓存的 context 与 pagejs_code在已加载页面的上下文中执行 JavaScript支持单个字符串或字符串列表async_crawler_strategy.py 中execute_js_code对str/List[str]分别处理列表则按顺序逐条执行wait_for等待某个条件成立再继续如新内容渲染完成支持css:/js:前缀async_crawler_strategy.py 中smart_wait的分发逻辑js_onlyTrue本次arun()不重新发起页面导航只执行 JS 并提取当前页面内容async_crawler_strategy.py 中if not config.js_only:才执行page.goto()否则直接跳过导航从源码结构看js_onlyTrue的意义正在于此策略层在config.js_only为真时完全跳过before_goto/page.goto()/after_goto导航流程async_crawler_strategy.py因此第二次arun()不会刷新页面此前点击产生的 DOM 变化得以保留——这是分步方案能够“累加内容”的前提。此外async_configs.py 对session_id的定义是“持久化浏览器上下文及已创建页面”async_configs.py 对js_only的定义是“后续调用属于 JS 驱动的更新而非整页加载”与本文两种方案的用法完全一致。方案一Session 分步调用逐步点击“Next”当页面需要“点一次 Next等一次新内容出现再点下一次”的节奏且每一步可能需要根据页面状态动态决策时使用session_id让多次arun()共享同一个浏览器上下文from crawl4ai import AsyncWebCrawler, CacheMode js_code [ # 这段 JS 找到 “Next” 按钮并点击 const nextButton document.querySelector(button.next); nextButton nextButton.click(); ] wait_for_condition css:.new-content-class async with AsyncWebCrawler(headlessTrue, verboseTrue) as crawler: # 1. 加载初始页面 result_initial await crawler.arun( urlhttps://example.com, cache_modeCacheMode.BYPASS, session_idmy_session ) # 2. 点击 Next 按钮并等待新内容出现 result_next await crawler.arun( urlhttps://example.com, session_idmy_session, js_codejs_code, wait_forwait_for_condition, js_onlyTrue, cache_modeCacheMode.BYPASS ) # result_next 现在包含点击 Next 之后更新过的 HTML关键要点来自官方教程并结合源码补充session_id保持同一个浏览器上下文开启。在 browser_manager.py 中BrowserManager维护一个self.sessions字典命中session_id时直接返回缓存的(context, page)并刷新其最后使用时间戳因此多次arun()落在同一个 Page 上首次调用后该会话在 browser_manager.py 中被登记保存。js_code在已加载页面的上下文中执行 JavaScript。策略层通过execute_js_codeasync_crawler_strategy.py执行若传入列表则按顺序逐条执行方便串联多步点击。wait_for确保爬虫等待到新内容完全加载再继续。css:.new-content-class这种css:前缀写法会走page.wait_for_selector()分支async_crawler_strategy.py。js_onlyTrue让本次arun()只跑 JS 不做整页导航避免刷新页面丢失已加载内容。cache_modeCacheMode.BYPASS绕过缓存保证每次拿到的都是真实点击后的最新页面快照。按此模式重复调用arun()可放在循环中并在每轮修改js_code例如点击不同的模块或不同的分页按钮即可迭代加载全部目标内容。该方案的典型适用场景是需要在点击下一分页之前动态检查页面条件例如判断按钮是否变为禁用、是否出现“没有更多”提示每一步都能拿到独立的CrawlResult做断言或落库。仓库中还有配套的会话管理示例 session_id_example.py以及更细粒度的页面交互教程见 page-interaction.md。会话生命周期提醒session_id对应的会话由BrowserManager管理可通过kill_session(session_id)显式关闭browser_manager.py在爬虫退出时管理器也会遍历self.sessions统一清理会话无需手动管理所有资源。方案二单次 arun 调用用一段 JS 完成全部点击如果交互序列事先已知例如页面结构固定、所有“模块卡片”一次性渲染在 DOM 中可以把点击循环整体封装进一段异步 IIFE在一次arun()内完成“点击 → 等待 → 再点”的全部动作最后再交给 Crawl4AI 做提取from crawl4ai import AsyncWebCrawler, CacheMode js_code [ # 点击多个模块的示例 JS (async () { const modules document.querySelectorAll(.module-item); for (let i 0; i modules.length; i) { modules[i].scrollIntoView(); // 触发懒加载 modules[i].click(); // 等待每个模块的内容加载100ms 可按实际网络情况调整 await new Promise(r setTimeout(r, 100)); } })(); ] async with AsyncWebCrawler(headlessTrue, verboseTrue) as crawler: result await crawler.arun( urlhttps://example.com, js_codejs_code, wait_forcss:.final-loaded-content-class, cache_modeCacheMode.BYPASS ) # result 包含所有模块被点击后的完整内容该 JS 片段做了四件事与官方教程一致遍历所有.module-item模块、逐个scrollIntoView()并click()、在每次点击之间用setTimeout等待内容更新、完成后把控制权交还给 Crawl4AI 进行提取。关键要点所有交互点击与等待都发生在提取之前外层wait_forcss:.final-loaded-content-class作为最终兜底确保最后一个模块的内容也渲染完毕后才进入内容提取阶段。从源码时序看arun()会在导航与wait_for之后再执行js_code执行点在 async_crawler_strategy.py 附近位于wait_for等待逻辑之后且 Crawl4AI 还提供js_code_before_wait钩子用于在wait_for检查之前先“触发”加载行为async_crawler_strategy.py——如果点击动作必须发生在等待条件检查之前可考虑使用它。适合交互序列完全固定、页面结构一致可预测的场景代码更简洁且只需一次网络往返即可完成整页的动态加载。两种方案怎么选官方教程给出的选择标准可以直接作为决策表使用维度分步方案Session 多次 arun单次调用方案一段 JS控制权粒度细粒度每步可检查运行时条件再决定是否继续一次性序列必须预先确定适用前提页面需要多个运行时条件判断如按钮状态、是否还有下一页交互序列事先已知、结构稳定代码复杂度需要维护session_id多轮调用代码更简洁单段 JS 即可结果获取每轮arun()返回独立的CrawlResult可逐步校验/落库只有一份最终CrawlResult典型场景无限滚动分页、需要登录态续存的连续翻页卡片全部在 DOM 中、只需批量展开/点击补充两条实操建议基于源码行为推断供参考优先用确定性的wait_for而不是固定sleep。分步方案中css:/js:前缀的等待条件由smart_wait精确等待选择器出现或 JS 表达式为真async_crawler_strategy.py比盲等更接近内容真实就绪的时机单次调用方案内部的setTimeout建议按目标站点的实际响应速度调整过短可能导致最后一个模块未加载完。动态页面记得绕过缓存。两种方案示例均显式传入cache_modeCacheMode.BYPASS避免因缓存命中拿到点击前的旧快照导致提取结果缺少动态内容。小结Crawl4AI 处理“点击加载”类动态内容提供了两条清晰路径分步方案用session_id保持浏览器上下文多次arun()渐进式点击配合js_onlyTrue避免整页刷新、wait_for保证每步内容就绪适合需要运行时判断的分页/滚动场景。单次方案把点击循环写进一段异步 JS在单次arun()内完成全部交互后再提取适合交互序列固定的场景。四条支撑线——session_id会话复用browser_manager.py、js_code页面上下文内执行 JSasync_crawler_strategy.py、wait_for条件等待async_crawler_strategy.py、js_only跳过导航async_crawler_strategy.py——共同构成了 Crawl4AI 处理动态点击内容的完整能力掌握它们即可覆盖大多数“Load More”场景。【免费下载链接】crawl4ai Crawl4AI: Open-source LLM Friendly Web Crawler Scraper. Dont be shy, join here: https://discord.gg/jP8KfhDhyN项目地址: https://gitcode.com/GitHub_Trending/craw/crawl4ai创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

2026/9/5 15:51:01

基于STM32的直流充电桩控制核心开发:从协议解析到安全监控

简介:本资源是一套基于STM32平台实现的直流充电桩嵌入式控制程序,面向计算机、自动化、电子信息、通信工程及人工智能等专业的在校学生、教师与初学者,适用于课程设计、毕业设计、项目立项演示及嵌入式进阶学习。代码经完整功能测试并成功运行…

2026/9/5 15:46:00

Arduino下SG90 360度连续旋转舵机实测:PWM控制与开环控制详解

刚入手 SG90 舵机时,我想做一个小型摇头云台,按网上的教程写 servo.write(90) 确实能转,但换成另一颗“SG90”后,角度却对不上,甚至出现“明明让舵机转 180,结果它自己转了一圈又一圈”的现象。后来才发现…

2026/9/5 16:36:03

读《瞳人语》的警示:戒掉那点色心,才能看见真正的光

读完《瞳人语》,最大的感受是:蒲松龄写的根本不是鬼,他想写的是男人最该戒掉的那点色心。故事里确实也带着志怪色彩,但那种色彩不来自厉鬼,而来自一个人眼底的翳膜,以及他在黑暗里听见的、自己心里的声音。…

2026/9/5 16:36:03

Wand-Enhancer完整指南:免费解锁WeMod Pro高级功能

Wand-Enhancer完整指南:免费解锁WeMod Pro高级功能 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer WeMod 的高级功能都被 Pro 订阅锁着…

2026/9/5 16:36:03

10分钟连上第一个数据库:Beekeeper Studio 3步搭好环境

10分钟连上第一个数据库:Beekeeper Studio 3步搭好环境 【免费下载链接】beekeeper-studio Modern and easy to use SQL client for MySQL, Postgres, SQLite, SQL Server, and more. Linux, MacOS, and Windows. 项目地址: https://gitcode.com/GitHub_Trending/…

2026/9/5 16:36:03

calibre 电子书格式转换实操指南

calibre 电子书格式转换实操指南 【免费下载链接】calibre The official source code repository for the calibre ebook manager 项目地址: https://gitcode.com/GitHub_Trending/ca/calibre calibre 是一款开源免费的电子书管理软件,核心能力是把 PDF、EPU…

2026/9/5 2:46:54

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/9/5 2:46:52

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/9/5 2:44:34

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/9/5 0:04:47

流式背压机制:避免前端渲染卡死与内存暴涨的滑动窗口限流

流式背压机制:避免前端渲染卡死与内存暴涨的滑动窗口限流在大模型流式输出(Streaming)与智能体实时推流的架构中,生产环境中经常出现一种“上下游生产消费速率严重失衡”的极端情况: 生产端极速产出:大模型…

2026/9/5 2:45:13

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/5 2:30:42

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/5 2:46:50

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…