Skip to main content
Firecrawl彻底爬取网站,确保全面的数据提取,同时绕过任何网络拦截机制。以下是其工作原理:
  1. URL分析: 从指定的URL开始,通过查看网站地图来识别链接,然后爬取网站。如果找不到网站地图,它将跟随链接爬取网站。
  2. 递归遍历: 递归跟踪每个链接以发现所有子页面。
  3. 内容抓取: 从每个访问的页面收集内容,同时处理JavaScript渲染或速率限制等复杂问题。
  4. 结果编译: 将收集的数据转换为干净的markdown或结构化输出,非常适合LLM处理或任何其他任务。
这种方法保证了从任何起始URL进行彻底的爬取和数据收集。

爬取

/crawl 端点

用于爬取URL及其所有可访问的子页面。这会提交一个爬取任务并返回一个任务ID,用于检查爬取状态。
默认情况下 - 如果页面的子链接不是您提供的URL的子链接,爬取将忽略这些子链接。因此,如果您爬取website.com/blogs/,则不会返回website.com/other-parent/blog-1。如果您想要website.com/other-parent/blog-1,请使用allowBackwardLinks参数

安装

# 安装firecrawl-py包
pip install firecrawl-py

使用方法

from firecrawl import FirecrawlApp

app = FirecrawlApp(api_key="fc-YOUR_API_KEY")

# 爬取一个网站:
crawl_status = app.crawl_url(
  'https://firecrawl.dev', 
  params={
    'limit': 100, 
    'scrapeOptions': {'formats': ['markdown', 'html']}
  },
  poll_interval=30
)
print(crawl_status)

响应

如果您使用cURL或SDK上的async crawl函数,这将返回一个ID,您可以使用它来检查爬取状态。
{
  "success": true,
  "id": "123-456-789",
  "url": "https://api.firecrawl.dev/v1/crawl/123-456-789"
}

检查爬取任务

用于检查爬取任务的状态并获取其结果。
此端点仅适用于正在进行中或最近完成的爬取。
# 检查爬取任务状态
crawl_status = app.check_crawl_status("<crawl_id>")
print(crawl_status)

响应处理

响应根据爬取状态而变化。 对于未完成或超过10MB的大型响应,会提供一个nextURL参数。您必须请求此URL以检索下一个10MB的数据。如果next参数不存在,则表示爬取数据的结束。 skip参数设置每个返回结果块的最大结果数。
skip和next参数仅在直接访问API时相关。如果您使用SDK,我们会为您处理这些参数,并一次性返回所有结果。
{
  "status": "scraping",
  "total": 36,
  "completed": 10,
  "creditsUsed": 10,
  "expiresAt": "2024-00-00T00:00:00.000Z",
  "next": "https://api.firecrawl.dev/v1/crawl/123-456-789?skip=10",
  "data": [
    {
      "markdown": "[Firecrawl Docs home page![light logo](https://mintlify.s3-us-west-1.amazonaws.com/firecrawl/logo/light.svg)!...",
      "html": "<!DOCTYPE html><html lang=\"en\" class=\"js-focus-visible lg:[--scroll-mt:9.5rem]\" data-js-focus-visible=\"\">...",
      "metadata": {
        "title": "Build a 'Chat with website' using Groq Llama 3 | Firecrawl",
        "language": "en",
        "sourceURL": "https://docs.firecrawl.dev/learn/rag-llama3",
        "description": "Learn how to use Firecrawl, Groq Llama 3, and Langchain to build a 'Chat with your website' bot.",
        "ogLocaleAlternate": [],
        "statusCode": 200
      }
    },
    ...
  ]
}

爬取WebSocket

Firecrawl基于WebSocket的方法爬取URL并监视,实现了实时数据提取和监控。使用URL启动爬取,并通过页面限制、允许的域名和输出格式等选项自定义它,非常适合即时数据处理需求。
# 在异步函数内部...
nest_asyncio.apply()

# 定义事件处理器
def on_document(detail):
    print("DOC", detail)

def on_error(detail):
    print("ERR", detail['error'])

def on_done(detail):
    print("DONE", detail['status'])

# 启动爬取和监视过程的函数
async def start_crawl_and_watch():
    # 初始化爬取任务并获取监视器
    watcher = app.crawl_url_and_watch('firecrawl.dev', { 'excludePaths': ['blog/*'], 'limit': 5 })

    # 添加事件监听器
    watcher.add_event_listener("document", on_document)
    watcher.add_event_listener("error", on_error)
    watcher.add_event_listener("done", on_done)

    # 启动监视器
    await watcher.connect()

# 运行事件循环
await start_crawl_and_watch()

爬取Webhook

您现在可以向/crawl端点传递一个webhook参数。当爬取开始、更新和完成时,这将向您指定的URL发送POST请求。 webhook现在会为每个爬取的页面触发,而不仅仅是在最后返回整个结果。
cURL
# 发送POST请求到Firecrawl API,设置webhook接收爬取结果
curl -X POST https://api.firecrawl.dev/v1/crawl \
    -H 'Content-Type: application/json' \
    -H 'Authorization: Bearer YOUR_API_KEY' \
    -d '{
      "url": "https://docs.firecrawl.dev",
      "limit": 100,
      "webhook": "https://example.com/webhook"
    }'

Webhook事件

现在有4种类型的事件:
  • crawl.started - 当爬取开始时触发。
  • crawl.page - 为每个爬取的页面触发。
  • crawl.completed - 当爬取完成时触发,让您知道它已完成(测试版)**
  • crawl.failed - 当爬取失败时触发。

Webhook响应

  • success - 如果webhook成功正确爬取页面。
  • type - 发生的事件类型。
  • id - 爬取的ID。
  • data - 抓取的数据(数组)。这只会在crawl.page上非空,如果页面成功抓取,将包含1个项目。响应与/scrape端点相同。
  • error - 如果webhook失败,这将包含错误消息。
**测试版考虑因素
  • 有极小的可能性crawl.completed事件可能在最终的crawl.page事件仍在处理时触发。我们正在修复这个问题。