1、项目介绍

技术栈:Python语言、Django框架、selenium爬虫框架、谷歌ChromeDriver、Echarts可视化

研究背景:电商竞争白热化,商家亟需实时掌握京东商品销量、价格趋势与用户偏好。利用Selenium模拟浏览器自动化采集多维度数据,结合Django+Echarts构建可视化平台,可在分钟级完成“爬取-清洗-分析-展示”闭环,为运营决策提供低成本数据支撑。

研究意义:系统全程本地部署,保障数据合规;模块化代码支持接入其他电商平台,适合作为“数据分析”“Web开发”课程实践与毕业设计模板,推动大数据在电商运营中的教学落地与产业应用。

2、项目界面

(1)商品类型与购买人数分析
在这里插入图片描述

(2)商品词云图
在这里插入图片描述

(3)店铺销量分析
在这里插入图片描述

(4)京东商品数据采集
在这里插入图片描述

(5)商品查询
在这里插入图片描述

(6)商品价格分析
在这里插入图片描述

3、项目说明

京东商品数据采集分析可视化系统采用Django MVT架构:Selenium+ChromeDriver定时抓取京东商品标题、价格、销量、评论数、店铺等多字段信息,经Pandas去重与标准化后存入MySQL;后端利用Django REST Framework提供分页、搜索、筛选接口,前端Echarts实现销量折线、价格箱线、词云、购买人数分布等多维可视化,支持按商品类型、店铺、时间动态联动刷新。

数据爬取模块采用“Selenium+显式等待”策略,通过随机UA与反检测脚本绕过京东反爬,定时任务增量写入;清洗模块自动统一价格单位、缺失值填充、异常值剔除,保证数据质量。销量分析子模块按日聚合生成趋势折线,揭示3C数码节假日爆发特征;词云图对商品标题分词后去除停用词,字体大小与频次正相关,点击词汇可下钻至对应商品列表。

后台管理基于Django Admin二次开发,支持商品批量上下架、价格手动修正、爬虫任务启停及日志查看;权限分级为超级管理员与运营员两级,确保运营安全。搜索功能采用Whoosh全文索引,支持商品名、店铺名模糊查询,结果高亮显示,响应时间<200ms。分页与懒加载技术保障商品列表万级数据流畅展示。

系统全程本地运行,不依赖外网API,既保护数据隐私,又降低运维成本;代码开源且注释详尽,配套部署文档与演示数据,可作为“数据分析”“Web开发”课程实践案例,也可直接用于毕业设计、科研baseline,推动爬虫与可视化技术从理论走向生产,助力电商企业快速构建属于自己的商品大数据平台。

4、核心代码


from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium import webdriver
from bs4 import BeautifulSoup
from urllib import parse
import time
import pymysql
import os


class pachong_class:
    def __init__(self, B, O, word, pinpai):
        self.begin=B
        self.end =O
        self.word=word
        self.pinpai=pinpai
        # 实例化一个启动对象
        self.chrome_options = webdriver.ChromeOptions()
        # 设置浏览器以无界面方式运行
        # chrome_options.add_argument('--headless')
        self.browser = webdriver.Chrome(executable_path=os.path.join(os.getcwd(), 'app_jd') + '/chromedriver.exe',
                                   options=self.chrome_options)
        self.wait = WebDriverWait(self.browser, 10)
        self.db = pymysql.connect(host="127.0.0.1", user="root", password="123456", db="jd_goods")
        self.cursor = self.db.cursor()  # 使用cursor()方法获取操作游标
        self.count = 0


    def get_url(self,n, word,pinpai):
        print('正在爬取第' + str(n) + '页')
        time.sleep(8)
        # 确定要搜索的商品
        keyword = {'keyword':word}
        # 页面n与参数page的关系
        page = '&page=%s' % (2 * n - 1)
        pinpai='&ev=exbrand_%s'%(pinpai)
        url = 'https://search.jd.com/Search?' +parse.urlencode(keyword) +pinpai+'&enc=utf-8' + page
        print(url)
        return url


    def parse_page(self,url, pinpai):
        print('正在爬取信息并保存......')
        self.browser.get(url)
        # 滑轮下拉至底部,触发ajax
        for y in range(100):
            js = 'window.scrollBy(0,100)'
            self.browser.execute_script(js)
            time.sleep(0.1)
        self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#J_goodsList .gl-item')))
        html = self.browser.page_source
        soup = BeautifulSoup(html, 'lxml')
        # 找到所有商品标签
        goods = soup.find_all('li', class_="gl-item")
        # 遍历每个商品,得到每个商品的信息
        for good in goods:
            num = good['data-sku']
            tag = good.find('div', class_="p-price").strong.em.string
            money = good.find('div', class_="p-price").strong.i.string
            # 因为有些商品没有店铺名,检索store时找不到对应的节点导致报错,故将其设置为“没有找到店铺名”
            store = good.find('div', class_="p-shop").span
            pingjia = good.find('div', class_="p-commit").strong.a.string
            name = good.find('div', class_="p-name p-name-type-2").a.em
            picture = good.find('div', class_="p-img").a.img.get('src')
            address = good.find('div', class_="p-img").find('a')['href']

            if store is not None:
                new_store = store.a.string
            else:
                new_store = '没有找到店铺名'
            new_name = ''
            for item in name.strings:
                new_name = new_name + item
            product = (num, pinpai, new_name, money, new_store, pingjia, picture, address)
            self.save_to_mysql(product)
            #print(product)

    def save_to_mysql(self,result):

        sql = "INSERT INTO app_jd_yuanshi(sku,pinpai,miaoshu,jiage,shangdian,pingjia,tupian_url,zhuye) \
                VALUES ('%d','%s', '%s','%d', '%s','%s', '%s','%s')" % \
                (int(result[0]),result[1],result[2],float(result[3]),result[4],result[5],result[6],result[7])
        print("sql",sql)
        try:
            self.cursor.execute(sql)  # 执行sql语句
            self.db.commit()  # 提交到数据库执行
            print('保存成功!')
            self.count+=1
        except:
            self.db.rollback()  # 发生错误时回滚
            print('保存失败!')


    def get_data(self):
        try:
            print(self.begin,self.end,self.word,self.pinpai)

            # 京东最大页面数为100
            if 1 <= self.end <= 100:
                page = self.end + 1
                for n in range(self.begin, page):
                    url = self.get_url(n, self.word, self.pinpai)
                    self.parse_page(url, self.pinpai)
                print('爬取完毕!')
                self.db.close()  # 关闭数据库连接
                self.browser.close()
                return (self.count)
            else:
                print('请重新输入!')
                return ('请重新输入!')
        except Exception as error:
            print('出现异常!', error)
            return ('出现异常!', error)

5、项目获取

🍅由于篇幅限制,获取完整文章或源码、代做项目的,查看我的【用户名】、【专栏名称】、【顶部选题链接】就可以找到我啦🍅

感兴趣的可以先收藏起来,点赞、关注不迷路,下方查看👇🏻获取联系方式👇🏻

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