Crawl4AI:3 步配好登录态、动态页面与结构化数据提取
【免费下载链接】crawl4ai🚀🤖 Crawl4AI: Open-source LLM Friendly Web Crawler & Scraper. Don't be shy, join here: https://discord.gg/jP8KfhDhyN项目地址: https://gitcode.com/GitHub_Trending/craw/crawl4ai
运营每天要盯竞店价格,而数据卡在四道关上:竞品站要登录才能看全价,列表靠滚动和"加载更多"动态渲染,HTML 里的字段位置各站不同,页面结构还隔三差五改版。Crawl4AI 是一个开源的网页数据采集框架,它用无头浏览器(不弹窗口的爬虫专用浏览器)跑真实渲染,再配合 CSS 选择器或 LLM 指令做结构化数据提取,把这四道关一次配完,之后一条命令就能复用。
把登录存成 Profile,下次直接带上
你会遇到什么问题:多个后台各要各的登录流程,手工存 cookie 很快过期,爬一半掉线得重来。
Profile 怎么做的:它把整个浏览器数据目录(cookie、LocalStorage、IndexedDB)持久化成一份独立"身份",下次启动时直接加载,会话还在有效期内就不用再登。
crwl profiles # 建一个 Profile,在打开的浏览器里登录 crwl https://shop.example.com/admin -p shop-admin第二段在做什么:-p shop-admin复用刚登录好的身份。改两处即可——Profile 名和你要爬的后台地址。不想用交互向导时,也可以在 Python 配置里直接指向数据目录:BrowserConfig(user_data_dir="/path/to/profile")配use_managed_browser=True。
边界要说清楚:验证码、双因素、OAuth 跳转这类流程没法自动过,第一次得你人工在弹出的浏览器里点完,之后的爬取都是复用;Profile 只在会话有效期内免登录,过期了重新登一次即可。
常见误区:以为 Profile 只是把 cookie 抄走。它存的是完整会话环境(LocalStorage、站点缓存都在),这比裸 cookie 更接近真实浏览器,不容易一上来就被判异常。
动态页面怎么拿全:用 wait_for 代替 sleep
你会遇到什么问题:page.goto返回的 HTML 经常只是骨架,价格、列表要靠滚动和点击才出来,抓回来就是残缺的。
Crawl4AI 的无头浏览器爬取按固定顺序执行:js_code_before_wait(先触发加载)→wait_for(等某个元素出现)→delay_before_return_html(安全余量)→js_code(收尾脚本)。
config = CrawlerRunConfig( wait_for=".price-cell", # 等到价格格子出现才收 HTML scan_full_page=True, # 滚动整页,触发懒加载 scroll_delay=0.5, virtual_scroll_config={ # 无限滚动列表专用 "container_selector": ".feed", "scroll_count": 10, }, ) # async with AsyncWebCrawler() as crawler: await crawler.arun(url, config)这段在做什么:wait_for把等待交给条件而不是时间;滚动列表才加virtual_scroll_config(虚拟滚动指只渲染视口内条目的列表,滚走就回收 DOM)。需要点"加载更多"时,往js_code里放一句document.querySelector('.load-more').click()就行。
为什么不写死 sleep:固定等待轻则每页白等几秒,重则页面慢一点就抓不全;wait_for让页面快慢自己决定节奏。只有页面明显不稳时,才用delay_before_return_html补零点几秒余量。
提取出能用的数据:CSS 选 CSS,LLM 兜底
你会遇到什么问题:把 HTML 拿到手之后,字段还埋在几十个 div 里,人工解析每站都要重写一遍规则。
CSS 选择器提取(JsonCssExtractionStrategy)用一个 schema 文件定义字段,type用json-css:
crwl https://shop.example.com/products -e extract_css.yml -s products_schema.json -o jsonschema 里每条字段写baseSelector和字段级selector,例如baseSelector填.product-item,字段title填h2、price填span.price。这段在做什么:按选择器把字段抠成 JSON,-o json直接落地。改选择器就能跟着页面改版走。
LLM 指令提取(LLMExtractionStrategy)则是用自然语言描述你要什么,-e里写type: llm加 instruction,适合结构多变、语义复杂的页面,比如"提取每条评论的作者、时间和情感倾向"。
| CSS 选择器 | LLM 指令 | |
|---|---|---|
| 速度 | 快,本地完成 | 慢,走模型 |
| 稳定性 | 结构一变就失效 | 抗小改版,但可能出错 |
| 适用 | 结构稳定的列表 | 结构多变、字段靠语义判断 |
常见误区:觉得 LLM 提取总是更省事。结构稳定的页面用 CSS 又快又准,LLM 提取该花在"选择器写不动"的页面上,还省 token。
串起来:一条命令跑完三件事
crwl https://shop.example.com/products \ -p shop-admin \ -c "wait_for=.price-cell,scan_full_page=true,scroll_delay=0.5" \ -e extract_css.yml -s products_schema.json -o json这段在做什么:-p带上登录态,-c里逗号分隔的是运行时参数(智能等待加整页滚动),-e/-s负责提取,-o json输出结构化结果。要改成 LLM 提取,把-e/-s换成 LLM 策略的配置文件加 JSON schema 就行;页面是无限滚动列表时,滚动参数要改到virtual_scroll_config,那一步得走 Python 配置。
去哪深入
- 快速入门:
docs/examples/quickstart.py,可运行的最小示例,先拿一个静态页跑通 - API 参考:
docs/md_v2/api/,参数逐个有说明,配wait_for、scan_full_page时查这里 - 页面交互与动态页面抓取:
docs/md_v2/core/page-interaction.md,讲js_code执行顺序 - 虚拟滚动专项:
docs/md_v2/advanced/virtual-scroll.md,推特、Instagram 式列表的处理
仓库克隆地址:git clone https://gitcode.com/GitHub_Trending/craw/crawl4ai。
如果你要维护几条固定的数据采集线——盯竞店、收行情、抓后台报表——这套流水线够你从登录到落地 JSON 全配完。下一步:从 quickstart 跑通一个静态页,再把你的真实站点套进 Profile 和wait_for里试一轮。
【免费下载链接】crawl4ai🚀🤖 Crawl4AI: Open-source LLM Friendly Web Crawler & Scraper. Don't be shy, join here: https://discord.gg/jP8KfhDhyN项目地址: https://gitcode.com/GitHub_Trending/craw/crawl4ai
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考