Files
xspider/README.md
2025-10-17 17:26:46 +08:00

3.1 KiB
Raw Blame History

xspider 模板爬虫

基于 XML 配置驱动的爬虫执行引擎,可从 Redis 列表中获取模板地址,按流程控制使用 DrissionPage 浏览器执行登录和业务流程,并将抽取的数据存储到 MongoDB。

依赖

  • Python 3.10+
  • DrissionPage
  • redis, requests, pymongo, lxml, cssselect

使用 pip 安装:

pip install drissionpage redis requests pymongo lxml cssselect

若需要验证码识别、变量服务等能力,请根据业务另行实现。

环境变量

变量 默认值 说明
XSPIDER_REDIS_URL redis://localhost:6379/0 Redis 连接串
XSPIDER_REDIS_LIST_KEY xspider:config 待处理模板所在的 list key
XSPIDER_REDIS_BLOCK_TIMEOUT 30 BLPOP 阻塞秒数
XSPIDER_MONGO_URI mongodb://localhost:27017 MongoDB 连接串
XSPIDER_MONGO_DB xspider MongoDB 数据库名称
XSPIDER_VARIABLE_SERVICE None 变量服务接口地址GET 查询POST 写入

变量服务要求:

  • GET {base}?name=变量名&... 返回 JSON包含 value 字段。
  • POST {base} 提交 JSON {name, value, ...}

运行

python main.py

程序将持续阻塞等待 Redis 列表推送 XML 模板地址,下载模板并执行流程。

XML 模板

模板结构参考示例:

<site id="example" base="https://example.com">
  <config enable_proxy="false" rotate_ua="false" retry="3">
    <header name="Accept-Language" value="zh-CN,zh;q=0.9"/>
  </config>

  <login url="https://example.com/login" selector="div.dashboard" mode="css">
    <action type="wait_dom_show" selector="form#login"/>
    <action type="type" selector="//input[@name='username']" text="${account}" mode="xpath"/>
    <action type="type" selector="//input[@name='password']" text="${password}" mode="xpath"/>
    <action type="click" selector="button.submit"/>
  </login>

  <flows>
    <flow id="orders" entry="/orders" data_type="sales" unique_keys="custom" columns="order_id">
      <action type="wait_dom_show" selector="table.data-list"/>
      <extract record_css="table.data-list tbody tr">
        <field name="order_id" selector="td:nth-child(1)" mode="css"/>
        <field name="customer" selector="td:nth-child(2)" mode="css"/>
      </extract>
      <paginate selector="button.next" mode="css" max_pages="10"/>
    </flow>
  </flows>
</site>

支持的 action 类型见 xspider/actions/builtin.py,如需扩展可继承 BaseAction 并注册到 ActionRegistry

重要说明

  • CaptchaAction 会自动截图(元素或整页)并调用 https://captcha.lfei007s.workers.dev,请求体为 {image, type}image 采用 data:image/png;base64,... 形式)。可通过 captcha_configJSON 字符串)自定义 urlheaderstimeout 或额外字段。
  • 下载文件监听、复杂的分页场景需要根据目标站点扩展。
  • 为保证可维护性,所有动作执行过程中均进行了简单日志输出并允许扩展变量解析。需要对框架进行二次开发时,可直接扩展 Action、Extractor 以及 Runner。