[Python实战]采集电商平台商品数据进行可视化分析

2023-11-07

前言

嗨喽~大家好呀,这里是小曼呐 ❤ ~!
在这里插入图片描述

环境使用:

模块使用:

第三方模块 需要安装

  • requests —> 发送 HTTP请求

内置模块 不需要安装

  • csv —> 数据处理中经常会用到的一种文件格式

第三方模块安装:

win + R 输入cmd 输入安装命令 pip install 模块名 (如果你觉得安装速度比较慢, 你可以切换国内镜像源)

基本流程思路:

一. 数据来源分析

1.明确需求

  • 明确采集网站以及数据
    数据: 商品信息

2.抓包分析 --> 通过浏览器自带工具: 开发者工具

  • 打开开发者工具: F12 / 右键点击检查选择network

  • 刷新网页: 让网页数据重新加载一遍

  • 搜索关键字: 搜索数据在哪里

找到数据包: 50条商品数据信息
整页数据内容: 120条 --> 分成三个数据包

  1. 前50条数据 --> 前50个商品ID
  2. 中50条数据 --> 中50个商品ID
  3. 后20条数据 --> 后20个商品ID

已知: 数据分为三组 --> 对比三组数据包请求参数变化规律

请求参数变化规律: 商品ID

分析找一下 是否存在一个数据包, 包含所有商品ID

如果想要获取商品信息 --> 先获取所有商品ID --> ID存在数据包

二. 代码实现步骤: 发送请求 -> 获取数据 -> 解析数据 -> 保存数据

第一次请求 --> 获取商品ID
1.发送请求, 模拟浏览器对于url地址发送请求

请求链接: 商品ID数据

2.获取数据, 获取服务器返回响应数据

开发者工具: response

3.解析数据, 提取我们想要的数据内容

商品ID

第二次请求 --> 获取商品信息

4.发送请求, 模拟浏览器对于url地址发送请求

请求链接: 商品信息数据包

5.获取数据, 获取服务器返回响应数据

开发者工具: response

6.解析数据, 提取我们想要的数据内容

商品信息

7.保存数据, 把信息保存本地文件 csv表格

8.多页数据采集

代码展示

获取数据

# 导入数据请求模块
import requests
# 导入格式化输出模块
from pprint import pprint
# 导入csv
import csv

# 模拟浏览器 -> 请求头 headers <字典>
headers = {
    # 防盗链 告诉服务器请求链接地址从哪里跳转过来
    'Referer': '*****/',
    # 用户代理, 表示浏览器基本身份信息
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)'
}
# 请求链接
# 源码、解答、教程、安装包等资料加V:python10080免费领
url = 'https://m*****/vips-mobile/rest/shopping/pc/search/product/rank'
# 请求参数 <字典>
data = {
    # 回调函数
    # 'callback': 'getMerchandiseIds',
    'app_name': 'shop_pc',
    'app_version': '4.0',
    'warehouse': 'VIP_HZ',
    'fdc_area_id': '104103101',
    'client': 'pc',
    'mobile_platform': '1',
    'province_id': '104103',
    'api_key': '70f71280d5d547b2a7bb370a529aeea1',
    'user_id': '',
    'mars_cid': '1689245318776_e2b4a7b51f99b3dd6a4e6d356e364148',
    'wap_consumer': 'a',
    'standby_id': 'nature',
    'keyword': '泳衣',
    'lv3CatIds': '',
    'lv2CatIds': '',
    'lv1CatIds': '',
    'brandStoreSns': '',
    'props': '',
    'priceMin': '',
    'priceMax': '',
    'vipService': '',
    'sort': '0',
    'pageOffset': '0',
    'channelId': '1',
    'gPlatform': 'PC',
    'batchSize': '120',
    '_': '1689250387620',
}
# 发送请求 --> <Response [200]> 响应对象
response = requests.get(url=url, params=data, headers=headers)
# 商品ID -> 120个
products = [i['pid'] for i in response.json()['data']['products']]
# 把120个商品ID 分组 --> 切片 起始:0 结束:50 步长:1
# 列表合并成字符串
product_id_1 = ','.join(products[:50]) #  提取前50个商品ID 0-49
product_id_2 = ','.join(products[50:100]) #  提取中50个商品ID 50-99
product_id_3 = ','.join(products[100:]) #  提取后20个商品ID 100到最后
product_id_list = [product_id_1, product_id_2, product_id_3]

