Crawl4AI
Crawl4AI 是一款开源的网络爬取和抓取工具,旨在与大型语言模型(LLM)、AI 代理和数据管道无缝集成。它支持高速、实时的数据提取,同时保持灵活性和易于部署。
AI 驱动的网络抓取主要功能包括:
- 专为 LLM 构建: 生成结构化的 Markdown,针对检索增强生成(RAG)和微调进行优化。
- 灵活的浏览器控制: 支持会话管理、代理使用和自定义钩子。
- 启发式智能: 使用智能算法优化数据解析。
- 完全开源: 无需 API 密钥;可通过 Docker 和云平台部署。
在官方文档中了解更多信息。
为什么将 Scrapeless 与 Crawl4AI 结合使用?
Crawl4AI 擅长结构化网络数据提取,并支持 LLM 驱动的解析和基于模式的抓取。然而,在处理高级反爬机制时,它仍然可能面临挑战,例如:
- 本地浏览器被 Cloudflare、AWS WAF 或 reCAPTCHA 阻止
- 大规模并发爬取期间的性能瓶颈,浏览器启动缓慢
- 复杂的调试过程,使问题跟踪变得困难
Scrapeless 云浏览器完美解决了这些痛点:
- 一键反爬绕过: 自动处理 reCAPTCHA、Cloudflare Turnstile/Challenge、AWS WAF 等。结合 Crawl4AI 的结构化提取能力,显著提升成功率。
- 无限并发扩展: 在几秒钟内为每个任务启动 50-1000+ 个浏览器实例,消除本地爬取性能限制,最大限度地提高 Crawl4AI 效率。
- 40%–80% 成本降低: 相较于同类云服务,总成本可降低至 20%–60%。按量付费的定价模式使其即使对于小型项目也经济实惠。
- 可视化调试工具: 使用 会话回放 和 实时 URL 监控 实时查看 Crawl4AI 任务,快速定位失败原因,减少调试开销。
- 零成本集成: 与 Crawl4AI 使用的 Playwright 原生兼容,只需一行代码即可将 Crawl4AI 连接到云端 — 无需代码重构。
- 边缘节点服务 (ENS): 多个全球节点提供比其他云浏览器 快 2-3 倍 的启动速度和稳定性,加速 Crawl4AI 执行。
- 隔离环境与持久会话: 每个 Scrapeless 配置都在其独立环境中运行,具有持久登录和身份隔离功能,防止会话干扰并提高大规模稳定性。
- 灵活的指纹管理: Scrapeless 可以生成随机浏览器指纹或使用自定义配置,有效降低被检测的风险并提高 Crawl4AI 的成功率。
入门
1. 获取您的 Scrapeless API 密钥
登录 Scrapeless 并获取您的 API Token。

