OpenClaw 是一个基于 Python 的开源、模块化、高性能的分布式网络爬虫框架,它的设计目标是让爬虫开发更简单、更高效,尤其擅长处理大规模的抓取任务,其核心特点包括分布式支持、异步处理、强大的中间件和灵活的扩展性。

第一部分:安装与环境配置
系统要求
- Python: 3.7 或更高版本。
- 操作系统: 主要支持 Linux / macOS,Windows 上可能需要进行额外配置。
- 依赖管理: 推荐使用
pip和虚拟环境。
安装步骤
建议在虚拟环境中安装,以避免包冲突。
source openclaw_env/bin/activate # Linux/macOS # openclaw_env\Scripts\activate # Windows # 2. 使用 pip 安装 OpenClaw pip install openclaw
注意:由于 OpenClaw 可能依赖一些需要编译的库(如 lxml),在 Linux 上请确保已安装 python3-dev 等基础开发工具包,在 Windows 上,可能需要安装 Microsoft Visual C++ Build Tools。
第二部分:核心概念快速了解
在开始写代码前,先理解几个关键概念:
- Spider (爬虫): 你定义的主要类,负责解析网页、提取数据和生成新的请求。
- Item (数据项): 你希望从网页中提取的结构化数据模型(一个产品条目包含标题、价格、链接)。
- Request/Response (请求/响应): 封装了 HTTP 请求和响应的对象。
- Middleware (中间件): 处理请求和响应的钩子,用于添加头部、处理异常、更换代理等。
- Pipeline (管道): 处理 Spider 提取出来的 Item 的地方,常用于数据清洗、验证和存储(如保存到文件、数据库)。
- Scheduler (调度器): 管理请求队列,决定下一个要发出的请求。
第三部分:第一个爬虫示例 - 抓取书籍信息
我们将以爬取 books.toscrape.com 为例,抓取书籍标题和价格。
创建项目结构
虽然 OpenClaw 没有严格的强制结构,但良好的组织有助于管理。
my_openclaw_project/
├── spiders/
│ ├── __init__.py
│ └── book_spider.py # 我们的爬虫文件
├── items.py # 定义数据模型
├── pipelines.py # 定义数据处理管道
├── middlewares.py # 定义中间件
└── settings.py # 项目设置
定义 Item (items.py)
# items.py
from openclaw.item import Item, Field
class BookItem(Item):
# 定义要抓取的字段= Field()
price = Field()
link = Field()
编写 Spider (spiders/book_spider.py)
这是爬虫的核心逻辑。
# spiders/book_spider.py
import scrapy
from my_openclaw_project.items import BookItem # 根据你的项目名调整导入
from openclaw.spiders import Spider
from openclaw.http import Request
class BookSpider(Spider):
name = "book_spider" # 爬虫的唯一标识名
allowed_domains = ["books.toscrape.com"]
start_urls = ["http://books.toscrape.com"]
def parse(self, response):
"""
解析起始页面,提取书籍列表页的链接,并跟进。
"""
# 找到所有书籍封面的链接
book_links = response.css('.product_pod h3 a::attr(href)').getall()
for link in book_links:
# 构建绝对URL
absolute_url = response.urljoin(link)
# 创建一个新的请求,指向书籍详情页,并指定回调函数 `parse_book`
yield Request(absolute_url, callback=self.parse_book)
# 处理分页:找到“下一页”的链接
next_page = response.css('.next a::attr(href)').get()
if next_page:
yield Request(response.urljoin(next_page), callback=self.parse)
def parse_book(self, response):
"""
解析单个书籍详情页,提取数据并生成 Item。
"""
book = BookItem()
book['title'] = response.css('.product_main h1::text').get()
# 清理价格字符串
price_text = response.css('.price_color::text').get()
book['price'] = price_text.replace('Â', '').strip() if price_text else None
book['link'] = response.url # 当前页面的URL
yield book # 将提取到的数据项交给 Pipeline 处理
配置 Settings (settings.py)
# settings.py
# 遵守 Robots 协议(默认True,对于测试站可关闭)
ROBOTSTXT_OBEY = False
# 并发请求数,控制速度
CONCURRENT_REQUESTS = 16
# 下载延迟(秒),避免对服务器造成压力
DOWNLOAD_DELAY = 0.5
# 启用或禁用中间件、管道
SPIDER_MIDDLEWARES = {}
DOWNLOADER_MIDDLEWARES = {}
# 启用 Item Pipeline 并设置处理顺序
ITEM_PIPELINES = {
# ‘数字’ 代表优先级,越小越先执行
'my_openclaw_project.pipelines.BookPipeline': 300,
}
# 日志级别
LOG_LEVEL = 'INFO'
# 输出文件(也可以通过Pipeline实现)
FEED_FORMAT = 'json' # 支持 json, jsonlines, csv, xml
FEED_URI = 'books_output.json'
编写 Pipeline (pipelines.py)
用于处理和存储 Item。
# pipelines.py
import json
class BookPipeline:
def open_spider(self, spider):
"""爬虫启动时执行一次"""
self.file = open('books.json', 'w', encoding='utf-8')
self.items = []
def process_item(self, item, spider):
"""每个Item都会经过这里"""
# 可以进行数据清洗、去重、验证等操作
# 确保价格是浮点数
try:
if item.get('price'):
item['price'] = float(item['price'].replace('£', ''))
except ValueError:
item['price'] = None
self.items.append(dict(item))
return item
def close_spider(self, spider):
"""爬虫关闭时执行一次"""
json.dump(self.items, self.file, ensure_ascii=False, indent=2)
self.file.close()
第四部分:运行爬虫
在项目根目录(my_openclaw_project 的同级目录)下,运行以下命令:
# 方式1:使用 runspider 命令运行单个爬虫文件 openclaw runspider spiders/book_spider.py # 方式2:如果你有多个爬虫,可以创建一个“爬虫运行器”脚本 # 创建一个 run.py 文件
run.py 内容示例:
# run.py
from openclaw.core.engine import Engine
from my_openclaw_project.spiders.book_spider import BookSpider
from my_openclaw_project import settings # 导入你的配置
if __name__ == '__main__':
# 创建引擎
engine = Engine(settings)
# 添加爬虫
engine.add_spider(BookSpider)
# 开始运行
engine.run()
然后执行:
python run.py
运行后,你会在目录下得到一个 books.json 文件,里面包含了所有抓取到的书籍信息。
第五部分:进阶功能与技巧
使用中间件处理代理和 User-Agent
在 middlewares.py 中:
# middlewares.py
import random
from openclaw.downloadermiddlewares import DownloaderMiddleware
class RandomUserAgentMiddleware(DownloaderMiddleware):
def __init__(self, user_agent_list):
self.user_agents = user_agent_list
@classmethod
def from_crawler(cls, crawler):
# 可以从 settings 中读取 UA 列表
ua_list = crawler.settings.get('USER_AGENT_LIST', [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...',
# ... 更多UA
])
return cls(ua_list)
def process_request(self, request, spider):
request.headers['User-Agent'] = random.choice(self.user_agents)
class ProxyMiddleware(DownloaderMiddleware):
def process_request(self, request, spider):
# 设置代理
request.meta['proxy'] = "http://your-proxy-server:port"
并在 settings.py 中启用:
DOWNLOADER_MIDDLEWARES = {
'my_openclaw_project.middlewares.RandomUserAgentMiddleware': 543,
'my_openclaw_project.middlewares.ProxyMiddleware': 544,
}
USER_AGENT_LIST = [...] # 你的UA列表
处理登录和 Cookies
# 在 Spider 中
def start_requests(self):
# 首先请求登录页,获取表单令牌
return [Request(self.login_url, callback=self.login)]
def login(self, response):
# 提取 CSRF token
token = response.css('input[name="csrf_token"]::attr(value)').get()
# 构造表单数据
formdata = {
'username': 'your_username',
'password': 'your_password',
'csrf_token': token
}
# 发送 POST 请求登录
return FormRequest.from_response(
response,
formdata=formdata,
callback=self.after_login
)
def after_login(self, response):
# 检查是否登录成功
if "Logout" in response.text:
self.logger.info("登录成功!")
# 开始真正的抓取任务
for url in self.start_urls:
yield Request(url, callback=self.parse)
分布式部署 (配合 Redis)
OpenClaw 支持使用 Redis 作为调度队列,实现多机分布式爬取。
- 安装依赖:
pip install redis - 修改
settings.py:SCHEDULER = "openclaw.scheduler.RedisScheduler" REDIS_URL = 'redis://localhost:6379' # 你的 Redis 地址
- 在不同的机器上运行相同的爬虫,它们会从同一个 Redis 队列中领取任务。
第六部分:常见问题与调试
-
导入错误/安装失败:
- 检查 Python 版本。
- 确保系统已安装必要的编译工具(如
gcc,libxml2-dev等)。
-
抓取不到数据:
- 使用
scrapy shell <url>(OpenClaw可能也有类似工具或直接用requests/parsel测试) 交互式地测试你的 CSS/XPath 选择器。 - 检查网站是否有动态加载(需要用到
Selenium或Splash,需额外集成)。 - 查看
response.body确认获取的页面内容是否正确。
- 使用
-
被网站屏蔽:
- 增加
DOWNLOAD_DELAY。 - 使用更真实的
User-Agent和 IP 代理池。 - 启用
CookiesMiddleware。
- 增加
-
查看日志:
- 在
settings.py中设置LOG_LEVEL = 'DEBUG'可以获取最详细的日志信息,帮助定位问题。
- 在
OpenClaw 提供了一个强大而灵活的爬虫框架,上手流程可以概括为:
- 定义 Item -> 2. 编写 Spider (解析逻辑) -> 3. 配置 Pipeline (处理数据) -> 4. 调整 Settings 和 Middleware (控制爬取行为) -> 5. 运行。
对于非常复杂的动态网站,你可能需要结合 Selenium 或 Playwright 来渲染 JavaScript,建议先从简单的静态网站开始练习,逐步掌握其核心组件和运行机制。