Python采集商品数据信息,做数据可视化分析,又是对数据分析上心的一天

news/2024/5/4 20:15:04/文章来源:https://blog.csdn.net/yxczsz/article/details/129796367

前言

环境使用

在开始之前,安装好我们的代码编辑器和环境是非常重要的

  • Python 3.8
  • pycharm --> 编辑器
  • jupyter notebook --> 数据分析编辑器

模块使用

  • requests >>> pip install requests 数据请求
  • parsel >>> pip install parsel 数据解析
  • csv <表格文件> 内置模块 保存数据

安装第三方模块方法:win + R 输入cmd 输入安装命令 pip install 模块名

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

案例基本思路

  1. 明确需求 <完成>
    明确采集的网站是什么?
    明确采集的数据是什么?
  2. 发送请求, 模拟浏览器对url地址发送请求
  3. 获取数据, 获取网页源代码
  4. 解析数据, 提取我们想要的数据内容 <书籍基本信息>
  5. 保存数据, 保存表格文件里面

请添加图片描述

需用到知识点:

基础知识点:

  • open文件操作 保存
  • for循环
  • 字典创建
  • 函数关键传参
  • print输出函数

采集知识点:

  • requests简单使用
  • parsel css选择器
  • csv 数据持久化

代码展示

完整源码文末名片领取

导入模块

# 导入数据请求模块 --> 第三方模块, 需要安装 pip install requests
import requests
# 导入数据解析模块 --> 第三方模块, 需要安装 pip install parsel
import parsel
# 导入csv模块
import csv

采集多页

for page in range(1, 26):# 请求链接url = f'http://*****.com/books/bestsellers/01.00.00.00.00.00-recent7-0-0-1-{page}'

伪装浏览器

headers = {# User-Agent 表示浏览器基本身份信息'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
}

发送请求

response = requests.get(url=url, headers=headers)
print(response)

<Response [200]> 响应对象

Response中文意思就是响应

<> 表示对象 200 状态码 表示请求成功

把获取下来html字符串数据<response.text>, 转成可解析对象

selector = parsel.Selector(response.text)

返回列表, 列表里面元素都是选择器对象 <每一个li标签的对象>

lis = selector.css('.bang_list_mode li')

for循环遍历, 把列表里面元素一个一个提取出来

提取数据具体内容:

标题 价格 出版社…

    for li in lis:title = li.css('.name a::attr(title)').get()  # 标题comment = li.css('.star a::text').get()  # 评论recommend = li.css('.tuijian::text').get()  # 推荐writer = li.css('.publisher_info a::attr(title)').get()  # 作者date = li.css('.publisher_info span::text').get()  # 日期publisher = li.css('div:nth-child(6) a::text').get()  # 出版社price_n = li.css('.price .price_n::text').get()  # 售价price_r = li.css('.price .price_r::text').get()  # 原价price_s = li.css('.price .price_s::text').get()  # 折扣price_e = li.css('.price_e .price_n::text').get()  # 电子书href = li.css('.name a::attr(href)').get()  # 详情页dit = {'标题': title,'评论': comment,'推荐': recommend,'作者': writer,'日期': date,'出版社': publisher,'售价': price_n,'原价': price_r,'折扣': price_s,'电子书': price_e,'详情页': href,}csv_writer.writerow(dit)# print(title, comment, recommend, writer, date, publisher, price_n, price_r, price_s, price_e, href)print(dit)

创建文件

f = open('书籍25.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=['标题','评论','推荐','作者','日期','出版社','售价','原价','折扣','电子书','详情页',
])
csv_writer.writeheader()

请添加图片描述

请添加图片描述

数据可视化代码:

源码领取方式 请看代码中数字

1.导入模块

import pandas as pd
from pyecharts.charts import *
690643772 ### 源码领取
from pyecharts.globals import ThemeType#设定主题
from pyecharts.commons.utils import JsCode
import pyecharts.options as opts

2.导入数据

df = pd.read_csv('data.csv', encoding='utf-8', engine='python')
df.head()

