无需付费搜索/抓取API,为本地智能体提供网页访问权限:SearXNG + Scrapling

Reddit r/LocalLLaMA 工具

摘要

描述了一个自托管解决方案,使用 SearXNG 进行搜索、Scrapling 和 Trafilatura 进行页面提取,为本地 AI 代理提供网络访问,从而避免使用付费 API。

我想要为一个本地优先的 agent 增加网页访问能力,但又不想依赖 Tavily、Serper、Firecrawl 之类的服务。沿着这个 agent 路线,我不想使用付费的 API 密钥,而是希望有一个由我控制的搜索服务,以及我自己能运行的页面提取功能。最终我得到了两个工具:`web_search` 和 `web_extract`。没什么花哨的,主要就是把一些好的开源组件拼在一起。 ## 1. 搜索 → SearXNG SearXNG 是一个可自托管的元搜索引擎。我在 Docker 里运行它,然后把 agent 指向它的 JSON 端点。搜索调用大致如下: ``` GET {SEARXNG_URL}/search?q=<query>&format=json&pageno=1 ``` 然后我会截取结果并规范化为:`{title, url, description}`。这里的 `description` 只是 SearXNG 的摘要片段,并不是页面内容。 配置基本就是: ``` SEARXNG_URL=http://localhost:8080 ``` 注意事项: - 在 SearXNG 的 `settings.yml` 中把 `json` 添加到 `search.formats` 里。 - 公开的 SearXNG 实例通常不适合程序化使用。 - SearXNG 只做搜索。当 agent 需要读取页面时,请使用提取功能。 ## 2. 提取 → Scrapling + Trafilatura 搜索摘要是不够的,agent 需要读取实际页面。对于 `web_extract`,我使用 Scrapling,它有两个路径: - **快速路径**:`Fetcher.get(url, impersonate="chrome")`。不需要浏览器,适合普通页面。 - **隐匿路径**:如果快速路径返回空、被屏蔽或出现验证码,则尝试使用真实的 headless 浏览器: ```python StealthyFetcher.fetch( url, headless=True, solve_cloudflare=True, block_webrtc=True, hide_canvas=True, ) ``` 隐匿路径只是一个尝试,并不能保证绕过。如果页面仍然显示 CAPTCHA 或 Cloudflare 拦截,我会将结果标记为被屏蔽/部分获取。 一旦获取到 HTML,Trafilatura 会将其转换为包含链接和表格的 Markdown。对于模型来说,Markdown 比原始 HTML 更容易处理。我还会保留一个可见文本的 fallback,用于 Trafilatura 提取不足的页面。 ## 其他重要部分 - **PDF**:PDF 的 URL 会通过 pypdf 处理。 - **验证码检测**:CAPTCHA/安全页面会被标记出来,而不是当作真实内容。 - **SSRF 防护**:检查请求的 URL 和重定向是否指向私有/内部范围。最终 URL 也会被检查。注意:这并非针对浏览器每个子请求的网络级防护。 - **可选摘要功能**:大型页面可以通过一个可配置的辅助模型进行摘要,然后再放回上下文。 ## 为什么选择这个组合 - 这个路径不需要付费的搜索/抓取 API 密钥。 - 查询通过我的 SearXNG 实例发出,而不是通过绑定我账户的供应商 API。 - SearXNG 仍然会访问上游引擎,所以并非“零第三方接触”。 - 大多数页面使用快速路径,只有需要时才会启动浏览器。 - 最终输出是 Markdown,而不是 HTML 大杂烩。 ## 诚实的权衡 - 隐匿路径很慢,只把它当作 fallback。 - SearXNG 的质量取决于启用的上游引擎和速率限制。付费搜索 API 可能仍然更好。这对于我的使用场景已经足够。 - Cloudflare/浏览器抓取始终是一个动态目标。 - 我不敢说这是最优配置,这只是对我有效且可自托管的一种方式。 好奇其他人都在用什么。有没有人找到比 SearXNG 更好的自托管搜索方案,或者比完整浏览器更轻量级的替代方案来处理那些棘手的页面?如果有人也在尝试类似方案,我很乐意分享更多细节。
查看原文

相似文章