
Crawl4AI v0.7.5 深度解析Docker Hooks 系统、函数式钩子与 HTTPS 链接保留实战【免费下载链接】crawl4ai Crawl4AI: Open-source LLM Friendly Web Crawler Scraper. Dont be shy, join here: https://discord.gg/jP8KfhDhyN项目地址: https://gitcode.com/GitHub_Trending/craw/crawl4aiCrawl4AI v0.7.5 是一个围绕可扩展性 安全性展开的版本它把自定义 Python 函数注入到爬取流水线关键节点的能力Docker Hooks 系统正式产品化并提供了函数到字符串的自动转换工具链同时增强了 LLM 集成的提供商与参数控制能力修复了 HTTPS 内部链接被降级的问题。读完本文你将掌握在 Docker 部署形态下通过 REST API 或 SDK 客户端注入钩子的完整方式、钩子底层执行机制、hooks_to_string()的实现原理与限制以及preserve_https_for_internal_links等配置项的落地细节。版本总览v0.7.5 的官方发布说明见 docs/md_v2/blog/releases/v0.7.5.md主要新增内容如下Docker Hooks 系统在爬取流水线的关键节点以函数形式注入自定义 Python 逻辑函数式钩子新增hooks_to_string()工具Docker 客户端可自动完成函数到字符串的转换增强的 LLM 集成支持自定义提供商、temperature 控制与 base URL 配置HTTPS 保留内部链接在处理过程中保持 HTTPS 协议Bug 修复解决多个社区上报的问题改进的 Docker 错误处理更完整的调试信息与可靠性。配套的完整可运行演示脚本位于 docs/releases_review/demo_v0.7.5.py它覆盖了 Docker 钩子字符串与函数两种形态、LLM 配置和 HTTPS 保留三大主题本文后文的代码示例与其保持一致。Docker Hooks 系统在 8 个关键节点注入自定义逻辑每个抓取项目都需要自定义逻辑——认证注入、资源屏蔽提速、懒加载滚动。传统方案要么 fork 代码要么依赖复杂的绕路写法。Docker Hooks 让你在不改源码的前提下把自定义 Python 函数挂到爬取流水线的关键位置。字符串钩子REST API 完整示例最直接的用法是把钩子写成字符串随请求体一起发到 Docker API。以下是对 httpbin.org 的真实可用配置演示了屏蔽图片提速、滚动到底部加载懒加载内容、注入自定义请求头三类典型场景import requests # 针对 httpbin.org 的真实可用钩子 hooks_config { on_page_context_created: async def hook(page, context, **kwargs): print(Hook: Setting up page context) # 屏蔽图片加速爬取 await context.route(**/*.{png,jpg,jpeg,gif,webp}, lambda route: route.abort()) print(Hook: Images blocked) return page , before_retrieve_html: async def hook(page, context, **kwargs): print(Hook: Before retrieving HTML) # 滚动到底部触发懒加载内容 await page.evaluate(window.scrollTo(0, document.body.scrollHeight)) await page.wait_for_timeout(1000) print(Hook: Scrolled to bottom) return page , before_goto: async def hook(page, context, url, **kwargs): print(fHook: About to navigate to {url}) # 添加自定义请求头 await page.set_extra_http_headers({ X-Test-Header: crawl4ai-hooks-test }) return page } # 通过 Docker API 测试 payload { urls: [https://httpbin.org/html], hooks: { code: hooks_config, timeout: 30 } } response requests.post(http://localhost:11235/crawl, jsonpayload) result response.json() if result.get(success): print(✅ Hooks executed successfully!) print(fContent length: {len(result.get(markdown, ))} characters)请求体中hooks是一个对象code为钩子点名称 → 函数源码字符串的映射timeout为钩子执行的超时时间秒。可用钩子点清单及其触发时机发布说明中列出的 8 个钩子点如下钩子点触发时机on_browser_created浏览器实例创建完成后on_page_context_created页面上下文创建后可配置路由拦截、视口等before_goto导航goto之前适合设置请求头after_goto导航完成之后on_user_agent_updatedUser Agent 被更新时on_execution_started本次爬取执行初始化时before_retrieve_html提取 HTML 之前适合滚动/等待before_return_html返回最终 HTML 之前钩子点清单在源码中集中定义async_crawler_strategy.py 在策略初始化时构建了 9 个钩子点的字典——除上表 8 个外还包含一个on_execution_ended执行结束时触发文档的 8 点清单是 Docker API 对外暴露的集合。每个钩子点在流水线中的实际调用位置可以从源码中逐一印证on_browser_created在start()中浏览器启动后触发接收browser与context参数见 async_crawler_strategy.py#L127-L136on_page_context_created页面上下文就绪后调用同时传入page、context、configon_execution_started执行开始时触发async_crawler_strategy.py#L1019before_retrieve_html/before_return_html分别位于 HTML 提取前后before_return_html还能拿到当前html字符串用于最终加工async_crawler_strategy.py#L1088。两个值得注意的实现细节来自 set_hook / execute_hook 源码同步与异步钩子都受支持execute_hook()会用asyncio.iscoroutinefunction()判断钩子类型是协程函数就await否则同步调用。因此文档示例统一用async def hook(page, context, **kwargs)但同步函数同样可行透传语义若某钩子点未设置钩子execute_hook()直接返回第一个位置参数通常是page保证流水线在无钩子时行为不变。在本地非 Docker进程中同一套钩子机制通过crawler_strategy.set_hook(hook_type, hook)直接注册hook_type取值与上表一致非法类型会抛出ValueError。函数式钩子hooks_to_string() 工具把钩子写成字符串虽然可行但失去了 IDE 补全、类型检查和 linting 能力。v0.7.5 引入了函数式写法先写普通 Python 函数再用hooks_to_string()批量转换为 API 所需的字符串形态。from crawl4ai import hooks_to_string import requests # 以普通 Python 函数定义钩子享有完整 IDE 支持 async def on_page_context_created(page, context, **kwargs): 屏蔽图片加速爬取 await context.route(**/*.{png,jpg,jpeg,gif,webp}, lambda route: route.abort()) await page.set_viewport_size({width: 1920, height: 1080}) return page async def before_goto(page, context, url, **kwargs): 添加自定义请求头 await page.set_extra_http_headers({ X-Crawl4AI: v0.7.5, X-Custom-Header: my-value }) return page # 将函数转换为字符串 hooks_code hooks_to_string({ on_page_context_created: on_page_context_created, before_goto: before_goto }) # 交给 REST API payload { urls: [https://httpbin.org/html], hooks: {code: hooks_code, timeout: 30} } response requests.post(http://localhost:11235/crawl, jsonpayload)hooks_to_string()的实现位于 utils.py#L3750-L3794逻辑非常直接def hooks_to_string(hooks: Dict[str, Callable]) - Dict[str, str]: result {} for hook_name, hook_func in hooks.items(): if not callable(hook_func): raise ValueError(fHook {hook_name} must be a callable function, got {type(hook_func)}) try: source inspect.getsource(hook_func) source textwrap.dedent(source) result[hook_name] source except (OSError, TypeError) as e: raise ValueError( fCannot extract source code for hook {hook_name}. fMake sure the function is defined in a file (not interactively). Error: {e} ) return result由此可以确认两点约束函数必须定义在文件中能通过inspect.getsource()取到源码交互式解释器里临时定义的函数会转换失败报错信息明确提示了这一点取值前会用textwrap.dedent()去掉缩进保证生成的字符串是可直接执行的干净源码。该工具已从包顶层导出from crawl4ai import hooks_to_string即可使用见 crawl4ai/init.py#L111。Docker 客户端自动转换推荐用法更进一步Crawl4aiDockerClient支持直接传函数对象转换在服务端请求构造时自动完成from crawl4ai.docker_client import Crawl4aiDockerClient async def on_page_context_created(page, context, **kwargs): await context.route(**/*.{png,jpg,jpeg,gif,webp}, lambda route: route.abort()) return page async def before_retrieve_html(page, context, **kwargs): # 滚动以加载懒加载内容 await page.evaluate(window.scrollTo(0, document.body.scrollHeight)) await page.wait_for_timeout(1000) return page # 使用 Docker 客户端 —— 转换自动发生 client Crawl4aiDockerClient(base_urlhttp://localhost:11235) results await client.crawl( urls[https://httpbin.org/html], hooks{ on_page_context_created: on_page_context_created, before_retrieve_html: before_retrieve_html }, hooks_timeout30 ) if results and results.success: print(f✅ Hooks executed! HTML length: {len(results.html)})自动转换发生在 _prepare_request()它对hooks字典逐值检查只要发现任意值是callable就整体走hooks_to_string()转换如果传入的已经是字符串形态则原样透传因此字符串钩子依然可用无破坏性变更。最终的请求体结构与直接调 REST API 时完全一致{code: ..., timeout: ...}hooks_timeout缺省值为 30 秒。函数式钩子带来的收益完整的 IDE 补全与高亮、类型检查与 lint、更易测试与调试、可跨项目复用、Docker 客户端内自动转换。一个值得了解的前向演进从当前仓库的源码结构看Docker 服务端在安全加固后引入了声明式钩子注册表 deploy/docker/hook_registry.py——请求只能从block_resources、add_cookies、set_headers、scroll_to_bottom、wait_for_timeout等固定动作中按参数选择而不再对任意用户代码做编译执行对确实需要任意钩子代码的自托管场景仍保留进程内crawler_strategy.set_hook(...)的完整能力。如果你正在使用较新的服务端镜像建议以服务端实际接受的钩子格式为准。增强的 LLM 集成v0.7.5 增强了 LLM 提取链路支持自定义提供商、temperature 参数控制生成随机性以及自定义base_url指向私有/兼容端点。多提供商与 temperature 控制from crawl4ai import AsyncWebCrawler, CrawlerRunConfig from crawl4ai.extraction_strategy import LLMExtractionStrategy async def test_llm_providers(): # 自定义提供商 temperature openai_strategy LLMExtractionStrategy( providergemini/gemini-2.5-flash-lite, api_tokenyour-api-token, temperature0.7, # v0.7.5 新增 instructionSummarize this page in one sentence ) async with AsyncWebCrawler() as crawler: result await crawler.arun( https://example.com, configCrawlerRunConfig(extraction_strategyopenai_strategy) ) if result.success: print(✅ LLM extraction completed) print(result.extracted_content)在源码侧extraction_strategy.py 中的 LLM 配置构造支持base_url参数自定义 API 端点并通过extra_args透传temperature、max_tokens等请求级参数——这正是发布说明中自定义 temperature 控制创意度base_url 指向自定义 API 端点两项能力的落点。多提供商的环境变量支持与 Docker API 集成也是本版本的增强点。Docker API 侧的 LLM 配置通过 REST API 调用时/md端点同样接受 LLM 参数llm_payload { url: https://example.com, f: llm, q: Summarize this page in one sentence., provider: gemini/gemini-2.5-flash-lite, temperature: 0.7 } response requests.post(http://localhost:11235/md, jsonllm_payload)即providertemperature与q指令一起下发服务端按指定提供商执行 LLM 摘要/提取。HTTPS 保留让内部链接始终走安全协议问题现代 Web 应用普遍要求全站 HTTPS。当爬虫在处理过程中把内部链接从 HTTPS 降级为 HTTP 时认证会失败、浏览器会出现安全告警。方案v0.7.5 新增preserve_https_for_internal_links配置在链接归一化阶段保持安全协议不降级。该参数定义于 async_configs.py#L1674缺省值为False即旧行为并会进入配置的dump()序列化async_configs.py#L2168开启后由内容抓取链路把preserve_https标记传递下去见 content_scraping_strategy.py#L263从而在内部链接处理时保留原协议。完整用法配合过滤链与 BFS 深度爬取策略from crawl4ai import AsyncWebCrawler, CrawlerRunConfig, FilterChain, URLPatternFilter, BFSDeepCrawlStrategy async def test_https_preservation(): # 配置只爬目标站点 url_filter URLPatternFilter( patterns[^(https:\/\/)?quotes\.toscrape\.com(\/.*)?$] ) config CrawlerRunConfig( exclude_external_linksTrue, preserve_https_for_internal_linksTrue, # v0.7.5 新增 deep_crawl_strategyBFSDeepCrawlStrategy( max_depth2, max_pages5, filter_chainFilterChain([url_filter]) ) ) async with AsyncWebCrawler() as crawler: async for result in await crawler.arun( urlhttps://quotes.toscrape.com, configconfig ): # 所有内部链接均保持 HTTPS internal_links [link[href] for link in result.links[internal]] https_links [link for link in internal_links if link.startswith(https://)] print(fHTTPS links preserved: {len(https_links)}/{len(internal_links)}) for link in https_links[:3]: print(f → {link})适用前提该参数影响的是内部链接的协议处理对外部链接的排除/保留仍由exclude_external_links与过滤器链路共同控制。Bug 修复与配置更新主要修复URL 处理修复查询参数中号丢失的问题#1332代理配置增强代理字符串解析旧的proxy参数被弃用Docker 错误处理提供更完整的错误信息与状态码内存管理修复长会话下的内存泄漏JWT 认证修复 Docker JWT 校验问题#1442Playwright Stealth修复 stealth 特性在 Playwright 集成下的失效#1481API 配置修复配置处理逻辑避免覆盖用户显式提供的设置#1505Docker 过滤器序列化解决深度爬取策略的 JSON 编码错误#1419LLM 提供商支持修复自适应爬虫的自定义 LLM 提供商集成#1291性能问题修复退避策略失效与超时处理#989。此外还修复了社区通过 issue 与社区讨论上报的若干问题浏览器配置引用错误、与 cssselect 的依赖冲突、认证失败时的错误信息改进、多种代理配置的兼容性、URL 归一化的边界情况等。代理配置的新结构与proxy参数弃用配套代理改为结构化配置# 旧代理配置已弃用 # browser_config BrowserConfig(proxyhttp://proxy:8080) # 新的增强代理配置 browser_config BrowserConfig( proxy_config{ server: http://proxy:8080, username: optional-user, password: optional-pass } )新结构把服务地址与认证信息拆开便于配合代理轮转、粘性会话等更复杂的代理场景。破坏性变更要求 Python 3.10不再支持 Python 3.9升级前需先升级运行环境proxy参数弃用请迁移到上文proxy_config结构新增依赖cssselect用于改进 CSS 选择器处理。快速上手# 安装指定版本 pip install crawl4ai0.7.5 # Docker 部署 docker pull unclecode/crawl4ai:latest docker run -p 11235:11235 unclecode/crawl4ai:latest服务就绪后默认端口 11235可以直接运行发布说明中提到的演示脚本验证三大特性# 运行 v0.7.5 官方可运行示例Docker 钩子、LLM 配置、HTTPS 保留 python docs/releases_review/demo_v0.7.5.py该脚本会先探测http://localhost:11235上的 Docker 服务是否可用不可用时给出docker run -p 11235:11235 unclecode/crawl4ai:latest的启动提示适合在升级后做一次端到端冒烟验证。小结v0.7.5 的核心价值在于把流水线定制从 fork 源码变成了 API 能力8 个钩子点覆盖了从浏览器创建到 HTML 返回的完整生命周期字符串钩子保证与现有集成兼容函数式钩子 hooks_to_string() Docker 客户端自动转换则补上了开发体验短板配合 LLM 提供商/temperature 的细粒度控制和 HTTPS 内部链接保留这个版本在可扩展性与安全性上都向前迈了一步。升级时只需注意 Python 3.10 的底线与proxy→proxy_config的迁移这两点破坏性变更。【免费下载链接】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),仅供参考