for product_id in product_id_list:
    # 请求链接
    源码、解答、教程、安装包等资料加V:python10080免费领
    link = 'https://*****/vips-mobile/rest/shopping/pc/product/module/list/v2'
    # 请求参数
    params = {
        # 'callback': 'getMerchandiseDroplets2',
        'app_name': 'shop_pc',
        'app_version': '4.0',
        'warehouse': 'VIP_HZ',
        'fdc_area_id': '104103101',
        'client': 'pc',
        'mobile_platform': '1',
        'province_id': '104103',
        'api_key': '70f71280d5d547b2a7bb370a529aeea1',
        'user_id': '',
        'mars_cid': '1689245318776_e2b4a7b51f99b3dd6a4e6d356e364148',
        'wap_consumer': 'a',
        'productIds': product_id,
        'scene': 'search',
        'standby_id': 'nature',
        'extParams': '{"stdSizeVids":"","preheatTipsVer":"3","couponVer":"v2","exclusivePrice":"1","iconSpec":"2x","ic2label":1,"superHot":1,"bigBrand":"1"}',
        'context': '',
        '_': '1689250387628',
    }
    # 发送请求
    json_data = requests.get(url=link, params=params, headers=headers).json()
    for index in json_data['data']['products']:
        # 商品信息
        attr = ','.join([j['value'] for j in index['attrs']])
        # 创建字典
        dit = {
            '标题': index['title'],
            '品牌': index['brandShowName'],
            '原价': index['price']['marketPrice'],
            '售价': index['price']['salePrice'],
            '折扣': index['price']['mixPriceLabel'],
            '商品信息': attr,
            '详情页': f'*****/detail-{index["brandId"]}-{index["productId"]}.html',
        }

扩展知识

1.模拟浏览器: 为了防止被反爬

可以在开发者工具中复制粘贴

2.请求链接: 请求参数

长链接分段写:
1.问号前面 -> 请求链接

2.问号后面 -> 请求参数/查询参数

3.批量替换:

  • 选择替换的内容 ctrl + R
  • 使用正则进行匹配
    (.?): (.)
    ‘$1’: ‘$2’,

4.字典取值 -> 根据键值对取值

根据冒号左边的内容, 提取冒号右边内容

5.空列表

products = []

列表<数据容器>, 装东西的盒子 {‘pid’: ‘6919798151514518861’} 盒子里苹果

for i in response.json()[‘data’][‘products’]:

i 塑料袋 把苹果装起来 --> 列表里面元素赋值给i

print(i[‘pid’])

products.append(i[‘pid’]) # 往 products 列表里面添加 i[‘pid’] 元素

6.只要获取 response.json() 时候报错:

  • requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

原因: 获取 response.json() 必须是完整json数据格式

数据可视化

from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
import pandas as pd
df = pd.read_csv('data.csv')
df.head()
def gender_category(gender):
    if '男' in gender:
        return '男性'
    elif '女' in gender:
        return '女性'
    else:
        return '未知'
df['性别'] = df['标题'].apply(gender_category)
sex_num = df['性别'].value_counts().to_list()
sex_type = df['性别'].value_counts().index.to_list()
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.faker import Faker


c = (
    Bar()
    .add_xaxis(sex_type)
    .add_yaxis("", sex_num)
    .set_global_opts(
    完整源码、解答、教程、安装包等资料加V:python10080免费领
        title_opts=opts.TitleOpts(title="泳衣商品性别占比", subtitle=""),
        brush_opts=opts.BrushOpts(),
    )
)
c.load_javascript()
from pyecharts import options as opts
from pyecharts.charts import Pie

