用Python采集电商平台商品数据进行可视化分析

news2024/11/26 2:56:53

目录标题

      • 前言
      • 环境使用:
      • 模块使用:
      • 基本流程思路:
      • 代码展示
        • 获取数据
        • 扩展知识
        • 数据可视化
      • 尾语

前言

嗨喽~大家好呀,这里是魔王呐 ❤ ~!

环境使用:

  • python 3.8 解释器

  • pycharm 编辑器

模块使用:

第三方模块 需要安装

  • requests —> 发送 HTTP请求

内置模块 不需要安装

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

第三方模块安装:

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

python资料、源码、教程\福利皆: 点击此处跳转文末名片获取

基本流程思路:

一. 数据来源分析

  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

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

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

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

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

    开发者工具: response

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

    商品信息

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

  5. 多页数据采集

代码展示

获取数据

# 导入数据请求模块
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:qian97378免费领
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:qian97378免费领
    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:qian97378免费领
        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:qian97378免费领
        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()


尾语

感谢你观看我的文章呐~本次航班到这里就结束啦 🛬

希望本篇文章有对你带来帮助 🎉,有学习到一点知识~

躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。

最后,宣传一下呀~👇👇👇更多源码、资料、素材、解答、交流皆点击下方名片获取呀👇👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/764855.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式处理器常用存储介质

一、存储器 二、XIP设备 XIP(excute in place)&#xff0c;本地执行。像上述nor flash这种设备&#xff0c;上电后不需要初始化&#xff0c;CPU通过地址总线和数据总线直连的&#xff0c;可以直接访问并取址执行&#xff0c;称之为XIP设备。 像emmc这种&#xff0c;在SOC内部有…

JVM打印GC信息

