Python获取某品牌加盟数据采集实现可视化数据分析

news2024/10/7 17:36:47

前言

大家早好、午好、晚好吖 ❤ ~欢迎光临本文章

开发环境 :

  • python 3.8 运行代码

  • pycharm 2022.3 辅助敲代码

  • jupyter 数据分析使用软件

模块使用 :

  • requests 数据请求模块 需要安装

  • parsel 数据解析模块

  • csv

  • pandas

  • pyecharts

第三方模块安装:

win + R 输入cmd 输入安装命令 pip install 模块名

(如果你觉得安装速度比较慢, 你可以切换国内镜像源)

完整源码、教程 点击此处跳转文末名片获取 ,我都放在这里了。

实现本案例基本步骤:

  1. 明确需求:

    • 明确采集网址以及数据内容

      网址:

      数据: 每一个品牌基本信息

    I. 抓包分析, 数据是请求那个链接可以得到

    • 开发者工具进行抓包 --> F12 / FN+F12 / 鼠标右键点击检测选择network

    • 刷新网页

    • 搜索数据

    II. 如何才能获取多个数据

    对于单个数据包链接地址, 进行比较, 查看规律

    brandId --> 品牌ID变化

    能不能在某一个数据包当中, 找到所有品牌ID --> 列表页面抓包

代码实现步骤:

  1. 发送请求, 对于 品牌ID的数据包发送请求

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

  3. 解析数据, 提取我们需要的内容 ==> 品牌ID

  4. 发送请求, 请求数据详情页

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

  6. 解析数据, 提取我们需要的内容 ==> 品牌基本信息

  7. 保存数据, 把数据保存到表格文件

数据采集

导入模块

import requests
import parsel
import csv

写入表格

f = open('品牌.csv', mode='w', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=[
    '品牌',
    '公司',
    '业态类别',
    '拓展状态',
    '创立时间',
    '人均消费/客单价',
    '开店方式',
    '合作期限',
    '面积要求',
    '已进购物中心',
    '详情页',
])
csv_writer.writeheader()

模拟浏览器 <请求头伪装>

headers = {
    # User-Agent 用户代理 表示浏览器基本身份信息
    # 源码、解答、教程+V:qian97378获取
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
}

多页采集

for page in range(1, 11):
    print(f'---正在采集第{page}的数据内容---')

请求链接

    url = 'http://******/wsapi/brand/list3_4'
    # 提交表单
    data = {
        "isHaveLink": "",
        "isTuozhan": "",
        "isXxPp": "",
        "kdfs": "",
        "key": "",
        "orderBy": "1",
        "pageNum": page,
        "pageSize": 60,
        "pid": "",
        "qy_p": "",
        "qy_r": "",
        "xqMj": "",
        "ytlb1": "",
        "ytlb2": ""
    }

发送请求

    response = requests.post(url, json=data, headers=headers)
    json_data = response.json()
    for index in json_data['data']['list']:
        link = f'http://*******/brandDetail?brandId={index["brandId"]}'
        html_data = requests.get(link, headers=headers).text
        selector = parsel.Selector(html_data)
        源码、解答、教程+V:qian97378获取
        title = selector.css('h1.detail-one-tit::text').get().strip()  # 品牌
        company = selector.css('p.detail-company::text').get()  # 公司
        info = selector.css('div.detail-three-tit::text').getall()
        value = selector.css('span.detail-option-value::text').getall()
        dit = {
            '品牌': title,
            '公司': company,
            '业态类别': info[0],
            '拓展状态': info[1],
            '创立时间': value[0],
            '人均消费/客单价': value[1].strip(),
            '开店方式': value[2],
            '合作期限': value[3],
            '面积要求': value[4],
            '已进购物中心': value[5],
            '详情页': link,
        }
        # 写入数据
        csv_writer.writerow(dit)
        print(dit)

括展小知识

  1. css选择器: 根据标签属性提取数据内容

    strip() 去除左右两端的空格

    h1.detail-one-tit 定义类名为 detail-one-tit 的h1标签 text 获取标签文本数据

数据可视化

import pandas as pd
df = pd.read_csv('data.csv')
df.head()

df['已进购物中心'] = df['已进购物中心'].astype(str).str.replace('家', '').str.replace('--', '0').astype(int)
df['人均消费'] = df['人均消费/客单价'].astype(str).str.replace('--', '0').str.split('-').str.get(0).astype(int)
top10 = df[['品牌', '已进购物中心', '人均消费']].sort_values('已进购物中心', ascending=False)[:10]
ShopList = list(top10['品牌'])
counts = list(top10['已进购物中心'])
price = list(top10['人均消费'])
print(ShopList)
print(counts)
print(price)
from pyecharts import options as opts
from pyecharts.charts import Bar

c = (
    Bar()
    .add_xaxis(ShopList)
    .add_yaxis("已进购物中心", counts)
    源码、解答、教程+V:qian97378获取
    .add_yaxis("人均消费", price)
    .set_global_opts(
        xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)),
        title_opts=opts.TitleOpts(title="加盟品牌Top10", subtitle="已进购物中心"),
    )
)
c.render_notebook()

