爬虫脚手架框架 - 快速创建和运行爬虫任务
Project description
spiderWei_TecDo 爬虫框架 v2.0
快速创建和运行爬虫任务的脚手架框架。
功能特性
- 命令行一键生成爬虫脚手架,统一项目结构与入口
- 统一配置管理(Apollo / 本地直配),支持配置覆盖与环境切换
- 内置数据库、Kafka、OBS/OSS、代理、下载队列等能力
- 支持并发执行与循环执行(按间隔 / 每日时间点)
- 重型依赖懒加载,按需安装(仅 requests 为必装依赖)
- 线程安全的数据库客户端与计数器
- 标准 logging 日志系统
- 信号处理支持优雅退出
安装
运行环境要求:Python >= 3.8
# 基础安装(仅含 HTTP 请求能力)
pip install spiderWei-TecDo
# 按需安装额外功能
pip install "spiderWei-TecDo[db]" # 数据库 (psycopg)
pip install "spiderWei-TecDo[kafka]" # Kafka
pip install "spiderWei-TecDo[video]" # 视频提取 (yt-dlp)
pip install "spiderWei-TecDo[obs]" # 华为云 OBS
pip install "spiderWei-TecDo[oss]" # 阿里云 OSS
# 全部安装
pip install "spiderWei-TecDo[all]"
# 开发模式安装(推荐本地开发)
cd spiderWei
pip install -e ".[all]"
快速开始
1. 创建爬虫
# 在当前目录创建爬虫
spiderWei_TecDo start my_spider
# 在指定目录创建
spiderWei_TecDo start my_spider -o ./spiders
2. 查看配置说明
spiderWei_TecDo list
3. 编辑生成的爬虫文件
打开生成的 my_spider.py,修改以下内容:
- Apollo 配置 - 在脚本顶部全局获取 Apollo 配置
import os, json, logging
from spiderWei_TecDo import run_spider, SpiderSettings, ConfigHelper
is_test = os.getenv("ISTEST", "1") == "1"
# 获取 Apollo 配置(不需要 Apollo 时改为 apollo = {})
apollo = ConfigHelper().fetch_apollo_config(
is_test=is_test,
apollo_id='Your-Apollo-ID',
apollo_url_test='http://your-test-apollo.com',
apollo_url_prod='http://your-prod-apollo.com',
)
- 配置 settings - 在 settings 中直接引用
apollo.get("key"),不想用 Apollo 的配置项直接写值
settings = SpiderSettings(
apollo_enable=False, # 已在上方手动获取,无需框架内部重复获取
configurations=apollo, # 传入 Apollo 配置,app.configurations 可访问
thread_num=20,
# 代理: 从 Apollo 取,或直接写 proxy_list=["ip1:port"]
enable_proxy=True,
proxy_list=json.loads(apollo.get("IPlist", "[]")),
# 数据库: 从 Apollo 取,或直接写 db_host='your-host' ...
enable_db=True,
db_host=apollo.get("holoHost", ""),
db_port=apollo.get("holoPort", ""),
db_name=apollo.get("holoDBname", ""),
db_user=apollo.get("holoUser", ""),
db_password=apollo.get("holoPassword", ""),
db_table_name='your_table_name',
# Kafka: 从 Apollo 取,或直接写 kafka_address=["host:9092"]
enable_kafka=True,
kafka_address=json.loads(apollo.get("kafkaAddress", "[]")),
# 关闭 kafka-python 连接 INFO 日志(默认 WARNING;想看详细可设为 logging.INFO;不覆盖则设 None)
kafka_log_level=logging.WARNING,
# OSS: 从 Apollo 取,或直接写 obs_ak='xxx' ...
enable_obs=True,
obs_provider='aliyun',
obs_ak=apollo.get("AliOSS_AK", ""),
obs_sk=apollo.get("AliOSS_SK", ""),
obs_endpoint=apollo.get("AliOSS_Endpoint", ""),
obs_bucket_name=apollo.get("AliOSS_BucketName", ""),
obs_link_prefix=apollo.get("AliOSS_Link", ""),
)
- 实现
getexeList(app)函数 - 构造任务列表
def getexeList(app):
# 从数据库读取
results = app.holo_client.execute_sql_query("SELECT id FROM table LIMIT 100")
return [{"id": row[0]} for row in results]
# 或静态列表
# return [{"id": 1}, {"id": 2}, {"id": 3}]
- 实现
main(arg, app)函数 - 编写采集逻辑
def main(arg, app):
result = app.crawl.crawl(f"https://api.example.com/{arg['id']}")
data = json.loads(result['html'])
app.push_queue.put({"id": arg['id'], "data": data})
4. 运行爬虫
python my_spider.py
5. 配置循环执行(可选)
settings = SpiderSettings(
loop_enable=True,
loop_mode="interval", # 'interval' 或 'daily_time'
loop_interval_seconds=1800, # interval 模式:间隔秒数
# loop_daily_times=["00:00", "12:00"], # daily_time 模式
)
配置项说明
Apollo 配置
Apollo 配置在脚本顶部全局获取,得到 apollo 字典后在 SpiderSettings 中按需引用。
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| apollo_enable | bool | True | 是否由框架内部获取 Apollo(已外部获取时设为 False) |
| apollo_id | str | 'Creatives-spider' | Apollo 应用ID |
| apollo_url_test | str | 测试环境 Apollo 地址 | |
| apollo_url_prod | str | 生产环境 Apollo 地址 | |
| configurations | dict | None | 外部传入的 Apollo 配置字典(传入后框架跳过内部 fetch) |
基础配置
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| is_test | bool | 从 ISTEST 环境变量获取 | True=测试环境,False=生产环境 |
| thread_num | int | 1 | 并发线程数 |
代理配置
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| enable_proxy | bool | False | 是否启用代理 |
| proxy_list | list | None | 代理列表,如 json.loads(apollo.get("IPlist", "[]")) |
数据库配置
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| enable_db | bool | False | 是否连接数据库 |
| db_host | str | '' | 如 apollo.get("holoHost", "") |
| db_port | str | '' | 如 apollo.get("holoPort", "") |
| db_name | str | '' | 如 apollo.get("holoDBname", "") |
| db_user | str | '' | 如 apollo.get("holoUser", "") |
| db_password | str | '' | 如 apollo.get("holoPassword", "") |
| db_table_name | str | '' | 数仓表名(与 db_topic_name 二选一) |
| db_topic_name | str | '' | Kafka Topic(与 db_table_name 二选一) |
| db_primary_key | str | '' | 主键名,冲突时更新(支持 "col1,col2") |
Kafka 配置
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| enable_kafka | bool | False | 是否需要 Kafka |
| kafka_address | list | None | 如 json.loads(apollo.get("kafkaAddress", "[]")) |
| download_topic_name | str | '' | 下载器 Topic |
| kafka_log_level | int/None | WARNING | kafka-python 会打印大量 INFO 连接日志;默认压到 WARNING;设为 None 表示不覆盖外部日志配置 |
说明:你看到的
BrokerConnection ... connecting/connected之类输出来自kafka-python的logging,不是
- 用框架:在
SpiderSettings里设置kafka_log_level=logging.WARNING(默认就是 WARNING)- 或脚本里一行:
logging.getLogger("kafka").setLevel(logging.WARNING)
OBS/OSS 配置
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| enable_obs | bool | False | 是否需要对象存储 |
| obs_provider | str | 'aliyun' | 云厂商: 'huawei' 或 'aliyun' |
| obs_ak | str | '' | 如 apollo.get("AliOSS_AK", "") |
| obs_sk | str | '' | 如 apollo.get("AliOSS_SK", "") |
| obs_endpoint | str | '' | 如 apollo.get("AliOSS_Endpoint", "") |
| obs_bucket_name | str | '' | 如 apollo.get("AliOSS_BucketName", "") |
| obs_link_prefix | str | '' | 如 apollo.get("AliOSS_Link", "") |
华为云 OBS 对应 Apollo key:
HWOBS_AK,HWOBS_SK,HWOBS_Endpoint,HWOBS_BucketName,HWOBS_Link
调试配置
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| print_item | bool | False | 是否打印推送数据 |
循环执行配置
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| loop_enable | bool | False | 是否循环执行 |
| loop_mode | str | 'interval' | 循环模式: 'interval' 或 'daily_time' |
| loop_interval_seconds | int | 3600 | interval 模式间隔秒数 |
| loop_daily_times | list | None | daily_time 模式时间点列表 |
配置覆盖优先级
配置优先级(高 → 低):
SpiderSettings中直接指定的配置值- Apollo 配置(通过
apollo.get()在脚本中引用) - 框架内部兜底(仅在 settings 值为空且
configurations中有对应 key 时生效)
环境变量
# Windows
set ISTEST=0 # 0=生产环境, 1=测试环境
# Linux/Mac
export ISTEST=0
app 对象属性
在 main(arg, app) 函数中,app 对象提供以下属性:
| 属性 | 说明 |
|---|---|
app.push_queue |
数据推送队列 |
app.download_queue |
下载器队列 |
app.holo_client |
数据库客户端 |
app.obs_helper |
OBS/OSS 客户端 |
app.videoOp |
视频操作工具 |
app.fileOp |
文件操作工具 |
app.crawl |
HTTP 请求工具 |
app.configurations |
Apollo 配置 |
依赖
核心依赖(必装):
- requests>=2.25.0
可选依赖(按需安装):
- psycopg>=3.0.0 (
[db]) - kafka-python>=2.0.0 (
[kafka]) - yt-dlp>=2023.0.0 (
[video]) - esdk-obs-python>=3.0.0 (
[obs]) - oss2>=2.15.0 (
[oss])
开发依赖(可选)
pip install "spiderWei-TecDo[dev]"
- pytest>=7.0.0
- black>=22.0.0
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file spiderwei_tecdo-2.0.0.tar.gz.
File metadata
- Download URL: spiderwei_tecdo-2.0.0.tar.gz
- Upload date:
- Size: 24.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
01ff37d7c7229427a0abf2b0b4dfe26a4565c31ef2d4fc5666d751f82bf11af0
|
|
| MD5 |
26853a460ab481ec85c7bff2aa966a34
|
|
| BLAKE2b-256 |
c6b6c102bc819674354e779f7f54ef165a8427a652df14add86a42249dc714e9
|
File details
Details for the file spiderwei_tecdo-2.0.0-py3-none-any.whl.
File metadata
- Download URL: spiderwei_tecdo-2.0.0-py3-none-any.whl
- Upload date:
- Size: 24.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2e8fcb01db8f0ca8e3a09d104052421f73081fbca1391cfeac7d00d41c1e8da7
|
|
| MD5 |
c10322d25b34bb35603f0bf5d701fe32
|
|
| BLAKE2b-256 |
dee6f134deca1d9c23b873a8706f9d93ab485471637fe7b2e36fb5ba825e985d
|