探针实测发现 httpx 因 TLS/HTTP2 指纹被 Rakuten 拒认(cookie 有效但 站点不识别 session),site_interact 改为全程 Playwright + storage_state。 add_to_cart 与 verify_cart 已实测可用:从商品页 __INITIAL_STATE__ 抽 purchase 块、调用方补 variant_id 与 choice、POST basketDomain、用 cart count JSONP API 与 SPA 渲染后的 cart 页校验。enter_checkout 及之后仍 NotImplementedError:Rakuten 对 checkout 要求 session upgrade(重输密码), 是自动 checkout 的硬墙,未实测过墙方案前留接口缝。 SiteInteractor 类持有 Playwright BrowserContext,由 WorkerRunner 实例 持有、container/main 接线、lifespan 管理生命周期。测试侧 23 个用例, 全套件 333 passed,架构边界守住。 附 5 个探针脚本(scripts/probe_*.py),记录实测路径与响应结构。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
40 lines
1.1 KiB
TOML
40 lines
1.1 KiB
TOML
[project]
|
|
name = "rakuten-scraper-service"
|
|
version = "0.1.0"
|
|
description = "API service for Rakuten Ichiba scraping tasks"
|
|
requires-python = ">=3.13"
|
|
dependencies = [
|
|
"aiosqlite>=0.20.0,<1.0.0",
|
|
"fastapi>=0.115.0,<1.0.0",
|
|
"httpx[http2]>=0.27.0,<1.0.0",
|
|
"loguru>=0.7.0,<1.0.0",
|
|
"opentelemetry-api>=1.27.0,<2.0.0",
|
|
"opentelemetry-exporter-otlp>=1.27.0,<2.0.0",
|
|
"opentelemetry-instrumentation-fastapi>=0.48b0,<1.0.0",
|
|
"opentelemetry-instrumentation-httpx>=0.48b0,<1.0.0",
|
|
"opentelemetry-sdk>=1.27.0,<2.0.0",
|
|
"playwright>=1.61.0",
|
|
"pydantic>=2.0.0,<3.0.0",
|
|
"pydantic-settings>=2.4.0,<3.0.0",
|
|
"selectolax>=0.3.21,<1.0.0",
|
|
"uvicorn[standard]>=0.30.0,<1.0.0",
|
|
]
|
|
|
|
[project.optional-dependencies]
|
|
# 浏览器兜底:仅在纯 HTTP 被 Akamai 拦截时使用,日常运行不需要
|
|
browser = [
|
|
"playwright>=1.47.0,<2.0.0",
|
|
]
|
|
dev = [
|
|
"pytest>=8.3.0,<9.0.0",
|
|
"pytest-asyncio>=0.24.0,<1.0.0",
|
|
]
|
|
|
|
[tool.pytest.ini_options]
|
|
asyncio_mode = "auto"
|
|
asyncio_default_fixture_loop_scope = "function"
|
|
testpaths = ["tests"]
|
|
|
|
[tool.uv]
|
|
package = false
|