df.head()

top10 = df[['品牌', '人均消费']].sort_values('人均消费', ascending=False)[:10]
ShopList = list(top10['品牌'])
price = list(top10['人均消费'])
from pyecharts import options as opts
from pyecharts.charts import Bar

c = (
    Bar()
    .add_xaxis(ShopList)
    .add_yaxis("人均消费", price)
    .set_global_opts(
        xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)),
        title_opts=opts.TitleOpts(title="加盟品牌Top10", subtitle="人均消费"),
    )
)
c.render_notebook()

df['面积要求'] = df['面积要求'].astype(str).str.replace('--', '0').str.split('-').str.get(0).astype(int)
源码、解答、教程+V:qian97378获取
top10 = df[['品牌', '面积要求']].sort_values('面积要求', ascending=False)[:10]
ShopList = list(top10['品牌'])
area = list(top10['面积要求'])
from pyecharts import options as opts
from pyecharts.charts import Bar

c = (
    Bar()
    .add_xaxis(ShopList)
    .add_yaxis("面积要求", area)
    .set_global_opts(
        xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)),
        title_opts=opts.TitleOpts(title="加盟品牌Top10", subtitle="面积要求"),
    )
)
c.render_notebook()

import pyecharts.options as opts
from pyecharts.charts import Line
from pyecharts.faker import Faker


c = (
    Line()
    .add_xaxis(ShopList)
    .add_yaxis("面积要求", area, is_connect_nones=True)
    .set_global_opts(title_opts=opts.TitleOpts(title="加盟品牌Top10-面积"))
#     .render("line_connect_null.html")
)
c.render_notebook()

尾语 💝

好了,今天的分享就差不多到这里了!

完整代码、更多资源、疑惑解答直接点击下方名片自取即可。

对下一篇大家想看什么,可在评论区留言哦!看到我会更新哒(ง •_•)ง

喜欢就关注一下博主,或点赞收藏评论一下我的文章叭!!!

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

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

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

相关文章

基于Java开发的企业人力资源管理系统(ehr系统)

一、项目介绍 一款全源码可二开&#xff0c;可基于云部署、私有部署的企业级数字化人力资源管理系统&#xff0c;涵盖了招聘、人事、考勤、绩效、社保、酬薪六大模块&#xff0c;解决了从人事招聘到酬薪计算的全周期人力资源管理&#xff0c;符合当下大中小型企业组织架构管理…

BOLD信号的生理建模及其对有效连接的影响

导读 本文提供了BOLD信号生理过程的总体概述(即生成生物物理模型)&#xff0c;包括它们在生理信息动态因果模型(P-DCM)框架下的时间过程特征。BOLD信号主要由顺磁性脱氧血红蛋白的变化决定&#xff0c;而顺磁性脱氧血红蛋白的变化是氧代谢、脑血流量和脑血容量变化共同作用的结…

测试工程师首chatGPT,编写python读取xmind测试用例chatgtp+python+xmind

背景 有用xmind写测试用例的吧&#xff0c;统计一个xmind的条&#xff0c;需要花大量的时间&#xff0c;还有要统计有多少条冒烟的&#xff0c;多少条不通过的&#xff0c;还有通过的条数。 需求 快速使用python&#xff0c;写一个简单的脚本&#xff0c;统计所有xmind节点&…

【IP地址与子网掩码】网络杂谈(19)之IP地址分类与子网掩码的概念

涉及知识点 什么是子网掩码&#xff0c;IP地址的分类&#xff0c;子网掩码的概念&#xff0c;深入了解子网掩码与IP地址,A类&#xff0c;B类&#xff0c;C类&#xff0c;D类&#xff0c;E类ip地址范围。 原创于&#xff1a;CSDN博主-《拄杖盲学轻声码》&#xff0c;更多内容可…

Linux调试笔记

gdb调试----------------------------------------------------------------------------------------- CMakeFile.txt加入set(CMAKE_BUILD_TYPE Debug) gdb ./rknn_MNIST 打断点 b 110/main(行号/函数名) 单步调试 s&#xff08;step&#xff09; 单步跳过 n&#xff08;n…

计算机组成原理(2)_计算机基本组成

计算机组成系列文章目录 第一章 计算机的基本组成 1. 大致简介 2. 计算机基本组成 第二章 计算机的指令和运算 第三章 处理器设计 第四章 存储器和IO系统 文章目录 计算机组成系列文章目录前言参考资料一、组成架构&#xff08;冯/图&#xff09;1. 组成架构2. 冯诺依曼3. 图灵…

力扣 530. 二叉搜索树的最小绝对差 / 783. 二叉搜索树节点最小距离

题目来源 530&#xff1a;https://leetcode.cn/problems/minimum-absolute-difference-in-bst/description/ 783&#xff1a; https://leetcode.cn/problems/minimum-distance-between-bst-nodes/ C题解1&#xff1a;递归法&#xff0c;中序遍历。通过中序遍历将二叉搜索树转…