-XX:PrintGCDetails 一、代码 public class GcDemo {public static void main(String[] args) {Object obj new Object();obj null;System.gc();} } 二、配置 三、测试 [GC (System.gc()) [PSYoungGen: 5242K->872K(152576K)] 5242K->880K(500736K), 0.0011529 sec…

如何使用 Amazon Systems Manager 集中管理 Amazon IoT Greengrass 设备

对于边缘设备管理员来说&#xff0c;远程管理大量不同的系统和应用程序会是一项富有挑战性的任务。Amazon IoT Greengrass 可帮助这些系统管理员管理其边缘设备应用程序堆栈。不过&#xff0c;这些设备上的系统软件必须通过与其大型 IT 企业的运营策略一致的运营策略来单独更新…

文件共享服务器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、概述 二、FTP连接类型 三、端口 四、工作模式 五、安装配置 1、 服务名 2、主配置文件 3、 用户控制文件 4、 用户验证类型 5、 安装 6、 匿名用户验证 7、本…

python操作Elasticsearch数据库

Elasticsearch&#xff08;ES&#xff09;,ES是一个开源的高扩展的分布式全站搜索引擎&#xff0c;是整个Elastic Stack技术栈的核心。它可以近乎实时的存储、检索数据&#xff1b;本身扩展性很好&#xff0c;可以扩展到上百台服务器&#xff0c;处理PB级别的数据。 安装好ES之…

go mod 设置国内源 windows 环境 win10

启用 go module 功能 go env -w GO111MODULEon 配置 goproxy 变量 go env -w GOPROXYhttps://goproxy.cn,direct 下载包就行了&#xff0c;速度飞快 go mod tidy 检测 goproxy 是否配置好 运行 go env | findstr goproxy 查看 goproxy Go module 从 Go v1.12 版本开始存在&a…

springboot3+vue3 前后端分离项目模板

更好的阅读体验 \color{red}{更好的阅读体验} 更好的阅读体验 项目地址 功能简介-视频演示 功能概要 支持登录和注册功能。支持密码找回和邮箱验证。支持“记住我”功能。包含完整的上述功能的基础页面。 登录功能 支持“用户名/密码”登录。登录可选“记住我”&#xff0c;勾…

域名+云服务器+springBoo:怎样零成本进行云服务器的学习

零成本进行云服务器的学习 1.项目开发需要学习云服务器的使用 2.申请域名 为了让服务器运行我的springBoot项目&#xff0c;我们首先需要一个域名&#xff0c;很多网站提供免费域名的使用申请&#xff0c;我在阿里云上申请了一年域名的体验。 3.将域名绑定到三丰云&#xff0c…

WCF的IIS宿主部署

IIS的web服务开启网上已经很多&#xff0c;不再赘述。 关键点&#xff1a;WCF发布的文件夹要加上IIS的权限能够读取。否则报没有权限。

动态规划——删除并获得点数

题目链接 leetcode在线oj题——删除并获得点数 题目描述 给你一个整数数组 nums &#xff0c;你可以对它进行一些操作。 每次操作中&#xff0c;选择任意一个 nums[i] &#xff0c;删除它并获得 nums[i] 的点数。之后&#xff0c;你必须删除 所有 等于 nums[i] - 1 和 nums…

SQL性能分析——执行频率、慢查询日志、profile详情

1.SQL的执行频率 2.慢查询日志 show variables like slow_query_log;修改完成以后&#xff0c;再次查询以后发现&#xff0c;slow_query_log的开关时开着的。 3.profile详情

BGP实验--联邦

1&#xff0c;AS1存在两个环回&#xff0c;一个地址为192.168.1.0/24 该地址不嫩在任何协议中宣告 AS3中存在两个环回&#xff0c;一个地址为192.168.2.0/24该地址不能再任何协议中宣告&#xff0c;最终要求这两个环回可用互相通讯 AS1中的另一个环回为10.0.0.0 24&#…

在 Linux 系统上下载 Android SDK

使用ubuntu系统进行车机开发&#xff0c;今天开始配置环境&#xff0c;首先是下载android studio&#xff0c;然后下载android sdk&#xff0c;这里需要注意的是linux系统不能使用windows系统下的Android sdk&#xff0c;亲测会出现各种问题。 常规思路&#xff0c;下载sdk&am…

【前端知识】JavaScript——<script>的8个属性

【前端知识】JavaScript——<script>的8个属性 <script>元素的8个属性&#xff1a; 属性释义async表示应该立即开始下载脚本&#xff0c;但不能阻止其他页面动作&#xff0c;比如下载资源或等待其他脚本加载。只对外部脚本文件有效。charset使用 src 属性指定的代…

力扣 134. 加油站

题目来源&#xff1a;https://leetcode.cn/problems/gas-station/description/ C题解1&#xff1a; 感觉也属于暴力&#xff0c;有一点点简化。在汽油获得总量小于消耗总量时直接返回-1&#xff0c;对于出发的加油站编号&#xff0c;其当前站的汽油净获得量一定大于等于0&#…

【严重】Grafana Azure AD环境身份认证绕过漏洞

漏洞描述 Grafana 是一个跨平台、开源的数据可视化网络应用平台。Azure AD 是由微软提供的一种云身份验证和访问管理服务。 在 Azure AD 中&#xff0c;多个用户可以拥有相同的电子邮件地址。攻击者可以创建一个与目标 Grafana 账户相同的电子邮件地址的恶意帐户&#xff0c;并…

Java IO流的使用

IO流概述 Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。一个流可以理解为一个数据的序列。输入流表示从一个源读取数据&#xff0c;输出流表示向一个目标写数据。 Java.io 包中的流支持很多种格式&#xff0c;比如&#xff1a;基本…

SQLite数据库介绍以及安装

SQLite简介 轻量化&#xff0c;易用的嵌入式数据库&#xff0c;用于设备端的数据管理&#xff0c;可以理解成单点的数据库。传统服务器型数据 库用于管理多端设备&#xff0c;更加复杂 SQLite是一个无服务器的数据库&#xff0c;是自包含的。这也称为嵌入式数据库&#xff0c…

栈--C语言实现数据结构

本期带大家一起用C语言实现栈&#x1f308;&#x1f308;&#x1f308; 一、栈的概念&#x1f30e; 栈是一种常见的数据结构&#xff0c;它遵循后进先出&#xff08;Last In, First Out&#xff09;的原则。可以将其类比为现实生活中的一摞书或者一叠盘子。 栈由一个连续的内…

前端:运用html+css+js模仿京东上商品图片区域放大特效

前端:运用htmlcssjs模仿京东上商品图片区域放大特效 1. 前言2. 前端界面3. js实现鼠标移入效果4. 实现代码 1. 前言 最近在网页端浏览京东上的商品时&#xff0c;觉得上面的那张gif图片上实现的特效不错&#xff0c;于是自己打算使用htmlcssjs技术来实现一下上述特效效果&#…