摘要:基于此,我爬取了淘寶上多條月餅的銷售數據,為大家展示了一幅漂亮的可視化大屏,解決大家心目中的問題。模塊的安裝與配置這次爬取淘寶,采用的是最簡單的方式控制瀏覽器進行自動化操作,中途只需要掃碼登陸一次,即可完成整個數據的爬取。
朋友們,一年一度的中秋悄然而至,為了響應這次節日,特意寫了這篇文章,希望能和大家一起學習。
中秋節,又稱祭月節、月光誕、月夕、秋節、仲秋節、拜月節、月娘節、月亮節、團圓節等,是中國民間的傳統節日。
中秋節自古便有祭月、賞月、吃月餅、玩花燈、賞桂花、飲桂花酒等民俗,流傳至今,經久不息。
每年中秋節到,總會去姥姥那里送中秋,并買上各種各樣的月餅,那個時候科技并不怎么發達,不僅沒有這么多形形色色的月餅,也不知道哪些月餅賣得好? 月餅的價格分布是怎樣的呢? 什么地方的月餅銷量最高呢? 簡直有十萬個為什么,希望別人給我們解答。
隨著科技的飛速發展,互聯網溝通了你我他。通過淘寶上月餅的銷量,就可以解決我們想要知道的好多問題。基于此,我爬取了淘寶上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("http://div[@class="total"]").text # 需要注意的是:findall()返回的是一個列表,雖然此時只有一個元素它也是一個列表。 page = re.findall("(/d+)",page_info)[0] return page# 獲取數據def get_data(): # 通過頁面分析發現:所有的信息都在items節點下 items = browser.find_elements_by_xpath("http://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}—占比rbth5zb%}"),)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"])
結果如下:
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/119079.html
摘要:時間永遠都過得那么快,一晃從年注冊,到現在已經過去了年那些被我藏在收藏夾吃灰的文章,已經太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設置私密了,不收拾不好看呀。 ...
摘要:文章目錄情景再現本文關鍵詞挑個軟柿子單頁爬取數據處理翻頁操作擼代碼主調度函數頁面抓取函數解析保存函數可視化顏色分布評價詞云圖源碼獲取方式情景再現今日天氣尚好,女友忽然欲買文胸,但不知何色更美,遂命吾剖析何色買者益眾,為點議,事后而獎勵之。 ...
摘要:可以看到在元的月餅銷量是反常的,說明這個價格比較受人們歡迎。高檔的月餅在臨近中秋節會買的越來越好,這符合人們的消費習慣。下一步重點研究買的好的店鋪,天貓超市與稻香村食品旗艦店,票券票務十年老店主要是賣月餅劵,后面會說到。 造數帶你選月餅,點擊這里,過節再也不擔憂 showImg(https://segmentfault.com/img/remote/1460000011412184);...
摘要:讓你收獲滿滿碼個蛋從年月日推送第篇文章一年過去了已累積推文近篇文章,本文為年度精選,共計篇,按照類別整理便于讀者主題閱讀。本篇文章是今年的最后一篇技術文章,為了讓大家在家也能好好學習,特此花了幾個小時整理了這些文章。 showImg(https://segmentfault.com/img/remote/1460000013241596); 讓你收獲滿滿! 碼個蛋從2017年02月20...
閱讀 1495·2023-04-26 01:28
閱讀 3314·2021-11-22 13:53
閱讀 1420·2021-09-04 16:40
閱讀 3189·2019-08-30 15:55
閱讀 2676·2019-08-30 15:54
閱讀 2488·2019-08-30 13:47
閱讀 3365·2019-08-30 11:27
閱讀 1145·2019-08-29 13:21