【Android】Android类加载机制

ClassLoader介绍 任何一个 Java 程序都是由一个或多个 class 文件组成&#xff0c;在程序运行时&#xff0c;需要将 class 文件加载到 JVM 中才可以使用&#xff0c;负责加载这些 class 文件的就是 Java 的类加载机制。ClassLoader 的作用简单来说就是加载 class 文件&#xf…

echarts图表-实现中国地图的绘制

第一步&#xff1a;引入中国地图的json数据&#xff0c;初始化echarts的dom结构&#xff0c;使用registerMap方法加载地图数据&#xff08;注&#xff1a;echarts5.X版本后删除了中国地图的JSON&#xff0c;需自行下载JSON或降低echarts版本&#xff09; 第二步&#xff1a;传输…

React通过props的children实现插槽功能

可能会比较遗憾的说 React中并没有vue中的 slot 插槽概念 不过 可以通过props.children 实现类似功能 我们先创建一个React项目 在src下创建目录components 在下面创建一个dom.jsx组件 参考代码如下 import React from "react" export default class dom extends R…

Android学习日志 一、滚动视图的嵌套

文章目录 滚动视图的嵌套创建项目(前期准备)工程搭建编写XML正式代码 By-Round Moon 滚动视图的嵌套 说明:本博客是博主学习安卓开发的第一个案例。接下来会进行一系列的样例&#xff0c;含很多基础部分&#xff0c;各位观众老爷请见谅。 Android Studio 版本:2022.2.1 patch …

如何将MBR转为GUID?这方法易于使用且安全!

为什么要将MBR转为GUID(GPT)&#xff1f; MBR代表主引导记录&#xff0c;它使用Legacy BIOS分区表。而GPT磁盘&#xff0c;也就是GUID分区表的缩写&#xff0c;是一种引入了统一可扩展固件接口 (UEFI) 的新布局。GPT磁盘有2个主要优势&#xff1a; GPT磁盘每个分区…

前端-CSS 字体和文本样式

字体大小 /* 浏览器默认字体大小 16px */ font-size: 16px;<div style"font-size: 16px;">Hello World!</div> <div style"font-size: 26px;">Hello World!</div>字体粗细 font-weight: 400;<div style"font-weight: no…

JumpServer开源堡垒机页面配置

JumpServer开源堡垒机页面配置 一、登录二、功能模块2.1、控制台2.1.1、用户管理2.1.1.1、用户列表2.1.1.2、用户组 2.1.2、资产管理2.1.2.1、资产列表2.1.2.1.1、创建服务器链接2.1.2.1.2、创建数据库MySQL链接 2.1.2.2、网域列表2.1.2.3、平台列表2.1.2.4、标签列表 2.1.3、账…

同源建模MOE:请叫我永远的神!

同源建模 实/操/篇 1.分子力场的设置 MOE中缺省的分子力场MMFF94x是一个用于小分子和复合物模拟的力场,不能很好地适用于大分子模拟,由于这里我们要进行同源模建,模拟对象是蛋白质结构,因此首先要将缺省分子力场MMFF94x更改为适用于蛋白质模拟的相关分子力场&#xff0c;如A…

【PCL】Ouster 和 Velodyne 激光雷达的 PCL 点云数据格式

【PCL】Ouster 和 Velodyne 激光雷达的 PCL 点云数据格式 0 news1 Ouster2 Velodyne3 数据类型转换 0 news Ouster 和 Velodyne 两公司合并。 1 Ouster GitHub: Link namespace ouster_ros {struct EIGEN_ALIGN16 Point {PCL_ADD_POINT4D;float intensity;uint32_t t;uint16_t…

conda 根目录内存满,更换新的目录

默认conda环境是在根目录&#xff0c;只需修改默认的目录即可 1 修改.condarc文件 vim ~/.condarc# 添加一行即可 envs_dirs:- /disk3/miniconda_envs/envs2 验证 创建一个conda环境 查看创建的路径 conda env list 这样以后都换把相关创建的包安装在disk3下&#xff0c;缓…

C++ - 20230630

一 . 思维导图 二. #include <iostream> using namespace std;class Person { private:int age;int p; public://无参构造Person(){age 0;p 0;}//有参构造Person(int age,int p):age(age), p(p){}//拷贝构造函数Person(Person &other) {this->age other.age;t…

《移动互联网技术》第九章 感知与多媒体: 了解质感设计的基本原则和设计方法

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

Tomcat 部署优化

目录 一.Tomcat介绍 二.了解Tomcat里面里面是放什么的 三. Tomcat&#xff1a;是一个特殊的服务 有两个领域 四.tomcat概述 五.再加上那个扩展java虚拟机&#xff08;JVM&#xff09; 调优 tomcat 优化分两种 六.Tomcat核心组件 ​编辑 容器&#xff1a;什么是容器 …