c = (
    Pie()
    .add("", [list(z) for z in zip(sex_type, sex_num)])
    .set_global_opts(title_opts=opts.TitleOpts(title="泳衣商品性别占比"))
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)
c.render_notebook()

shop_num = df['品牌'].value_counts().to_list()
shop_type = df['品牌'].value_counts().index.to_list()
c = (
    Pie()
    .add(
        "",
        [
            list(z)
            for z in zip(shop_type, shop_num)
        ],
        center=["40%", "50%"],
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="商品品牌分布占比"),
        legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical"),
    )
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)
c.render_notebook()

# 按城市分组并计算平均薪资
avg_salary = df.groupby('品牌')['售价'].mean()
ShopType = avg_salary.index.tolist()
ShopNum = [int(a) for a in avg_salary.values.tolist()]
# 创建柱状图实例
c = (
    Bar()
    .add_xaxis(ShopType)
    .add_yaxis("", ShopNum)
    .set_global_opts(
        title_opts=opts.TitleOpts(title="各大品牌商品售价平均价格"),
        visualmap_opts=opts.VisualMapOpts(
            dimension=1,
            pos_right="5%",
            max_=30,
            is_inverse=True,
        ),
       # 完整源码、解答、教程、安装包等资料加V:python10080免费领
        xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45))  # 设置X轴标签旋转角度为45度
    )
    .set_series_opts(
        label_opts=opts.LabelOpts(is_show=False),
        markline_opts=opts.MarkLineOpts(
            data=[
                opts.MarkLineItem(type_="min", name="最小值"),
                opts.MarkLineItem(type_="max", name="最大值"),
                opts.MarkLineItem(type_="average", name="平均值"),
            ]
        ),
    )
)

c.render_notebook()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
尾语
感谢你观看我的文章呐~

希望本篇文章有对你带来帮助

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[Python实战]采集电商平台商品数据进行可视化分析 的相关文章

