Python如何爬取某东羽绒服数据并绘制可视化图
发表于:2024-11-11 作者:千家信息网编辑
千家信息网最后更新 2024年11月11日,本篇文章为大家展示了Python如何爬取某东羽绒服数据并绘制可视化图,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。前就在上,广深的朋友估计还穿着短袖羡慕着北方
千家信息网最后更新 2024年11月11日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安全错误
数据库的锁怎样保障安全
服务器天命
保护数据库安全的方法有哪些
下列关于对象关系数据库
什么软件租服务器
软件开发介绍语
萤石云为什么一直显示服务器异常
扬州江都网络安全主题公园
并把结果存入数据库中
ado.net数据库对象
华美优科网络技术官网
access数据库视图
上海极速网络技术有限公司
网络安全为什么这么大
时间服务器怎么开启
公司软件开发作业流程文档
12伏服务器电源能当冲电器吗
职中计算机网络技术是学什么
网络安全法主题班会设计
作品数据库
容商网络技术有限公司
不属于网络安全威胁
网络安全法什么时候提出
吉林现代软件开发价格走势
云服务器改密码成功但还是原来的
浙江通用软件开发预算
关于科技互联网方面的大会
永劫无间怎么玩其他服务器
小学生网络安全讲演比赛图片
星贝壳网络安全课堂
数据库操作日志能改吗