请添加图片描述

3.数据处理

df['书名'] = df['书名'].apply(lambda x:x.split('(')[0])
df.head()
df['书籍简介'] = df['书名'].str.extract('.*?((.*?))')
df['书籍简介'].fillna('无', inplace=True)
df.head(1)

提取评论数

data = df.apply(lambda x:x['评论'].split('条评论')[0], axis=1)
df['评论数'] = data.astype('int64')

原价、售价、电子书价格 数值化

df['原价'] = df['原价'].str.replace('¥', '')
df['售价'] = df['售价'].str.replace('¥', '')
df['电子书价格'] = df['电子书'].str.replace('¥', '')
df.head(1)

请添加图片描述

df['原价'] = df['原价'].str.replace(',', '').astype('float64')
df['售价'] = df['售价'].str.replace(',', '').astype('float64')

选择需要用到的列

df = df[['书名','书籍简介','评论','作者','日期','出版社','原价','售价','电子书']]
df.head(1)

缺失值

df.isnull().sum()

请添加图片描述

df['作者'].fillna('未知', inplace=True)
df['出版社'].fillna('未知', inplace=True)

请添加图片描述

电子书价格列额外处理

 df['电子书'] = df['电子书'].str.replace(',', '').replace('¥', '').astype('float64')
df['电子书'].fillna('无电子书版本', inplace=True)

重复值

df.duplicated().sum()
df.info()

请添加图片描述

请添加图片描述

4. 可视化

电子书版本占比

per = df['电子书'].value_counts()['无电子书版本']/len(df)
c = (Liquid().add("lq", [1-per], is_outline_show=False).set_global_opts(title_opts=opts.TitleOpts(title="电子书版本占比"))
)
c.render_notebook()

请添加图片描述

from pyecharts import options as opts
from pyecharts.charts import Barc = (Bar().add_xaxis(x).add_yaxis(','.join(x), y).set_global_opts(xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)),title_opts=opts.TitleOpts(title="", subtitle=""),)
)
c.render_notebook()

请添加图片描述

import pyecharts.options as opts
from pyecharts.charts import Pie
690643772 ### 源码领取
content = df['出版社'].value_counts()
# x = content.index.tolist()[:10]
# y = content.values.tolist()[:10]x_data = content.index.tolist()[:10]
y_data = content.values.tolist()[:10]
data_pair = [list(z) for z in zip(x_data, y_data)]
data_pair.sort(key=lambda x: x[1])c = (Pie(init_opts=opts.InitOpts(width="1600px", height="800px", bg_color="#2c343c")).add(series_name="访问来源",data_pair=data_pair,rosetype="radius",radius="55%",center=["50%", "50%"],label_opts=opts.LabelOpts(is_show=False, position="center"),).set_global_opts(title_opts=opts.TitleOpts(title="前10出版社, 书籍占比",pos_left="center",pos_top="20",title_textstyle_opts=opts.TextStyleOpts(color="#fff"),),legend_opts=opts.LegendOpts(is_show=False),).set_series_opts(tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),label_opts=opts.LabelOpts(color="rgba(255, 255, 255, 0.3)"),))
c.render_notebook()

请添加图片描述

