
Haystack Firecrawl 集成实战用 FirecrawlCrawler 与 FirecrawlWebSearch 构建网站抓取与联网检索管道【免费下载链接】haystackOpen-source AI orchestration framework for building context-engineered, production-ready LLM applications. Design modular pipelines and agent workflows with explicit control over retrieval, routing, memory, and generation. Built for scalable agents, RAG, multimodal applications, semantic search, and conversational systems.项目地址: https://gitcode.com/GitHub_Trending/ha/haystack本文聚焦 Haystack 官方参考文档中收录的 Firecrawl 集成见 集成 API 参考深入讲解其中两个核心组件负责整站爬取的FirecrawlCrawler与负责联网搜索并抓取正文的FirecrawlWebSearch。读完本文你将掌握这两个组件的完整 API 签名、参数语义、同步/异步调用方式以及如何把它们接入索引管道与 RAG 管道直接用 Firecrawl 返回的 Markdown 结构化内容喂给 LLM。Firecrawl 集成概览Firecrawl 是一项网页爬取与内容抽取服务它能将网站页面转换为适合 LLM 消费的结构化格式典型如 Markdown。在 Haystack 中Firecrawl 集成以firecrawl-haystack包的形式提供包含两个组件分别落在两类组件族中组件归属类别核心职责FirecrawlCrawlerFetchers数据抓取从一个或多个起始 URL 出发沿链接爬取子页面返回 HaystackDocument列表FirecrawlWebSearchWebSearch联网搜索封装 Firecrawl Search API搜索网页并抓取结果正文返回Document与links在 Fetchers 组件索引 中FirecrawlCrawler与GoogleDriveFetcher、LinkContentFetcher、TavilyFetcher等并列定位于从 URL、网络爬虫或云存储获取外部内容在 WebSearch 组件索引 中FirecrawlWebSearch与BraveWebSearch、SerperDevWebSearch、TavilyWebSearch等并列定位于用组件在互联网上查找答案。与普通搜索组件不同Firecrawl 搜索返回的是经过抓取与结构化处理的页面正文因此通常无需再串联LinkContentFetcher单独读取网页。两个组件都要求持有 Firecrawl API key默认读取FIRECRAWL_API_KEY环境变量也可在初始化时显式传入。安装pip install firecrawl-haystack安装后即可从两个入口导入组件from haystack_integrations.components.fetchers.firecrawl import FirecrawlCrawler from haystack_integrations.components.websearch.firecrawl import FirecrawlWebSearch鉴权方式Secret 与环境变量Haystack 推荐用Secret对象管理 API key。Secret是 Haystack 核心工具见 haystack/utils/init.py 中的导出支持从环境变量解析密钥。两种等价写法from haystack.utils import Secret # 方式一从环境变量读取组件默认行为 api_key Secret.from_env_var(FIRECRAWL_API_KEY) # 方式二直接以字符串注入 api_key Secret.from_token(your-api-key)FirecrawlCrawler(api_keySecret.from_token(your-api-key))是官方组件文档FirecrawlCrawler 页面给出的显式传参方式。API key 需要先在 Firecrawl 官网注册获取。FirecrawlCrawler整站爬取组件FirecrawlCrawler从每个给定的起始 URL 开始爬取沿页面链接发现子页面直到达到可配置的上限。它适合摄入整个网站或文档站点而不仅仅是单个页面——这是它与单页抓取器如LinkContentFetcher最本质的区别。初始化参数__init__( api_key: Secret Secret.from_env_var(FIRECRAWL_API_KEY), params: dict[str, Any] | None None, ) - Noneapi_keyFirecrawl 的 API key默认从FIRECRAWL_API_KEY环境变量读取。params爬取请求参数透传给 Firecrawl 的 crawl 接口完整参数列表见 Firecrawl API 文档。默认值为{limit: 1, scrape_options: {formats: [markdown]}}。crawl 请求参数params官方组件文档列出的两个最常用参数参数默认值作用limit1每个 URL 最多爬取的页面数。若不设置 limitFirecrawl 可能爬取全部子页面快速消耗积分额度scrape_options{formats: [markdown]}控制输出格式Markdown 是适合 LLM 输入的结构化格式例如限制每个起始 URL 只爬 5 个页面crawler FirecrawlCrawler( api_keySecret.from_env_var(FIRECRAWL_API_KEY), params{limit: 5}, )run 与 run_asyncrun(urls: list[str], params: dict[str, Any] | None None) - dict[str, Any] run_async( urls: list[str], params: dict[str, Any] | None None ) - dict[str, Any]urls要爬取的 URL 列表。params本次运行的爬取参数覆盖项。注意语义如果传入会完全替换初始化时的params而不是合并。返回值是一个字典包含键documents爬取得到的 Document 列表每个被抓取的页面对应一个 Document。warm_up 与 warm_up_asyncwarm_up() - None warm_up_async() - Nonewarm_up()用于预热同步 Firecrawl 客户端warm_up_async()预热异步客户端。在管道中运行组件前调用 warm-up 可以避免首次调用的冷启动开销。独立使用参考文档给出的最小可用示例from haystack_integrations.components.fetchers.firecrawl import FirecrawlCrawler crawler FirecrawlCrawler( api_keySecret.from_env_var(FIRECRAWL_API_KEY), params{limit: 5}, ) crawler.warm_up() result crawler.run(urls[https://docs.haystack.deepset.ai/docs/intro]) documents result[documents]更完整的写法是遍历结果读取每个 Document 的元数据from haystack_integrations.components.fetchers.firecrawl import FirecrawlCrawler crawler FirecrawlCrawler(params{limit: 3}) result crawler.run(urls[https://docs.haystack.deepset.ai/docs/intro]) documents result[documents] for doc in documents: print(f{doc.meta.get(title)} - {doc.meta.get(url)})输出结构Document 的 content 与 meta每个被抓取的页面成为一个独立的Document页面正文放在content字段标题title、URLurl、描述description等元数据放在meta字段。这与 Haystack 核心 Document 数据类 的定义一致——content存放文档文本meta存放必须可 JSON 序列化的附加元数据。因此在接入下游组件时你可以直接通过doc.content获取可喂给 LLM 的正文通过doc.meta回溯页面来源。在索引管道中使用官方组件文档给出了完整的索引管道示例用FirecrawlCrawler爬取文档站点经DocumentSplitter切分后写入InMemoryDocumentStore构成抓取 → 切分 → 写入的标准摄入链路from haystack import Pipeline from haystack.document_stores.in_memory import InMemoryDocumentStore from haystack.components.preprocessors import DocumentSplitter from haystack.components.writers import DocumentWriter from haystack_integrations.components.fetchers.firecrawl import FirecrawlCrawler document_store InMemoryDocumentStore() crawler FirecrawlCrawler(params{limit: 10}) splitter DocumentSplitter(split_bysentence, split_length5) writer DocumentWriter(document_storedocument_store) indexing_pipeline Pipeline() indexing_pipeline.add_component(crawler, crawler) indexing_pipeline.add_component(splitter, splitter) indexing_pipeline.add_component(writer, writer) indexing_pipeline.connect(crawler.documents, splitter.documents) indexing_pipeline.connect(splitter.documents, writer.documents) indexing_pipeline.run( data{ crawler: { urls: [https://docs.haystack.deepset.ai/docs/intro], }, }, )这里crawler.documents是FirecrawlCrawler的输出 socket管道运行参数通过data字典按组件名传入起始 URL 列表。整套链路展示了如何把整站内容批量转成可检索的知识库。FirecrawlWebSearch联网搜索组件FirecrawlWebSearch封装 Firecrawl 的 Search API给定查询词后它先搜索网页再爬取结果页面把结构化正文作为 HaystackDocument列表返回同时返回底层 URL 列表。它遵循 Haystack 标准的 WebSearch 组件接口可以和其他 WebSearch 组件互换使用。初始化参数__init__( api_key: Secret Secret.from_env_var(FIRECRAWL_API_KEY), top_k: int | None 10, search_params: dict[str, Any] | None None, ) - Noneapi_keyFirecrawl API key默认从FIRECRAWL_API_KEY环境变量读取。top_k最多返回的 Document 数量默认10。可被search_params中的limit参数覆盖。search_params透传给 Firecrawl Search API 的附加参数完整列表见 Firecrawl API 文档。官方参考文档明确列出的受支持键包括tbs、location、scrape_options、sources、categories、timeout。run 与 run_asyncrun(query: str, search_params: dict[str, Any] | None None) - dict[str, Any] run_async( query: str, search_params: dict[str, Any] | None None ) - dict[str, Any]query搜索查询字符串。search_params本次运行的搜索参数覆盖项若传入则完全替换初始化时的search_params。返回值是一个字典包含两个键documents包含搜索结果正文的 Document 列表。links搜索结果对应的 URL 列表。warm_up 与 warm_up_async与FirecrawlCrawler一致warm_up()预热同步客户端warm_up_async()预热异步客户端。独立使用参考文档给出的最小示例from haystack_integrations.components.websearch.firecrawl import FirecrawlWebSearch from haystack.utils import Secret websearch FirecrawlWebSearch( api_keySecret.from_env_var(FIRECRAWL_API_KEY), top_k5, ) result websearch.run(queryWhat is Haystack by deepset?) documents result[documents] links result[links]配合scrape_options指定 Markdown 格式并遍历正文的完整写法from haystack_integrations.components.websearch.firecrawl import FirecrawlWebSearch from haystack.utils import Secret web_search FirecrawlWebSearch( api_keySecret.from_env_var(FIRECRAWL_API_KEY), top_k5, search_params{scrape_options: {formats: [markdown]}}, ) query What is Haystack by deepset? response web_search.run(queryquery) for doc in response[documents]: print(doc.content)在 RAG 管道中使用FirecrawlWebSearch的一个关键优势是它返回的documents已是抓取并结构化后的页面正文可以直接接入ChatPromptBuilder作为 LLM 的上下文无需额外的抓取组件。官方组件文档FirecrawlWebSearch 页面给出了完整的 RAG 管道示例from haystack import Pipeline from haystack.utils import Secret from haystack.components.builders.chat_prompt_builder import ChatPromptBuilder from haystack.components.generators.chat import OpenAIChatGenerator from haystack_integrations.components.websearch.firecrawl import FirecrawlWebSearch from haystack.dataclasses import ChatMessage web_search FirecrawlWebSearch( api_keySecret.from_env_var(FIRECRAWL_API_KEY), top_k2, search_params{scrape_options: {formats: [markdown]}}, ) prompt_template [ ChatMessage.from_system(You are a helpful assistant.), ChatMessage.from_user( Given the information below:\n {% for document in documents %}{{ document.content }}\n{% endfor %}\n Answer the following question: {{ query }}.\nAnswer:, ), ] prompt_builder ChatPromptBuilder( templateprompt_template, required_variables{query, documents}, ) llm OpenAIChatGenerator( api_keySecret.from_env_var(OPENAI_API_KEY), modelgpt-5-nano, ) pipe Pipeline() pipe.add_component(search, web_search) pipe.add_component(prompt_builder, prompt_builder) pipe.add_component(llm, llm) pipe.connect(search.documents, prompt_builder.documents) pipe.connect(prompt_builder.prompt, llm.messages) query What is Haystack by deepset? result pipe.run(data{search: {query: query}, prompt_builder: {query: query}}) print(result[llm][replies][0].text)该管道的数据流为FirecrawlWebSearch搜索并抓取正文 →ChatPromptBuilder把文档拼进模板生成 prompt →OpenAIChatGenerator基于上下文作答。由于FirecrawlWebSearch遵循标准 WebSearch 组件接口它的documents输出也可以被ComponentTool见 haystack/tools/component_tool.py包装成 Agent 可调用的工具让智能体自主执行联网检索。同步与异步支持两个组件都同时提供同步与异步两套接口便于适配不同的执行场景组件同步异步FirecrawlCrawlerwarm_up()/run()warm_up_async()/run_async()FirecrawlWebSearchwarm_up()/run()warm_up_async()/run_async()同步接口适合在传统Pipeline中顺序执行异步接口则适合高并发抓取/搜索场景可以搭配 Haystack 的异步管道能力批量处理多个 URL 或查询。参考文档中两组接口的参数与返回值语义完全一致异步版本只是执行模型不同。最佳实践与注意事项综合参考文档与组件文档使用 Firecrawl 集成时有几点值得注意务必设置limit控制爬取范围FirecrawlCrawler的默认limit是1如果不显式设置Firecrawl 可能爬取所有子页面并快速消耗积分。建议按站点规模设置合理的limit如{limit: 5}或{limit: 10}。参数覆盖是整体替换而非合并无论是FirecrawlCrawler.run的params还是FirecrawlWebSearch.run的search_params只要传入就会完全替换初始化时的参数。若只想微调需在调用时重新给出完整参数集。优先输出 Markdown默认的scrape_options{formats: [markdown]}是最适合 LLM 消费的格式搜索场景下同样建议在search_params中显式指定scrape_options。用Secret管理密钥默认从FIRECRAWL_API_KEY环境变量读取避免把密钥硬编码进代码或管道配置。抓取后按需切分爬取/搜索返回的页面正文可能很长接入索引管道时建议像官方示例那样先用DocumentSplitter切分再写入文档存储以提升后续检索质量。小结Firecrawl 集成通过两个互补的组件把整站内容摄入和联网实时检索两类高频需求接入 Haystack 管道FirecrawlCrawler负责从起始 URL 出发深挖子页面适合批量构建知识库FirecrawlWebSearch负责搜索并直接返回结构化正文适合 RAG 与 Agent 的实时联网查询。两者都以 Markdown 形式返回可直接喂给 LLM 的 Document配合 Haystack 的Pipeline、DocumentSplitter、ChatPromptBuilder等核心组件即可快速落地生产级应用。更完整的组件用法可进一步阅读 FirecrawlCrawler 组件文档 与 FirecrawlWebSearch 组件文档API 签名细节以 集成 API 参考 为准。【免费下载链接】haystackOpen-source AI orchestration framework for building context-engineered, production-ready LLM applications. Design modular pipelines and agent workflows with explicit control over retrieval, routing, memory, and generation. Built for scalable agents, RAG, multimodal applications, semantic search, and conversational systems.项目地址: https://gitcode.com/GitHub_Trending/ha/haystack创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考