2. 快速开始
以下示例展示了如何快速轻松地将 Crawl4AI 连接到 Scrapeless 云浏览器:
有关更多功能和详细说明,请参阅简介。
scrapeless_params = {
"token": "get your token from https://www.scrapeless.com",
"sessionName": "Scrapeless browser",
"sessionTTL": 1000,
}
query_string = urlencode(scrapeless_params)
scrapeless_connection_url = f"wss://browser.scrapeless.com/api/v2/browser?{query_string}"
AsyncWebCrawler(
config=BrowserConfig(
headless=False,
browser_mode="cdp",
cdp_url=scrapeless_connection_url
)
)
配置完成后,Crawl4AI 通过 CDP(Chrome DevTools Protocol) 模式连接到 Scrapeless 云浏览器,实现在没有本地浏览器环境下的网页抓取。用户可以进一步配置代理、指纹、会话重用等功能,以满足高并发和复杂反爬场景的需求。
3. 全球自动代理轮换
Scrapeless 支持195 个国家/地区的住宅 IP。用户可以使用 proxycountry 配置目标区域,从而能够从特定位置发送请求。IP 会自动轮换,有效避免阻塞。
import asyncio
from urllib.parse import urlencode
from crawl4ai import CrawlerRunConfig, BrowserConfig, AsyncWebCrawler
async def main():
scrapeless_params = {
"token": "your token",
"sessionTTL": 1000,
"sessionName": "Proxy Demo",
# 设置代理的目标国家/地区,通过该地区的 IP 地址发送请求。您可以指定国家代码(例如,US 代表美国,GB 代表英国,ANY 代表任何国家)。请参阅所有支持选项的国家代码。"proxyCountry": "ANY",
}
query_string = urlencode(scrapeless_params)
scrapeless_connection_url = f"wss://browser.scrapeless.com/api/v2/browser?{query_string}"async with AsyncWebCrawler(
config=BrowserConfig(
headless=False,
browser_mode="cdp",
cdp_url=scrapeless_connection_url,
)
) as crawler:
result = await crawler.arun(
url="https://www.scrapeless.com/en",
config=CrawlerRunConfig(
wait_for="css:.content",
scan_full_page=True,
),
)
print("-" * 20)
print(f'Status Code: {result.status_code}')
print("-" * 20)
print(f'Title: {result.metadata["title"]}')
print(f'Description: {result.metadata["description"]}')
print("-" * 20)
asyncio.run(main())
4. 自定义浏览器指纹
为了模拟真实用户行为,Scrapeless 支持随机生成的浏览器指纹,并允许自定义指纹参数。这有效降低了被目标网站检测到的风险。
import json
import asyncio
from urllib.parse import quote, urlencode
from crawl4ai import CrawlerRunConfig, BrowserConfig, AsyncWebCrawler
async def main():
# 自定义浏览器指纹
fingerprint = {
"userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.1.2.3 Safari/537.36",
"platform": "Windows",
"screen": {
"width": 1280, "height": 1024
},
"localization": {
"languages": ["zh-HK", "en-US", "en"], "timezone": "Asia/Hong_Kong",
}
}
fingerprint_json = json.dumps(fingerprint)
encoded_fingerprint = quote(fingerprint_json)
scrapeless_params = {
"token": "your token",
"sessionTTL": 1000,
"sessionName": "Fingerprint Demo",
"fingerprint": encoded_fingerprint,
}
query_string = urlencode(scrapeless_params)
scrapeless_connection_url = f"wss://browser.scrapeless.com/api/v2/browser?{query_string}"async with AsyncWebCrawler(
config=BrowserConfig(
headless=False,
browser_mode="cdp",
cdp_url=scrapeless_connection_url,
)
) as crawler:
result = await crawler.arun(
url="https://www.scrapeless.com/en",
config=CrawlerRunConfig(
wait_for="css:.content",
scan_full_page=True,
),
)
print("-" * 20)
print(f'Status Code: {result.status_code}')
print("-" * 20)
print(f'Title: {result.metadata["title"]}')
print(f'Description: {result.metadata["description"]}')
print("-" * 20)
asyncio.run(main())
5. 配置文件重用
Scrapeless 为每个配置文件分配其独立的浏览器环境,实现持久登录和身份隔离。用户只需提供 profileId 即可重用之前的会话。
import asyncio
from urllib.parse import urlencode
from crawl4ai import CrawlerRunConfig, BrowserConfig, AsyncWebCrawler
async def main():
scrapeless_params = {
"token": "your token",
"sessionTTL": 1000,
"sessionName": "Profile Demo",
"profileId": "your profileId",# 在 Scrapeless 上创建配置文件
}
query_string = urlencode(scrapeless_params)
scrapeless_connection_url = f"wss://browser.scrapeless.com/api/v2/browser?{query_string}"async with AsyncWebCrawler(
config=BrowserConfig(
headless=False,
browser_mode="cdp",
cdp_url=scrapeless_connection_url,
)
) as crawler:
result = await crawler.arun(
url="https://www.scrapeless.com",
config=CrawlerRunConfig(
wait_for="css:.content",
scan_full_page=True,
),
)
print("-" * 20)
print(f'Status Code: {result.status_code}')
print("-" * 20)
print(f'Title: {result.metadata["title"]}')
print(f'Description: {result.metadata["description"]}')
print("-" * 20)
asyncio.run(main())