技术解读

以下内容由 GitRead 中文社区 编辑团队基于项目 README 与官方资料整理, 结合中文开发者的常见使用场景补充技术选型建议。具体以项目官方文档为准。

闲鱼爬虫项目深度分析:xianyu_spider

https://github.com/superboyyy/xianyu_spider

项目背景与痛点

在二手交易市场中,闲鱼作为淘宝系的重要组成部分,提供了庞大的商品池。然而,对于需要频繁访问平台信息的爬虫开发者来说,直接爬取网页数据存在一定的技术挑战,尤其是考虑到数据抓取的效率和准确性要求。此外,由于闲鱼的页面结构复杂,实时变动,传统的爬虫工具难以实现稳定的数据获取。“superboyyy/xianyu_spider” 就是针对这一痛点设计的,它通过构建异步并发请求接口,支持自动化数据去重存储,极大提高了数据抓取的效率与可靠性,解决了开发者实际业务场景中的需求。

核心技术揭秘

项目本身基于闲鱼网页端设计,使用了FastAPI框架来提升服务的响应速度,确保了接口的高效和可靠性。FastAPI不仅支持异步处理,也方便对多个请求同时进行并发操作,进一步提高爬取效率。数据去重则通过内部算法实现,确保了数据的唯一性,避免了存储冗余。

下面是该项目的技术架构图,共包括几个关键模块:用户接口层、核心处理层、数据存储层,各部分如何协同工作一目了然。

graph TD A[用户发起请求] --> B[异步并发请求] B --> C[数据解析] C --> D{"数据去重?"} D -->|"已存在"| E[存储新数据] D -->|"已存在"| F[更新存储数据] E --> G[返回处理结果] F --> H[返回处理结果]

从上述架构可以看出,架构的关键在于FastAPI的异步特性,以及内部数据去重逻辑的设计。

功能亮点与差异

相比于常见的二手交易平台爬虫项目,“superboyyy/xianyu_spider” 的主要优势在于以下几个方面:

  1. 异步并发爬取:利用FastAPI的异步处理能力,可以同时处理多个请求,提高了数据抓取的整体效率。
  2. 自动化数据去重:通过内部算法自动识别并处理重复数据,仅在数据库中存储唯一的数据条目,有效避免冗余存储。
  3. 易于集成和扩展:基于FastAPI设计,使得该项目具有良好的可扩展性和集成能力,便于开发者根据实际需求进行定制和功能扩展。

应用场景与落地建议

此项目适用于需要经常从闲鱼抓取数据的相关业务场景。无论是二手商品数据分析、市场调研,还是自动化信息监测,均适用。在生产环境中使用时应注意以下几点:

  • 在实际部署时,确保拥有足够的服务器资源和带宽处理高并发请求。
  • 注意闲鱼爬虫使用的合法性和合规性,避免触发平台的反爬机制。
  • 定期维护和扩展,与平台治理策略同步,以应对其规则的变化。

综合评价

“superboyyy/xianyu_spider” 项目能高效批量化抓取闲鱼平台商品数据,其技术实现展示了FastAPI框架处理高并发请求的优良性能,具有极高的业务应用价值和扩展潜力。项目当前设计合理,但在实际业务需求下,如何进一步提升数据处理能力、并满足个人开发者和企业团队的定制化需求,未来尚有较大发展空间。

简要分析

热度分
1171
价值分
586
活跃状态
活跃

语言占比

Python

README

闲鱼商品搜索API

FastAPI Python 3.10+

基于 FastAPI 构建的闲鱼商品搜索接口,支持异步并发请求和自动化数据去重存储。现已支持登录。

功能特性

  • 🔍 关键词商品搜索(支持分页、排序、价格和地区筛选)
  • ⚡ 异步高性能爬取(HTTP 直连搜索接口,默认按最新发布排序)
  • 🔐 支持扫码登录和扫脸认证;登录失效后搜索按未登录继续
  • 💬 登录后可连接闲鱼私信:收发文本、本地会话历史、SSE
  • 🛡️ 智能数据去重(基于链接特征哈希值)
  • 💾 数据持久化存储(关系数据库)
  • 📊 返回新增记录统计信息,以及当前是否登录态

技术栈

