摘要:基于此,我爬取了淘宝上多条月饼的销售数据,为大家展示了一幅漂亮的可视化大屏,解决大家心目中的问题。模块的安装与配置这次爬取淘宝,采用的是最简单的方式控制浏览器进行自动化操作,中途只需要扫码登陆一次,即可完成整个数据的爬取。
朋友们,一年一度的中秋悄然而至,为了响应这次节日,特意写了这篇文章,希望能和大家一起学习。
中秋节,又称祭月节、月光诞、月夕、秋节、仲秋节、拜月节、月娘节、月亮节、团圆节等,是中国民间的传统节日。
中秋节自古便有祭月、赏月、吃月饼、玩花灯、赏桂花、饮桂花酒等民俗,流传至今,经久不息。
每年中秋节到,总会去姥姥那里送中秋,并买上各种各样的月饼,那个时候科技并不怎么发达,不仅没有这么多形形色色的月饼,也不知道哪些月饼卖得好? 月饼的价格分布是怎样的呢? 什么地方的月饼销量最高呢? 简直有十万个为什么,希望别人给我们解答。
随着科技的飞速发展,互联网沟通了你我他。通过淘宝上月饼的销量,就可以解决我们想要知道的好多问题。基于此,我爬取了淘宝上4000多条月饼的销售数据,为大家展示了一幅漂亮的可视化大屏,解决大家心目中的问题。
这次爬取淘宝,采用的是最简单的方式:Selenium控制Chrome浏览器进行自动化操作,中途只需要扫码登陆一次,即可完成整个数据的爬取。
pip install selenium
检验是否安装成功:
配置chromedriver驱动,一定要注意“驱动”和“谷歌浏览器”版本一定是要相匹配,否则不能使用。
这里首先提供一个详细的地址供大家查看:
https://jingyan.baidu.com/article/95c9d20d74a1e8ec4f756149.html
点击“右上角三个点” --> 点击“设置” --> 点击 “关于chrome”,出现如下界面。
这里再次提供一个详细的地址,供大家选择各种版本驱动程序:
http://chromedriver.storage.googleapis.com/index.html
从上面的图中可以看出,谷歌浏览器的版本是【81.0.4044.138】,这里我们选择的对应版本的驱动,如下图所示。
点进该文件后,可以根据我们的操作系统,选择对应的驱动。
解压上述下载好的文件,并将解压后我们得到的chromedriver.exe文件,需要放到python的安装路径下(和python.exe放在一起)。
首先,你可以查看你的python解释器安装在哪里!
然后,将chromedriver.exe放置和python.exe在一起。
使用如下两行代码,如果谷歌浏览器成功被驱动打开,证明上述安装和配置没问题。
from selenium import webdriverbrowser = webdriver.Chrome()
结果如下:
from selenium import webdriverimport time# 创建浏览器对象,该操作会自动帮我们打开Google浏览器窗口browser = webdriver.Chrome()# 调用浏览器对象,向服务器发送请求。该操作会打开Google浏览器,并跳转到“百度”首页browser.get("https://www.baidu.com/")# 最大化窗口browser.maximize_window()# 定位“抗击肺炎”链接内容element = browser.find_element_by_link_text("抗击肺炎")# 为了更好的展示这个效果,我们等待3秒钟time.sleep(3)# 点击上述链接element.click()# 我们再让浏览器停留3秒钟后,再关闭浏览器time.sleep(3)# 操作会自动关闭浏览器browser.close()"""效果这里就不展示了,大家自行下去尝试!"""
from selenium import webdriverimport timeimport csvimport re# 搜索商品,获取商品页码def search_product(key_word): # 定位输入框 browser.find_element_by_id("q").send_keys(key_word) # 定义点击按钮,并点击 browser.find_element_by_class_name("btn-search").click() # 最大化窗口:为了方便我们扫码 browser.maximize_window() # 等待15秒,给足时间我们扫码 time.sleep(15) # 定位这个“页码”,获取“共100页这个文本” page_info = browser.find_element_by_xpath("//div[@class="total"]").text # 需要注意的是:findall()返回的是一个列表,虽然此时只有一个元素它也是一个列表。 page = re.findall("(/d+)",page_info)[0] return page# 获取数据def get_data(): # 通过页面分析发现:所有的信息都在items节点下 items = browser.find_elements_by_xpath("//div[@class="items"]/div[@class="item J_MouserOnverReq "]") for item in items: # 参数信息 pro_desc = item.find_element_by_xpath(".//div[@class="row row-2 title"]/a").text # 价格 pro_price = item.find_element_by_xpath(".//strong").text # 付款人数 buy_num = item.find_element_by_xpath(".//div[@class="deal-cnt"]").text # 旗舰店 shop = item.find_element_by_xpath(".//div[@class="shop"]/a").text # 发货地 address = item.find_element_by_xpath(".//div[@class="location"]").text #print(pro_desc, pro_price, buy_num, shop, address) with open("{}.csv".format(key_word), mode="a", newline="", encoding="utf-8-sig") as f: csv_writer = csv.writer(f, delimiter=",") csv_writer.writerow([pro_desc, pro_price, buy_num, shop, address])def main(): browser.get("https://www.taobao.com/") page = search_product(key_word) print(page) get_data() page_num = 1 while int(page) != page_num: print("*" * 100) print("正在爬取第{}页".format(page_num + 1)) browser.get("https://s.taobao.com/search?q={}&s={}".format(key_word, page_num*44)) browser.implicitly_wait(15) get_data() page_num += 1 print("数据爬取完毕!")if __name__ == "__main__": key_word = input("请输入你要搜索的商品:") browser = webdriver.Chrome() main()
数据清洗很重要,这个对于我们后续做可视化展示,极其重要。因此我们需要根据后面要做的图形,然后进行对应的进行数据清洗。
爬取到的原始数据如下:
整个数据看上去算是比较干净,但是还是有几个地方指的我们处理一下。
# 导包import pandas as pdimport numpy as npimport re# 导入爬取得到的数据df = pd.read_csv("月饼.csv", engine="python", encoding="utf-8-sig", header=None)df.columns = ["商品名", "价格", "付款人数", "店铺", "发货地址"]df.head(10)# 去除重复值print(df.shape)df.drop_duplicates(inplace=True)print(df.shape)# 处理购买人数为空的记录df["付款人数"] = df["付款人数"].replace(np.nan,"0人付款")# 提取数值df["num"] = [re.findall(r"(/d+/.{0,1}/d*)", i)[0] for i in df["付款人数"]] # 提取数值df["num"] = df["num"].astype("float") # 转化数值型# 提取单位(万)df["unit"] = ["".join(re.findall(r"(万)", i)) for i in df["付款人数"]] # 提取单位(万)df["unit"] = df["unit"].apply(lambda x:10000 if x=="万" else 1)# 计算销量df["销量"] = df["num"] * df["unit"]# 删除无发货地址的商品,并提取省份df = df[df["发货地址"].notna()]df["省份"] = df["发货地址"].str.split(" ").apply(lambda x:x[0])# 删除多余的列df.drop(["付款人数", "发货地址", "num", "unit"], axis=1, inplace=True)# 重置索引df = df.reset_index(drop=True)df.to_csv("清洗完成数据.csv",encoding="gbk")
看看清洗后的数据:
可视化是整个文章的亮点所在,所谓“字不如表、表不如图”。整个可视化大屏我们基于以下五个问题开展而来。
# 导入包from pyecharts.charts import Barfrom pyecharts import options as opts # 计算top10店铺shop_top10 = df.groupby("商品名")["销量"].sum().sort_values(ascending=False).head(10)# 绘制柱形图bar0 = Bar(init_opts=opts.InitOpts(width="750px", height="350px")) bar0.add_xaxis(shop_top10.index.tolist())bar0.add_yaxis("sales_num", shop_top10.values.tolist()) bar0.set_global_opts(title_opts=opts.TitleOpts(title="月饼商品销量Top10"), xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-30))) #bar0.render("月饼商品销量Top10.html")bar0.render_notebook()
结果如下:
# 导入包from pyecharts.charts import Barfrom pyecharts import options as opts # 计算top10店铺shop_top10 = df.groupby("店铺")["销量"].sum().sort_values(ascending=False).head(10)# 绘制柱形图bar1 = Bar(init_opts=opts.InitOpts(width="750px", height="350px")) bar1.add_xaxis(shop_top10.index.tolist())bar1.add_yaxis("sales_num", shop_top10.values.tolist()) bar1.set_global_opts(title_opts=opts.TitleOpts(title="月饼店铺销量Top10"), xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-30))) #bar1.render("月饼店铺销量Top10.html")bar1.render_notebook()
结果如下:
from pyecharts.charts import Map # 计算销量province_num = df.groupby("省份")["销量"].sum().sort_values(ascending=False) # 绘制地图map1 = Map(init_opts=opts.InitOpts(width="750px", height="350px"))map1.add("", [list(z) for z in zip(province_num.index.tolist(), province_num.values.tolist())], maptype="china" ) map1.set_global_opts(title_opts=opts.TitleOpts(title="各省份月饼销量分布"), visualmap_opts=opts.VisualMapOpts(max_=300000) )#map1.render("各省份月饼销量分布.html")map1.render_notebook()
结果如下:
from pyecharts.charts import Piedef price_range(x): #按照淘宝推荐划分价格区间 if x <= 22: return "22元以下" elif x <= 115: return "22-115元" elif x <= 633: return "115-633元" else: return "633元以上"df["price_range"] = df["价格"].apply(lambda x: price_range(x)) price_cut_num = df.groupby("price_range")["销量"].sum() data_pair = [list(z) for z in zip(price_cut_num.index, price_cut_num.values)]print(data_pair)# 饼图pie1 = Pie(init_opts=opts.InitOpts(width="750px", height="350px"))# 内置富文本pie1.add( series_name="销量", radius=["35%", "55%"], data_pair=data_pair, label_opts=opts.LabelOpts(formatter="{{b}—占比{d}%}"),)pie1.set_global_opts(legend_opts=opts.LegendOpts(pos_left="left", pos_top="30%", orient="vertical"), title_opts=opts.TitleOpts(title="不同价格区间的月饼销量占比"))#pie1.render("不同价格区间的月饼销量占比.html")pie1.render_notebook()
结果如下:
import jiebaimport jieba.analysetxt = df["商品名"].str.cat(sep="。")# 添加关键词jieba.add_word("粽子", 999, "五芳斋")# 读入停用词表stop_words = []with open("stop_words.txt", "r", encoding="utf-8") as f: lines = f.readlines() for line in lines: stop_words.append(line.strip())# 添加停用词stop_words.extend(["logo", "10", "100", "200g", "100g", "140g", "130g", "月饼", "礼盒装"]) # 评论字段分词处理word_num = jieba.analyse.extract_tags(txt, topK=100, withWeight=True, allowPOS=())# 去停用词word_num_selected = []for i in word_num: if i[0] not in stop_words: word_num_selected.append(i)key_words = pd.DataFrame(word_num_selected, columns=["words","num"])
结果如下:
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/119079.html
摘要:时间永远都过得那么快,一晃从年注册,到现在已经过去了年那些被我藏在收藏夹吃灰的文章,已经太多了,是时候把他们整理一下了。那是因为收藏夹太乱,橡皮擦给设置私密了,不收拾不好看呀。 ...
摘要:文章目录情景再现本文关键词挑个软柿子单页爬取数据处理翻页操作撸代码主调度函数页面抓取函数解析保存函数可视化颜色分布评价词云图源码获取方式情景再现今日天气尚好,女友忽然欲买文胸,但不知何色更美,遂命吾剖析何色买者益众,为点议,事后而奖励之。 ...
摘要:可以看到在元的月饼销量是反常的,说明这个价格比较受人们欢迎。高档的月饼在临近中秋节会买的越来越好,这符合人们的消费习惯。下一步重点研究买的好的店铺,天猫超市与稻香村食品旗舰店,票券票务十年老店主要是卖月饼劵,后面会说到。 造数带你选月饼,点击这里,过节再也不担忧 showImg(https://segmentfault.com/img/remote/1460000011412184);...
摘要:让你收获满满码个蛋从年月日推送第篇文章一年过去了已累积推文近篇文章,本文为年度精选,共计篇,按照类别整理便于读者主题阅读。本篇文章是今年的最后一篇技术文章,为了让大家在家也能好好学习,特此花了几个小时整理了这些文章。 showImg(https://segmentfault.com/img/remote/1460000013241596); 让你收获满满! 码个蛋从2017年02月20...
阅读 1410·2023-04-26 01:28
阅读 3287·2021-11-22 13:53
阅读 1393·2021-09-04 16:40
阅读 3169·2019-08-30 15:55
阅读 2639·2019-08-30 15:54
阅读 2465·2019-08-30 13:47
阅读 3311·2019-08-30 11:27
阅读 1129·2019-08-29 13:21