ARTICLE DETAIL

资讯详情

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

Crawl4AI 实战指南:网页采集从登录页到结构化 JSON 的 3 个关键能力

Crawl4AI 实战指南:网页采集从登录页到结构化 JSON 的 3 个关键能力 Crawl4AI 实战指南网页采集从登录页到结构化 JSON 的 3 个关键能力【免费下载链接】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凌晨三点定时任务报警你的爬虫又挂在登录页上了。登录态是三天前存的 Cookie站点那边一次风控升级全作废了。换个目标站更糟——页面只抓到一半剩下 70% 的内容要靠加载更多点出来好不容易抓到整页 HTML解析脚本又因为对方改了一处 class 名直接崩掉。这三个问题——登录态、动态内容、结构化提取——基本是每个做网页采集的人都绕不开的。Crawl4AI 是一个基于 Playwright 的开源 LLM 友好型爬虫把这三件事做成了开箱即用的能力。读完这篇你会知道它分别是怎么做的以及哪些坑别踩。快速上手装好、装浏览器、跑第一条命令pip install crawl4ai crawl4ai-setup # 下载 Playwright 浏览器首次必做 # 抓一个页面输出 Markdown crwl crawl https://example.com -o markdown输出就是一段干净的 Markdown 正文导航栏、页脚、广告这些噪音默认被过滤掉可以直接喂给下游程序或 LLM。想先跑通 Python 侧最小形态是from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig import asyncio async def main(): async with AsyncWebCrawler(configBrowserConfig(headlessTrue)) as crawler: r await crawler.arun(https://example.com, configCrawlerRunConfig()) print(r.markdown.raw_markdown[:200]) # 前 200 字符预览 asyncio.run(main())基础爬取一条命令拿到干净的 Markdown是后面所有能力的地基登录一次跑一百次Profile 管理登录态它解决什么问题最典型的翻车现场你爬的是一个需要登录的后台代码里存了一堆 Cookie结果这周还好好的下周全部 401。只存凭据不存人站点随时能发现你不是真人。原理一句话Profile 不是存 Cookie而是持久化一整个用户浏览器数据目录Cookie、localStorage、缓存、UA 指纹都在里面。创建 profile 时它会弹出一个真实浏览器窗口你像正常人一样把登录流程走一遍短信码、二次验证都行按q保存之后每次爬取Crawl4AI 都用这份目录起浏览器对站点来说你就是那个已经登录过的老用户。动手试# 交互式创建弹出浏览器完成登录后按 q 保存 crwl profiles create bank-auth # 确认已保存的 profile crwl profiles list # 带着 profile 爬受保护页面 crwl crawl https://bank-portal.com/statements -p bank-auth -o json # 确认不再需要时删除 crwl profiles delete bank-auth想直接在 Python 里复用就是给BrowserConfig指个数据目录config BrowserConfig(headlessTrue, user_data_dir~/.crawl4ai/profiles/bank-auth)坑与注意事项Cookie 会过期。过期后表现是爬回来的是登录页而不是数据页重新跑一次crwl profiles create把流程走完即可不用改任何代码。Profile 里是明文的会话凭据别提交进代码仓库也别在共享机器上留给你没打算公开身份的 profile。登录态解决了下一个麻烦是页面本身很多站的内容要等 JS 执行完、甚至要滚动触发之后才出现。让页面自己滚动到加载完动态内容与等待策略它解决什么问题为什么我的输出只有第一屏因为默认行为是等页面加载完成就取 HTML而懒加载、无限滚动、异步填充的内容根本还没开始加载。time.sleep(5)是最常见的自救方式但 5 秒对长列表不够对短页面又白白浪费时间等于用时间换不确定性。原理一句话Crawl4AI 把取 HTML 的时机拆成了几个可配置的开关wait_untilnetworkidle等网络请求静默、wait_for轮询某个 CSS 选择器出现、delay_before_return_html给 JS 留最后一点时间。配合全页扫描时自动逐步滚动scroll_delay控制步长间隔、max_scroll_steps控制总步数列表就能被一页一页滚出来。动手试crwl crawl https://some-site.com/products \ -c wait_untilnetworkidle, # 等网络请求静默 max_scroll_steps8, # 全页扫描最多滚 8 步 scroll_delay0.5, # 每步滚动后留 0.5 秒加载 wait_for.card, # 确保至少一张卡片已渲染 css_selectormain, # 只取 main 内的内容 \ -o markdown动态页面等待、滚动、元素检测组合起来页面加载到什么程度再取 HTML 由你定坑与注意事项虚拟列表Twitter、Instagram 这类只渲染可视区域滚走的内容会被回收普通滚动会漏数据。这类页面用专门的VirtualScrollConfig官方有个带本地模拟站的完整示例docs/examples/virtual_scroll_example.py。别为了保险把delay_before_return_html调到 3 秒以上。wait_untilnetworkidle加wait_for已经覆盖了绝大多数场景固定长延迟只会拖慢整体吞吐。内容抓全了下一个问题下游要的是字段化的 JSON不是 Markdown。CSS 与 LLM 双通道把页面变成 JSON它解决什么问题用正则去切 HTML 是维护噩梦前端换一次 class你的解析脚本就崩一次。而全交给 LLM也不现实——慢、贵、结构不稳定的输出还要二次清洗。原理一句话Crawl4AI 把提取做成了可插拔的策略JsonCssExtractionStrategy拿一份 JSON schemabaseSelector 字段级选择器精确取字段零 LLM 成本LLMExtractionStrategy拿一段自然语言指令 可选 schema 让大模型理解页面语义适合改版频繁的结构两个策略可以同时挂在一次爬取里哪个稳用哪个。动手试CSS 通道先写一份 schema 文件这里对应docs/examples/cli/css_schema.json的格式{ name: ArticleExtractor, baseSelector: .card, fields: [ { name: title, selector: h4.card__title, type: text }, { name: link, selector: h4.card__title a, type: attribute, attribute: href } ] }# 结构化提取schema 定字段直接出 JSON crwl crawl https://some-site.com/news \ -e extract_css.yml \ -s docs/examples/cli/css_schema.json \ -o json输出就是[{ title: ..., link: ... }, ...]这样的数组。CSS 提取通道schema 写一次字段稳定可预期适合结构固定的站点LLM 通道一行就能起# -j 后跟自然语言指令不跟则用默认指令 crwl crawl https://some-site.com/blog/latest \ -j 提取文章标题、发布日期、作者按时间倒序排除广告 \ -o jsonLLM 提取依赖llm_config.yml里配置的 provider 和 API key首次使用先配好再跑。LLM 提取通道自然语言指令直接换结构化字段适合结构多变或语义复杂的页面坑与注意事项结构稳定的站点优先用 CSS 通道快、可预期、零 token 成本LLM 通道留给那些每次改版都得改选择器的站。用 LLM 提取时尽量传schema强制输出结构否则字段名和嵌套层级可能逐次漂移下游对不齐。同一个功能CLI 和 Python 是两种姿态选错会难受。三种用法怎么选CLI、Python API、还是混着来用法适合什么CLI 单条命令一次性抓页面、定时任务、CI 脚本给个 URL 就出 markdown/JSONPython API采集逻辑进业务代码复用浏览器上下文、多 URL 并发、带交互、带回调混合先用 CLI 快速验证选择器和 LLM 指令跑通后原样搬进 Python 项目什么时候该用它什么时候别用目标站是纯静态 HTML 的话requests加一个 HTML 解析库就够了没必要拉一个浏览器起来需要登录、等 JS、滚动加载、稳定出 JSON 字段时Crawl4AI 基本能覆盖但它本质是单机异步工具不是任务队列——大规模分布式采集要自己在外面再包一层调度。完整工作流把整个 API 文档站镜像成本地 Markdown背景把某开源项目的文档站API 参考部分几十个子页拉到本地存档列表页里全是子页链接单页无登录。配置BfsStrategy控制爬取深度include_patterns限定只进/docs/api/前缀CSS 提取器每页取标题和正文。import asyncio from pathlib import Path from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig from crawl4ai import BfsStrategy, JsonCssExtractionStrategy SCHEMA { # 与前面 CSS 通道同一套 schema 格式 name: DocPage, baseSelector: main, fields: [ {name: title, selector: h1, type: text}, {name: body, selector: article, type: html} ], } async def main(): async with AsyncWebCrawler(configBrowserConfig(headlessTrue)) as crawler: config CrawlerRunConfig( deep_crawl_strategyBfsStrategy(max_depth2), # 只下钻 2 层 include_patterns[*/docs/api/*], # 限定 API 前缀 extraction_strategyJsonCssExtractionStrategy(SCHEMA), ) results await crawler.arun_many([https://docs.example.com/docs/api/], configconfig) out Path(mirror); out.mkdir(exist_okTrue) for r in results: if r.extracted_content: (out / (r.url.split(/)[-1] .json)).write_text(r.extracted_content) print(fdone: {len(results)} pages) asyncio.run(main())产出mirror/目录下每页一个 JSON标题和正文已按 schema 对齐可以直接进知识库或向量库。收尾回到开头那三个场景登录态失效现在存成一个 profile过期了重走一次流程页面只抓一半交给滚动和等待策略解析脚本天天崩换成 CSS schema 或 LLM 指令。工具没变多麻烦少了一大半。文档总入口docs/虚拟滚动、CSS 与 LLM 提取的完整示例docs/examples/深度爬取策略说明docs/md_v2/core/deep-crawling.md【免费下载链接】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),仅供参考
返回列表