from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.faker import Faker
690643772 ### 源码领取
content = df['出版社'].value_counts()  # 读取出版社的数据
x_data = content.index.tolist()[:10]
y_data = content.values.tolist()[:10]
data_pair = [list(z) for z in zip(x_data, y_data)]
data_pair
# x_data = content.index.tolist()[:10]  # 
# y_data = content.values.tolist()[:10]
# data_pair = [list(z) for z in zip(x_data, y_data)]
c = (Pie().add("",data_pair,radius=["40%", "75%"],).set_global_opts(title_opts=opts.TitleOpts(title="出版社前10名"),legend_opts=opts.LegendOpts(orient="vertical", pos_top="15%", pos_left="2%"),).set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")))
c.render_notebook()

请添加图片描述

最后

这篇文章写到这里就结束了 你们需要代码的话 可以私信 也可以评论留言

还可以点击下方名片

👇 问题解答 · 源码获取 · 技术交流 · 抱团学习请点击下方名片 👇

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openKylin社区首届咨询委员会会议成功召开!

2023年3月25日&#xff0c;openKylin社区首届咨询委员会会议在北京成功召开。中国工程院院士廖湘科、倪光南、方滨兴、桂卫华、郑纬民、王耀南&#xff0c;中国电子学会秘书长陈英&#xff0c;中国软件行业协会秘书长吕卫锋&#xff0c;原航天工程大学教授邹鹏&#xff0c;共创…

一起来学5G终端射频标准(TAE for UL-MIMO)

01—TAE的定义我们先来了解一下TAE测试标准的发展演变。在4G LTE的3GPP 36.101-1的技术要求规范中&#xff0c;就给出了对4G终端UL MIMO以及V2X UE的TAE的定义和最小要求&#xff0c;但在36.521-1的4G终端一致性测试规范中并没有对应的章节规定TAE的一致性测试。5G中有所变化&a…

华中师范大学研究生学位论文规范及排版技巧

研究生学位论文规范研究生学位论文是学位申请者获取博士、硕士学位的重要依据&#xff0c;是研究生科研能力、科研成果的集中体现&#xff0c;同时也是重要的社会文献资料。为了规范学位论文撰写&#xff0c;提高我校研究生学位论文质量&#xff0c;根据GB/T7713-1987《科学技术…

每天学一点之Servlet

一、web资源 1、web资源的概念 将web应用部署到tomcat中&#xff0c;web应用中所有的内容都是服务器中的资源 2、web资源的分类 web资源的分类&#xff1a;web应用中src中编写的动态资源&#xff0c;web应用中web中编写的静态资源 静态资源&#xff1a;每次访问时&#xf…

复杂链表的复制-剑指Offer35-java

一、题目描述 请实现 copyRandomList 函数&#xff0c;复制一个复杂链表。在复杂链表中&#xff0c;每个节点除了有一个 next 指针指向下一个节点&#xff0c;还有一个 random 指针指向链表中的任意节点或者 null。 示例 1&#xff1a; 输入&#xff1a;head [[7,null],[13,…

ChartGPT多重插补法 填充缺失点

问题描述已知时间戳与对应的值&#xff0c;需要根据时间戳找到缺失的点&#xff0c;然后进行值的填充。例如&#xff1a;源码<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-math3 --><dependency><groupId>org.apache.commons</gr…

flink执行任务运行10h以后挂掉并且报错

问题描述flink运行jar包任务&#xff0c;运行几个小时或者1天以后&#xff0c;任务就会挂掉&#xff01;&#xff01;&#xff01;第一个错误是2023-02-01 23:43:08,083 INFO org.apache.flink.runtime.executiongraph.ExecutionGraph [] - Window(TumblingEventTimeWindows(60…

【Unity】创建一个自己的AR安卓程序

目录1 环境配置2 下载官方提供的AR Starter工程3 AR Starter工程中的包以及打包设置3.1 Package Manager3.2 Player Settings4 创建一个新的AR场景5 AR场景中的物体6 在unity中运行AR场景7 在AR场景的基础上添加自己的想法7.1 修改Cube的旋转速度/方向7.2 将Cube替换为其他物体…

今年面试好激烈!

金三银四过去一半&#xff0c;市场火热&#xff0c;但是大家就业压力却没有缓解多少。 很多粉丝后台留言&#xff0c;Java程序员面临的竞争太激烈了…… 我自己也有实感&#xff0c;多年身处一线互联网公司&#xff0c;虽没有直面过求职跳槽的残酷&#xff0c;但经常担任技术面…

【开发实践】在线考试系统(一) 生成错题知识点的思维导图

一、需求分析设计 笔者开发了一个在线考试系统&#xff0c;导师提出一个需求&#xff1a;添加对考试错题相关知识点的总结。 在question表中关联知识点的编号&#xff0c;题目可能关联多个知识点。这里笔者的设计是&#xff0c;只关联一个知识点&#xff0c;便于维护。 下面是知…

【python实操】马上毕业了,你还不懂什么是守护线程、线程、进程?(附12306抢票程序-源代码)

作者&#xff1a;20岁爱吃必胜客&#xff08;坤制作人&#xff09;&#xff0c;近十年开发经验, 跨域学习者&#xff0c;目前于海外某世界知名高校就读计算机相关专业。荣誉&#xff1a;阿里云博客专家认证、腾讯开发者社区优质创作者&#xff0c;在CTF省赛校赛多次取得好成绩。…

预训练语言模型(GPT,BERT)

文章目录GPT 模型预训练语言模型模型和学习BERT 模型去噪自编码器模型和学习模型特点References在自然语言处理中事先使用大规模语料学习基于 Transformer 等的语言模型&#xff0c;之后用于各种任务的学习和预测&#xff0c;称这种模型为预训练语言模型。代表性的模型有 BERT …

LCX端口转发之远程桌面端口双重映射多主机转发

1.下载LCX端口转发工具源码及程序: git clone https://github.com/UndefinedIdentifier/LCX lcx1 2.复制到目标机: winxp win2003 win7

上海亚商投顾:创业板指低开高走ChatGPT概念股再爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。市场情绪大小指数今日走势分化&#xff0c;沪指盘中一度跌超1%&#xff0c;午后震荡回升跌幅收窄&#xff0c;创业板指则低开…

iOS多线程——GCD学习总结

文章目录多线程编程进程线程线程与进程的关系CPU核GCD简介为什么我们要使用GCD任务同步执行&#xff08;sync&#xff09;&#xff1a;异步执行&#xff08;async&#xff09;&#xff1a;队列&#xff08;Dispatch Queue&#xff09;串行队列&#xff08;Serial Dispatch Queu…

Tensor高阶用法:快速掌握Tensor切分、变形等方法

要想在实际的应用中更灵活地用好 Tensor&#xff0c;Tensor 的连接、切分等操作也是必不可少的。我们就通过一些例子和图片来一块学习下。虽然这几个操作比较有难度&#xff0c;但只要耐心分析&#xff0c;然后上手练习&#xff0c;还是可以拿下的。 Tensor 的连接操作 在项目…

SQL语法基础

简介 SQL (Structured Query Language) 是具有数据操纵和数据定义等多种功能的数据库语言&#xff0c;这种语言具有交互性特点&#xff0c;能为用户提供极大的便利&#xff0c;数据库管理系统应充分利用SQL语言提高计算机应用系统的工作质量与效率。 以下介绍postgresql语法&am…

ChatGPT的多种用法(持续更新中。。。)

指南 写小说 “写一本拥有出人意料结局的推理小说。” “写一个让读者参与其中的交互小说。” “为孩子们写一本激励他们勇敢面对挑战的小说。” “编写一个有关科技创新的未来世界的小说。” “创造一个让读者感到沉浸其中的幻想故事。” 充当 Linux 终端 我想让你充当…

数据结构绪论

​ 文章目录1 知识结构2 数据结构的基本概念2.1 算法的基本概念2.2 数据结构三要素2.2.1 数据的逻辑结构线性结构非线性结构2.2.2 数据的存储&#xff08;物理&#xff09;结构数据结构的四种存储结构2.2.3 数据的运算3 算法的基本概念3.1 基本概念3.1.1 算法&#xff08;Algor…

MIPI D-PHYv2.5笔记(5) -- 不同的PHY配置方式

声明&#xff1a;作者是做嵌入式软件开发的&#xff0c;并非专业的硬件设计人员&#xff0c;笔记内容根据自己的经验和对协议的理解输出&#xff0c;肯定存在有些理解和翻译不到位的地方&#xff0c;有疑问请参考原始规范看 规范5.7章节列举了一些常见的PHY配置&#xff0c;但实…