随机推荐

  • 了解文件的随机读写,文件类别、文件缓冲区,文件操作知识点补充(接上文)

    文件的操作 老规矩笔记自取 文件操作进阶笔记 欢迎喜欢学习C C 的朋友互关一起努力 文章目录 文件的操作 一 文件的随机读写 1 fseek 定位文件指针函数 2 ftell 当前偏移量函数 3 rewind 返回起始位置函数 二 文本文
  • java操作seaweedfs

    前置条件是seaweedfs服务已成功启动 具体部署可参考我上篇文章SeaweedFS部署及使用指南 首先导入pom依赖
  • Python Scrapy网络爬虫框架从入门到实战

    Python Scrapy是一个强大的网络爬虫框架 它提供了丰富的功能和灵活的扩展性 使得爬取网页数据变得简单高效 本文将介绍Scrapy框架的基本概念 用法和实际案例 帮助你快速上手和应用Scrapy进行数据抓取 Scrapy是一个基于P
  • SpringMVC源码总结 ViewResolver介绍

    首先我们先看看ModelAndView中重要的View接口 View接口 Java代码 String getContentType Render the view given the specified model p The first
  • QT翻金币小游戏实现(三)

    4 创建翻金币场景 4 1创建翻金币界面 设计好主场景以及选择关卡界面以后 就来到了最重要的一环 翻金币 首先还是创建一个cpp文件命名为PlayScene 第一步在选择关卡中声明PlayScene pScene NULL 方便后面使用 点
  • 模拟点击事件

    一 通过代码模拟用户对按钮的点击 模拟按钮的点击 方法一 使用btn click模拟用户的点击 btn click 方法二 两秒之后自动松开按钮 btn animateClick 2000 区别是方法一没有什么动画 界面展示 方法二有时间效
  • C#笔记9——基于TableLayoutPanel的多分屏、全屏程序

    C 笔记9 基于TableLayoutPanel的多分屏 全屏程序 最近由于工作需要 需要设置一个多分屏窗口以便于多分屏播放视频 思考了一下 大致思路如下 用TableLayoutPanel来划分多个区域 在每个区域中都放入一个Pictur
  • windows下composer切换php不同版本使用

    D object cms gt D sf phpStudy 64 phpstudy pro Extensions php php7 3 4nts php exe D sf phpStudy 64 phpstudy pro Extension
  • A²B汽车音频总线介绍

    A B使远程I S TDM成为可能 I S是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准 该总线专责于设备之间的数据传输 广泛应用于各种多媒体系统 I C是两线式串行总线 用于连接微控制器及其外围设备 简单来说就是I C传
  • CANopen协议 学习笔记

    大纲 前沿 以问题为导向学习是最高效的 本文主要讲述在学习Canopen协议中的一些疑惑点 分享一些学习心得 不讲协议本身的内容 1 主机和从机的概念 2 PDO和SDO的区别是什么 3 OD存在的意义是什么 4 心跳检测的意义 0x00
  • LeetCode 刷题 28

    这一题 第一反应是 用map 或者栈 但是仔细想想后觉得太麻烦了 于是选用了双指针的方法 class Solution public int strStr string haystack string needle int hay 0 in
  • Jmeter测试linux服务器性能,报错:SampleSaveConfiguration.setFormatter(Ljava/text/DateFormat;)V

    1 出现问题 在执行命令 jmeter n t test jmx l log jtl 时 报标题错误 2 原因 Jmeter的版本太高了 不支持其中一个方法了 jmeter版本太高 setFormatter方法在3 1版本后不支持 但是插件
  • python输出个数、给定一个n*n的矩阵m_简述Numpy

    numpy的数组对象ndarray np array 生成一个ndarray数组 np array 输出成 形式 元素由空格分割 轴 axis 保存数据的维度 秩 rank 轴的数量 ndarray对象的属性 属性 说明 ndim 秩 即轴
  • MAC之常用终端命令、隐藏/打开文件、查看磁盘占用情况、系统盘占用存储过大

    1 从普通用户lambo切换到root用户 sudo i 2 从root用户切换到普通用户 exit 3 普通用户之间的切换 sudo 普通用户名 4 sudo su 直接进入sh 3 2 返回到之前的用户 exit 5 回到home目录
  • 使用python进行图片的文字识别

    使用python进行图片的文字识别 文章目录 使用python进行图片的文字识别 安装 Tesseract OCR 安装过程 配置系统的环境变量 安装python的第三方库 Pytesseract库 Pillow库 运行个demo 安装 T
  • MySQL面试八股文(2022最新整理)

    事务的四大特性 事务特性ACID 原子性 Atomicity 一致性 Consistency 隔离性 Isolation 持久性 Durability 原子性是指事务包含的所有操作要么全部成功 要么全部失败回滚 一致性是指一个事务执行之前和
  • 关于深度学习中batch_size参数设置

    关于深度学习中参数的设置 batch size 常用设置 batch的size设置的不能太大也不能太小 因此实际工程中最常用的就是mini batch 一般size设置为几十或者几百 对于二阶优化算法 减小batch换来的收敛速度提升远不如
  • DBeaver数据库连接工具的简单操作

    DBeaver数据库连接工具的简单操作 DBeaver数据库链接工具使用简介 数据链接配置 DBeaver常用功能 功能快捷键 DBeaver数据库链接工具使用简介 官方下载地址链接 https dbeaver io download DB
  • MyBatis-Plus 使用教程

    MyBatis Plus 使用教程 增删改查详细介绍 MyBatis Plus opens new window 简称 MP 是一个 MyBatis opens new window 的增强工具 在 MyBatis 的基础上只做增强不做改变
  • [Python实战]采集电商平台商品数据进行可视化分析

    目录 前言 环境使用 模块使用 第三方模块安装 基本流程思路 代码展示 获取数据 扩展知识 数据可视化 前言 嗨喽 大家好呀 这里是小曼呐 环境使用 python3 8 解释器 pycham 解释器 模块使用 第三方模块 需要安装 requ