Firecrawl 彻底爬取网站,确保全面的数据提取,同时绕过任何网络阻止机制。其工作原理如下:
-
URL 分析:
从一个指定的 URL 开始,通过查看站点地图来识别链接,然后爬取网站。如果没有找到站点地图,它将按照链接爬取网站。
-
递归遍历:
递归地跟随每个链接以发现所有子页面。
-
内容抓取:
从每个访问过的页面中收集内容,同时处理诸如 JavaScript 渲染或速率限制等复杂性。
-
结果编译:
将收集到的数据转换为干净的 markdown 或结构化输出,非常适合 LLM 处理或其他任务。
此方法保证了从任何起始 URL 进行彻底的爬取和数据收集。
/crawl 端点
用于爬取一个 URL 及其所有可访问的子页面。这提交了一个爬取作业,并返回一个作业 ID,用于检查爬取状态。
默认情况下 - 如果子链接不是您提供的 URL 的子节点,爬取将忽略这些子链接。因此,如果您爬取 website.com/blogs/,则不会返回 website.com/other-parent/blog-1。如果您需要 website.com/other-parent/blog-1,请使用 allowBackwardLinks
参数。
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 的大型响应,会提供一个 next
URL 参数。您必须请求此 URL 以检索下一组 10MB 的数据。如果缺少 next
参数,则表示爬取数据的结束。
skip 参数设置了每次返回的结果块的最大数量。
当直接调用 API 时,skip 和 next 参数才相关。如果您使用的是 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!...",
"html": "<!DOCTYPE html><html lang=\"en\" class=\"js-focus-visible lg:[--scroll-mt:9.5rem]\" data-js-focus-visible=\"\">...",
"metadata": {
"title": "使用 Groq Llama 3 构建 '与网站聊天' | Firecrawl",
"language": "en",
"sourceURL": "https://docs.firecrawl.dev/learn/rag-llama3",
"description": "学习如何使用 Firecrawl、Groq Llama 3 和 Langchain 构建一个 '与您的网站聊天' 机器人。",
"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
现在可以将 webhook
参数传递给 /crawl
端点。这将在爬取开始、更新和完成时向指定的 URL 发送 POST 请求。
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 事件
现在有四种类型的事件:
crawl.started
- 当爬取开始时触发。
crawl.page
- 对每个爬取的页面触发。
crawl.completed
- 当爬取完成时触发,让您知道它已完成(Beta)。**
crawl.failed
- 当爬取失败时触发。
Webhook 响应
success
- 如果 webhook 成功爬取页面。
type
- 发生的事件类型。
id
- 爬取的 ID。
data
- 被抓取的数据(数组)。这仅在 crawl.page
上非空,并且如果页面被成功抓取,将包含一个项目。响应与 /scrape
端点的响应相同。
error
- 如果 webhook 失败,这将包含错误消息。
Beta 注意事项
- 存在极小的可能性,即
crawl.completed
事件可能在最后的 crawl.page
事件仍在处理时被触发。我们正在修复这个问题。