ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Crawl4AI 动态点击实战:用 Session 会话与 JS 注入实现“Load More”内容加载

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),仅供参考
返回列表