×

《实战!用Scrapy+Flask构建京东商品比价微信机器人》

万邦科技Lex 万邦科技Lex 发表于2026-03-22 11:47:31 浏览17 评论0

抢沙发发表评论

这个主题非常实用,结合了爬虫技术(Scrapy)、后端服务(Flask)和即时通讯工具(微信),非常适合用来构建一个自动化的商品价格监控系统。下面我将为你提供一个完整的实战指南,帮助你一步步实现《用Scrapy+Flask构建京东商品比价微信机器人》。
📌 项目目标:
开发一个微信机器人,用户输入商品名称或链接,机器人自动返回该商品在京东上的历史最低价、当前价,并与淘宝/拼多多等平台进行比价,最终将结果推送到用户微信。
一、技术架构概览
用户(微信)
WeChaty / itchat(微信接入)
Flask API 服务(接收请求,调用爬虫)
Scrapy 爬虫(爬取京东商品数据)
数据存储(MySQL / MongoDB + Redis缓存)
返回比价结果 → 微信回复用户
二、环境准备
  1. 安装依赖

Python 3.8+

pip install scrapy flask pymysql redis requests itchat
  1. 创建项目结构

jd_price_bot/
├── scrapy_project/
│   └── jd_spider/
│       ├── spiders/
│       │   └── jd.py
│       ├── items.py
│       └── pipelines.py
├── app.py              # Flask 主程序
├── wechat_bot.py       # 微信接入模块
├── requirements.txt
└── config.py           # 配置文件(数据库、Redis等)
三、Step 1:使用 Scrapy 爬取京东商品数据
  1. 创建 Scrapy 项目

scrapy startproject scrapy_project
cd scrapy_project
scrapy genspider jd jd.com
  1. 编写 jd.py 爬虫(简化版)

import scrapy
from scrapy_project.items import JdItem
class JdSpider(scrapy.Spider):
name = 'jd'
allowed_domains = ['jd.com']
custom_settings = {
'DOWNLOAD_DELAY': 2,
'DEFAULT_REQUEST_HEADERS': {
'User-Agent': 'Mozilla/5.0 ...',
'Referer': 'https://www.jd.com'
}
}
def start_requests(self):
    keyword = getattr(self, 'keyword', 'iPhone 15')
    url = f'https://search.jd.com/Search?keyword={keyword}'
    yield scrapy.Request(url=url, callback=self.parse)

def parse(self, response):
    for item in response.css('li.gl-item'):
        product = JdItem()
        product['name'] = item.css('.p-name em::text').getall()
        product['price'] = item.css('.p-price i::text').get()
        product['link'] = response.urljoin(item.css('.p-name a::attr(href)').get())
        product['image'] = item.css('.p-img img::attr(data-lazy-img)').get()
        yield product
  1. 定义 Item(items.py)

import scrapy
class JdItem(scrapy.Item):
name = scrapy.Field()
price = scrapy.Field()
link = scrapy.Field()
image = scrapy.Field()
  1. 配置 Pipeline 存储到 MySQL 或 MongoDB

pipelines.py(示例:存入MongoDB)

import pymongo
class MongoPipeline:
def init(self, mongo_uri, mongo_db):
self.mongo_uri = mongo_uri
self.mongo_db = mongo_db
@classmethod
def from_crawler(cls, crawler):
    return cls(
        mongo_uri=crawler.settings.get('MONGO_URI'),
        mongo_db=crawler.settings.get('MONGO_DATABASE', 'jd_data')
    )

def open_spider(self, spider):
    self.client = pymongo.MongoClient(self.mongo_uri)
    self.db = self.client[self.mongo_db]

def close_spider(self, spider):
    self.client.close()

def process_item(self, item, spider):
    self.db['products'].insert_one(dict(item))
    return item
  1. 启用 Pipeline(settings.py)

ITEM_PIPELINES = {
'scrapy_project.pipelines.MongoPipeline': 300,
}
MONGO_URI = 'mongodb://localhost:27017'
MONGO_DATABASE = 'jd_data'
四、Step 2:使用 Flask 提供 API 接口
  1. 创建 app.py

from flask import Flask, request, jsonify
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
from jd_spider.spiders.jd import JdSpider
import threading
app = Flask(name)
@app.route('/api/search', methods=['GET'])
def search_product():
keyword = request.args.get('q', '手机')
result = run_spider(keyword)
return jsonify(result)
def run_spider(keyword):
results = []
def crawl():
    process = CrawlerProcess(get_project_settings())
    process.crawl(JdSpider, keyword=keyword)
    process.start()

thread = threading.Thread(target=crawl)
thread.start()
thread.join(timeout=30)  # 等待爬虫完成

# 从数据库读取最新数据(伪代码)
from pymongo import MongoClient
client = MongoClient("mongodb://localhost:27017")
db = client["jd_data"]
products = list(db.products.find().limit(5))
for p in products:
    results.append({
        "name": "".join(p['name']),
        "price": p['price'],
        "link": p['link'],
        "image": p['image']
    })
return results
if name== 'main':
app.run(port=5000)
五、Step 3:接入微信机器人(使用 itchat)
  1. 创建 wechat_bot.py

import itchat
from flask import request
import requests
@itchat.msg_register(itchat.content.TEXT)
def reply(msg):
if msg.text.startswith("查价"):
keyword = msg.text.replace("查价", "").strip()
try:
data = res.json()
if data:
reply_text = f"🔍 {keyword} 京东报价:\n"
for item in data[:3]:
reply_text += f"{item['name'][:20]}... ¥{item['price']}\n{item['link']}\n\n"
return reply_text
else:
return "未找到相关商品,请换个关键词试试~"
except Exception as e:
return f"查询失败:{str(e)}"
else:
return "发送“查价+商品名”开始比价,如:查价 iPhone 15"
if name== 'main':
itchat.auto_login(hotReload=True)
itchat.run()
六、运行流程
  1. 启动 MongoDB 服务

  2. 启动 Flask API:python app.py

  3. 启动微信机器人:python wechat_bot.py → 扫码登录

  4. 用户发送:“查价 小米14”,机器人返回京东价格 & 链接

七、进阶优化建议
功能增强:
✅ 加入淘宝、拼多多爬虫(需处理反爬)
✅ 历史价格曲线(存储每日价格,绘制图表)
✅ 设置降价提醒(定时任务 + 微信推送)
✅ 支持图片识别搜索(OCR + 百度识图API)
性能优化:
⚡ 使用 Redis 缓存热门商品查询结果
⚡ Scrapy + Kafka 异步任务队列
⚡ Docker 容器化部署
八、注意事项(法律与合规)
⚠️ 遵守 robots.txt,避免高频请求被封 IP
⚠️ 不爬取用户隐私数据
⚠️ 商业用途需获得授权,避免侵权
九、总结
本项目展示了如何从零构建一个实用的电商比价机器人,涵盖:
  • Scrapy 数据采集

  • Flask RESTful API 封装

  • 微信消息交互

  • 数据持久化与展示

这不仅是一个练手项目,更是通往“智能电商助手”的第一步!
🎁 附加资源:
  • GitHub 示例仓库模板(可提供)

  • 京东价格监控 Chrome 插件源码

  • 微信机器人开发文档(itchat / WeChaty)

是否需要我为你生成一个完整的 GitHub 项目目录结构和代码示例压缩包清单,方便你直接克隆开发?


群贤毕至

访客