组件 用途
FastAPI RESTful API框架
httpx 异步 HTTP 搜索 / 登录请求
Playwright 扫脸认证
Tortoise ORM 异步数据库ORM
SQL 数据持久化存储
Uvicorn ASGI服务器

快速开始

环境配置

  1. 安装依赖
pip install -r requirements.txt
playwright install chromium   # 扫脸认证需要,安装一次即可
  1. 创建 .env 文件(可选;不配的话默认用 data/xianyu.sqlite3)
DATABASE_URL=mysql://user:password@localhost/xianyu

启动服务

python spider.py

登录

python spider.py login

终端会显示登录二维码。扫码确认后,如需扫脸认证会自动打开浏览器完成。

也可以:

python spider.py login --cookie    # 粘贴已登录网页的 Cookie
python spider.py login --browser   # 直接打开官方登录页

登录态保存在 data/session.json。GET /auth/status 会向闲鱼确认 Cookie 是否仍有效;失效则显示未登录。

已登录 Cookie 失效后,搜索仍按未登录继续(HTTP 200,logged_in: false,并带 login_expired)。需要登录的接口会 401,请重新运行 python spider.py login。

搜索

python spider.py search 手机 --pages 3
python spider.py search 相机 --sort price_asc --min-price 100 --max-price 800 --city 深圳
python spider.py search 自行车 --no-save

已登录时会自动带上 data/session.json。默认写入数据库;--no-save 只打印 JSON。Cookie 失效时搜索不中断,结果里会标明 login_expired。

私信

登录后启动 API,再打开闲鱼 IM 长连接。

python spider.py login
python spider.py
curl -X POST http://127.0.0.1:8000/im/start
curl http://127.0.0.1:8000/im/status
curl http://127.0.0.1:8000/im/conversations
curl 'http://127.0.0.1:8000/im/messages?conversation_id=对方id'
curl -X POST http://127.0.0.1:8000/im/send \
  -H 'Content-Type: application/json' \
  -d '{"conversation_id":"对方id","to_user_id":"对方id","text":"在的"}'
curl -N http://127.0.0.1:8000/im/events   # SSE:message.received / message.sent

未登录 POST /im/start、POST /im/send 返回 401。未 start 就发送返回 409。历史来自本机数据库,只覆盖进程连上之后收到/发出的文本。不要和网页版 IM 同时开(token 会互踢)。GET /im/status 里 ws_frames / sync_pushes / parsed 用来区分「没推到」和「推到了但没解开」:parsed=0 且 sync_pushes>0 是解码问题;ws_frames=0 则是连接上了但服务端没推。

API 文档

访问 http://localhost:8000/docs 查看交互式文档

搜索接口

POST /search/

请求参数示例:

{
  "keyword": "手机",
  "max_pages": 1,
  "sort": "newest",
  "min_price": 100,
  "max_price": 2000,
  "city": "深圳"
}

sort 可选:newest(默认,最新发布)、price_asc、price_desc、default(综合)。

响应示例:

{
  "status": "success",
  "keyword": "手机",
  "logged_in": false,
  "user_id": "",
  "filters": {"sort": "newest", "min_price": 100, "max_price": 2000, "city": "深圳"},
  "total_results": 30,
  "new_records": 5,
  "new_record_ids": [101,102,103,104,105]
}

使用示例

建议使用 Apifox 或者 Postman 进行测试

cURL 请求

curl -X POST "http://localhost:8000/search/" \
-H "Content-Type: application/json" \
-d '{"keyword": "笔记本电脑", "max_pages": 2}'

Python 客户端

import requests

response = requests.post(
    "http://localhost:8000/search/",
    json={"keyword": "数码相机", "max_pages": 3}
)
print(response.json())

注意事项

  1. 法律合规
    使用前请确保遵守《网络安全法》和闲鱼平台 Robots 协议,本代码仅用于学习研究

  2. 反爬机制
    建议配置代理 IP 池和随机请求间隔,默认配置可能触发反爬限制

  3. 性能调优

  • 调整数据库连接池配置(pool_recycle等参数)
  • 建议生产环境部署时增加 Redis 缓存层

交流与贡献

欢迎贡献,也欢迎友善交流:https://t.me/+fHzEZCAdSwA0NTZl

版权声明

本项目采用 MIT License,请合理使用并注明出处。数据抓取结果不得用于商业用途。

评论

暂无评论