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

get-api-key.png


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())