1.创建并激活虚拟环境 可选但推荐)

openclaw AI使用帮助 1

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

1.创建并激活虚拟环境 可选但推荐)-第1张图片-AI小龙虾下载官网 - openclaw下载 - openclaw小龙虾


第一部分:安装与环境配置

系统要求

  • 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。


第二部分:核心概念快速了解

在开始写代码前,先理解几个关键概念:

  1. Spider (爬虫): 你定义的主要类,负责解析网页、提取数据和生成新的请求。
  2. Item (数据项): 你希望从网页中提取的结构化数据模型(一个产品条目包含标题、价格、链接)。
  3. Request/Response (请求/响应): 封装了 HTTP 请求和响应的对象。
  4. Middleware (中间件): 处理请求和响应的钩子,用于添加头部、处理异常、更换代理等。
  5. Pipeline (管道): 处理 Spider 提取出来的 Item 的地方,常用于数据清洗、验证和存储(如保存到文件、数据库)。
  6. 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 作为调度队列,实现多机分布式爬取。

  1. 安装依赖:pip install redis
  2. 修改 settings.py
    SCHEDULER = "openclaw.scheduler.RedisScheduler"
    REDIS_URL = 'redis://localhost:6379'  # 你的 Redis 地址
  3. 在不同的机器上运行相同的爬虫,它们会从同一个 Redis 队列中领取任务。

第六部分:常见问题与调试

  1. 导入错误/安装失败:

    • 检查 Python 版本。
    • 确保系统已安装必要的编译工具(如 gcc, libxml2-dev 等)。
  2. 抓取不到数据:

    • 使用 scrapy shell <url> (OpenClaw可能也有类似工具或直接用requests/parsel测试) 交互式地测试你的 CSS/XPath 选择器。
    • 检查网站是否有动态加载(需要用到 SeleniumSplash,需额外集成)。
    • 查看 response.body 确认获取的页面内容是否正确。
  3. 被网站屏蔽:

    • 增加 DOWNLOAD_DELAY
    • 使用更真实的 User-Agent 和 IP 代理池。
    • 启用 CookiesMiddleware
  4. 查看日志:

    • settings.py 中设置 LOG_LEVEL = 'DEBUG' 可以获取最详细的日志信息,帮助定位问题。

OpenClaw 提供了一个强大而灵活的爬虫框架,上手流程可以概括为:

  1. 定义 Item -> 2. 编写 Spider (解析逻辑) -> 3. 配置 Pipeline (处理数据) -> 4. 调整 Settings 和 Middleware (控制爬取行为) -> 5. 运行

对于非常复杂的动态网站,你可能需要结合 SeleniumPlaywright 来渲染 JavaScript,建议先从简单的静态网站开始练习,逐步掌握其核心组件和运行机制。

标签: 虚拟环境创建 环境激活

抱歉,评论功能暂时关闭!