Python如何爬取某东羽绒服数据并绘制可视化图
发表于:2025-02-19 作者:千家信息网编辑
千家信息网最后更新 2025年02月19日,本篇文章为大家展示了Python如何爬取某东羽绒服数据并绘制可视化图,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。前就在上,广深的朋友估计还穿着短袖羡慕着北方
千家信息网最后更新 2025年02月19日Python如何爬取某东羽绒服数据并绘制可视化图
本篇文章为大家展示了Python如何爬取某东羽绒服数据并绘制可视化图,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
前就在上,广深的朋友估计还穿着短袖羡慕着北方的下雪气氛。结果就在上周,广深也迎来了降温,大家纷纷加入"降温群聊"。
为了帮助大家抵抗御严寒,我特地爬了下京东的羽绒服数据。为啥不是天猫呢,理由很简单,滑块验证有点麻烦。
数据获取
京东网站是一个ajax动态加载的网站,只能通过解析接口或使用硒自动化测试工具去爬取。关于动态网页爬虫,本公众号历史原创文章介绍过,感兴趣的朋友可以去了解一下。
本次数据获取采用硒,由于我的谷歌浏览器版本更新较快,导致原来的谷歌驱动程序中断。于是,我替换了浏览器自动更新,并下载了对应版本的驱动。
接着,利用硒在京东网搜索羽绒服,手机扫码登录,获得了羽绒服的商品名称,商品价格,店铺名称,评论人数等信息。
from selenium import webdriverfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom lxml import etreeimport randomimport jsonimport csvimport timebrowser = webdriver.Chrome('/菜J学Python/京东/chromedriver')wait =WebDriverWait(browser,50) #设置等待时间url = 'https://www.jd.com/'data_list= [] #设置全局变量用来存储数据keyword ="羽绒服"#关键词def page_click(page_number): try: # 滑动到底部 browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(random.randint(1, 3)) #随机延迟 button = wait.until( EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_bottomPage > span.p-num > a.pn-next > em')) )#翻页按钮 button.click()#点击按钮 wait.until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(30)")) )#等到30个商品都加载出来 # 滑到底部,加载出后30个商品 browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") wait.until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(60)")) )#等到60个商品都加载出来 wait.until( EC.text_to_be_present_in_element((By.CSS_SELECTOR, "#J_bottomPage > span.p-num > a.curr"), str(page_number)) )# 判断翻页成功,高亮的按钮数字与设置的页码一样 html = browser.page_source#获取网页信息 prase_html(html)#调用提取数据的函数 except TimeoutError: return page_click(page_number)
数据清洗
导入数据
import pandas as pdimport numpy as npdf = pd.read_csv("/菜J学Python/京东/羽绒服.csv")df.sample(10)
重命名列
df = df.rename(columns={'title':'商品名称','price':'商品价格','shop_name':'店铺名称','comment':'评论人数'})
查看数据信息
df.info()'''1.可能存在重复值2.商店名称存在缺失值3.评价人数需要清洗'''
RangeIndex: 4950 entries, 0 to 4949Data columns (total 4 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 商品名称 4950 non-null object 1 商品价格 4950 non-null float64 2 店铺名称 4949 non-null object 3 评论人数 4950 non-null object dtypes: float64(1), object(3)memory usage: 154.8+ KB
删除重复数据
df = df.drop_duplicates()
缺失值处理
df["店铺名称"] = df["店铺名称"].fillna("无名氏")
商品名称清洗
厚度
tmp=[]for i in df["商品名称"]: if"厚"in i: tmp.append("厚款") elif"薄"in i: tmp.append("薄款") else: tmp.append("其他")df['厚度'] = tmp
版型
for i in df["商品名称"]: if"修身"in i: tmp.append("修身型") elif"宽松"in i: tmp.append("宽松型") else: tmp.append("其他")df['版型'] = tmp
风格
tmp=[]for i in df["商品名称"]: if"韩"in i: tmp.append("韩版") elif"商务"in i: tmp.append("商务风") elif"休闲"in i: tmp.append("休闲风") elif"简约"in i: tmp.append("简约风") else: tmp.append("其他")df['风格'] = tmp
商品价格清洗
df["价格区间"] = pd.cut(df["商品价格"],[0, 100,300, 500, 700, 1000,1000000],labels=['100元以下','100元-300元','300元-500元','500元-700元','700元-1000元','1000元以上'],right=False)
评价人数清洗
import redf['数字'] = [re.findall(r'(\d+\.{0,1}\d*)', i)[0] for i in df['评论人数']] #提取数字df['数字'] = df['数字'].astype('float') #转化数值型df['单位'] = [''.join(re.findall(r'(万)', i)) for i in df['评论人数']] #提取单位(万)df['单位'] = df['单位'].apply(lambda x:10000if x=='万'else1)df['评论人数'] = df['数字'] * df['单位'] # 计算评论人数df['评论人数'] = df['评论人数'].astype("int")df.drop(['数字', '单位'], axis=1, inplace=True)
店铺名称清洗
df["店铺类型"] = df["店铺名称"].str[-3:]
可视化
引入可视化相关库
import matplotlib.pyplot as pltimport seaborn as sns%matplotlib inlineplt.rcParams['font.sans-serif'] = ['SimHei'] # 设置加载的字体名plt.rcParams['axes.unicode_minus'] = False# 解决保存图像是负号'-'显示为方块的问题 import jiebaimport refrom pyecharts.charts import *from pyecharts import options as opts from pyecharts.globals import ThemeType import stylecloudfrom IPython.display import Image
描述性统计
相关性分析
商品价格分布直方图
sns.set_style('white') fig,axes=plt.subplots(figsize=(15,8)) sns.distplot(df["商品价格"],color="salmon",bins=10) plt.xticks(fontsize=16)plt.yticks(fontsize=16)axes.set_title("商品价格分布直方图")
评论人数分布直方图
sns.set_style('white') fig,axes=plt.subplots(figsize=(15,8)) sns.distplot(df["评论人数"],color="green",bins=10,rug=True) plt.xticks(fontsize=16)plt.yticks(fontsize=16)axes.set_title("评论人数分布直方图")
评论人数与商品价格的关系
fig,axes=plt.subplots(figsize=(15,8)) sns.regplot(x='评论人数',y='商品价格',data=df,color='orange',marker='*')plt.xticks(fontsize=16)plt.yticks(fontsize=16)
羽绒服价格分布
df2 = df["价格区间"].astype("str").value_counts()print(df2)df2 = df2.sort_values(ascending=False)regions = df2.index.to_list()values = df2.to_list()c = ( Pie(init_opts=opts.InitOpts(theme=ThemeType.DARK)) .add("", list(zip(regions,values))) .set_global_opts(legend_opts = opts.LegendOpts(is_show = False),title_opts=opts.TitleOpts(title="羽绒服价格区间分布",subtitle="数据来源:腾讯视频\n制图:菜J学Python",pos_top="0.5%",pos_left = 'left')) .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{d}%",font_size=14)) )c.render_notebook()
评论人数top10店铺
df5 = df.groupby('店铺名称')['评论人数'].mean()df5 = df5.sort_values(ascending=True)df5 = df5.tail(10)print(df5.index.to_list())print(df5.to_list())c = ( Bar(init_opts=opts.InitOpts(theme=ThemeType.DARK,width="1100px",height="600px")) .add_xaxis(df5.index.to_list()) .add_yaxis("",df5.to_list()).reversal_axis() #X轴与y轴调换顺序 .set_global_opts(title_opts=opts.TitleOpts(title="评论人数TOP10",subtitle="数据来源:京东 \t制图:J哥",pos_left = 'left'), xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=11)), #更改横坐标字体大小 #yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=12)), yaxis_opts=opts.AxisOpts(axislabel_opts={"rotate":30})#更改纵坐标字体大小 ) .set_series_opts(label_opts=opts.LabelOpts(font_size=16,position='right')) )c.render_notebook()
版型
df5 = df.groupby('版型')['商品价格'].mean()df5 = df5.sort_values(ascending=True)[:2]#df5 = df5.tail(10)df5 = df5.round(2)print(df5.index.to_list())print(df5.to_list())c = ( Bar(init_opts=opts.InitOpts(theme=ThemeType.DARK,width="1000px",height="500px")) .add_xaxis(df5.index.to_list()) .add_yaxis("",df5.to_list()).reversal_axis() #X轴与y轴调换顺序 .set_global_opts(title_opts=opts.TitleOpts(title="各版型羽绒服均价",subtitle="数据来源:中原地产 \t制图:J哥",pos_left = 'left'), xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=11)), #更改横坐标字体大小 #yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=12)), yaxis_opts=opts.AxisOpts(axislabel_opts={"rotate":30})#更改纵坐标字体大小 ) .set_series_opts(label_opts=opts.LabelOpts(font_size=16,position='right')) )c.render_notebook()
厚度
df5 = df.groupby('厚度')['商品价格'].mean()df5 = df5.sort_values(ascending=True)[:2]#df5 = df5.tail(10)df5 = df5.round(2)print(df5.index.to_list())print(df5.to_list())c = ( Bar(init_opts=opts.InitOpts(theme=ThemeType.DARK,width="1000px",height="500px")) .add_xaxis(df5.index.to_list()) .add_yaxis("",df5.to_list()).reversal_axis() #X轴与y轴调换顺序 .set_global_opts(title_opts=opts.TitleOpts(title="各厚度羽绒服均价",subtitle="数据来源:京东 \t制图:J哥",pos_left = 'left'), xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=11)), #更改横坐标字体大小 #yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=12)), yaxis_opts=opts.AxisOpts(axislabel_opts={"rotate":30})#更改纵坐标字体大小 ) .set_series_opts(label_opts=opts.LabelOpts(font_size=16,position='right')) )c.render_notebook()
风格
df5 = df.groupby('风格')['商品价格'].mean()df5 = df5.sort_values(ascending=True)[:4]#df5 = df5.tail(10)df5 = df5.round(2)print(df5.index.to_list())print(df5.to_list())c = ( Bar(init_opts=opts.InitOpts(theme=ThemeType.DARK,width="1000px",height="500px")) .add_xaxis(df5.index.to_list()) .add_yaxis("",df5.to_list()).reversal_axis() #X轴与y轴调换顺序 .set_global_opts(title_opts=opts.TitleOpts(title="各风格羽绒服均价",subtitle="数据来源:京东 \t制图:J哥",pos_left = 'left'), xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=11)), #更改横坐标字体大小 #yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=12)), yaxis_opts=opts.AxisOpts(axislabel_opts={"rotate":30})#更改纵坐标字体大小 ) .set_series_opts(label_opts=opts.LabelOpts(font_size=16,position='right')) )c.render_notebook()
上述内容就是Python如何爬取某东羽绒服数据并绘制可视化图,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。
商品
人数
价格
评论
数据
名称
商品价格
羽绒
羽绒服
店铺
字体
大小
京东
数字
单位
清洗
厚度
来源
风格
制图
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全教育讲座稿
网络安全证书被禁止
网络安全手抄报内容名人名言
软件开发文档下载音乐
数据库应用在哪些方面
西方给乌克兰提供网络技术和设备
数据库主要表设计原则
王牌战争服务器为什么会消失
中央企业负责人考核网络安全
山西现代化软件开发制造价格
广东erp软件开发外包
铁路局网络安全培训考试
手机软件开发手稿零基础
软件开发与项目管理名词解释
软件开发商专票怎么开
如何在同一个服务器上开小号
中国移动西藏首选dns服务器
目前最常用的软件开发模型
在软件开发中项目经理的职责
游戏软件开发扶持政策国务院
网络技术支持面试题
如何把两个数据库合并到一起
免费日志服务器软件
软件开发的成功例子
软件开发的性别歧视问题
无锡清华紫光软件开发
服务器离线状态
央行信贷数据库企业数量
服务器无显卡
智能模组有什么服务器