
pip install beeize-sdk-python示例代码请查看: beeize-scraper-example。
your_project/
    requirements.txt
    input_schema.json
    Dockerfile
    output_schema.json
    README.md
    main.py
storage/
    datasets/
        default/
            000000001.json
            000000002.json
            000000003.json
            000000004.json
            __metadata__.json
    kv_stores/
        default/
            demo1.mp4
            demo2.mp4
            demo3.mp4
            demo4.mp4
            __metadata__.json
    request_queues/
        default/
            8m3Ssk32vNgBp4p.json
            9NQYbiNlWlaJYci.json
            09nTuJT7y87FGXs.json
            EmPwJk4NaJQPzpS.json
            __metadata__.json
import json
import requests
from beeize.scraper import Scraper
from loguru import logger
headers = {
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 ('
                  'KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0',
}
def fetch(url, retry_count=0):
    try:
        response = requests.get(
            url=url,
            headers=headers
        )
        return response.json()
    except (Exception,):
        if retry_count < 3:
            return fetch(url, retry_count + 1)
def main():
    scraper = Scraper() // 注意:scraper 要全局唯一,scraper是线程安全的
    queue = scraper.request_queue
    kv_store = scraper.key_value_store
    visit_user_token = 'MS4wLjABAAAAiAce5qhH31TeuB3UdpFMV8u-uwy2LnoiqI10uZHqAt8'
    start_url = f'https://www.toutiao.com/api/pc/feed/?category=profile_all&utm_source=toutiao&visit_user_token={visit_user_token}&max_behot_time=0&_signature='
    # 添加初始请求任务到队列
    queue.add_request({'url': start_url, 'type': 'profile'})
    while queue.is_finished():
        # 消费队列中的请求任务
        request = queue.fetch_next_request()
        if not request:
            break
        logger.info(request)
        url = request['url']
        # 下载请求
        resp = fetch(url)
        if not resp:
            # 对失败请求进行标记
            queue.reclaim_request(request)
            continue
        # 对成功请求进行标记
        queue.mark_request_as_handled(request)
        # 解析列表页
        if request['type'] == 'profile':
            for item in resp.get('data'):
                item_id = item.get('item_id')
                item['type'] = 'basic'
                # 存储到 datasets
                scraper.push_data(item)
                logger.info(item)
                # 添加详情页请求任务到队列
                queue.add_request({
                    'url': f'https://m.toutiao.com/i{item_id}/info/',
                    'type': 'detail',
                    'item_id': item_id,
                })
        # 解析详情页
        if request['type'] == 'detail':
            item = resp.get('data')
            item['url'] = url
            item['type'] = 'complete'
            # 存储到 datasets
            scraper.push_data(item)
            item_id = request.get('item_id')
            # 存储文件到 kv_store
            kv_store.set_value(item_id, json.dumps(item, ensure_ascii=False, indent=4))
            logger.info(item)  # 日志
if __name__ == '__main__':
    main()
Python 项目可参考如下 Dockerfile:
建议使用国内源的 docker 镜像,可以加快构建速度。 如果找不到国内源的 docker 基础镜像,可以联系集蜂云管理员,帮忙上传到集蜂云的镜像仓库。
# 使用阿里的 Python 镜像作为基础镜像(国内把 dockerhub 禁掉了,拉不下来镜像)
# 如果代码需要 node 环境运行 js,可以把基础镜像替换成 registry.cn-shanghai.aliyuncs.com/beeize-public/python-nodejs:python3.11-nodejs22
FROM alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/python:3.11.1
# 设置工作目录
WORKDIR /app
# 复制项目文件到容器中
COPY . /app
# 安装依赖
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 设置环境变量,可选项,TZ 是特定的一个环境变量,用来设置容器时间时区,不设置的话默认是 UTC 时区,打印日志时间是 UTC 时间
ENV TZ=Asia/Shanghai
# 设置容器启动时执行的命令
CMD python main.py
input_schema.json 定义了采集器的输入,平台会把 input_schema.json 界面化显示,方便用户配置参数。 平台将用户输入参数转换为环境变量,采集器在运行的时候,通过环境变量获得用户输入的参数。
使用流程如下:

参数详细定义,请参考 输入。
output_schema 用来帮助用户更好的理解数据含义,平台根据 output_schema.json 的定义来可视化展示数据。 目前,平台支持的数据类型(type 字段)包括 string、number、array、image、link、object、bool 7 种类型。
详细请参考 输出。
{
  "component": "table",
  "columns": {
    "title": {
      "title": "标题",
      "type": "string"
    },
    "author": {
      "title": "作者",
      "type": "string"
    },
    "publish_time": {
      "title": "发布时间",
      "type": "string"
    },
    "content": {
      "title": "正文",
      "type": "string"
    },
    "images": {
      "title": "图片",
      "type": "array"
    },
    "url": {
      "title": "内容页链接",
      "type": "string"
    },
    "list_page": {
      "title": "列表页链接",
      "type": "string"
    }
  }
}
README.md 是用来介绍你的采集器,让用户更加理解采集器,从而选择使用你的采集器。
README 可以按照下面的提纲进行编写: