爬取京东淘宝商品销量并可视化处理数据
生活随笔
收集整理的這篇文章主要介紹了
爬取京东淘宝商品销量并可视化处理数据
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
目的:獲取京東和淘寶的同一種手機型號的銷量信息,獲取三組,對比銷量,并將數(shù)據(jù)可視化處理。
一、京東銷量獲取
如下面的例子:
京東銷量: data-sku:對應(yīng)下一個頁面的productId defaultGoodCount:代表銷量 commentCount評論數(shù)==總銷量 fetchJSON_comment98({"productAttr": null,"productCommentSummary": {"skuId": 100011336064,"defaultGoodCount": 133870,"defaultGoodCountStr": "13萬+","commentCount": 193409,"commentCountStr": "19萬+","goodCount": 55121,"goodCountStr": "5.5萬+",},?怎么找到上面的信息呢?就拿榮耀V30手機來講。
打開開發(fā)者工具,點擊商品評價,會出現(xiàn)一大堆數(shù)據(jù),我們選擇JS,然后選擇productPageComments.action
OK,在請求頭中就能看到我們想要的鏈接。然后利用正則表達式提取我們想要的信息即可。
?
?
二、淘寶銷量獲取
如下面的例子:
淘寶銷量: 1、view_sales 2、setMdskip({"defaultModel": {"sellCountDO": {"sellCount": "1.5萬+","success": true}} }) 3、comment_count評論數(shù)==總銷量(我們采用這種方法)那么怎么獲取我們想要的信息呢?我們輸入商品后,選擇銷量排序,會得到這樣的一個鏈接
"https://s.taobao.com/search?q=" + "商品名稱" + "&sort=sale-desc"
右鍵查看源代碼,即可找到我們想到的信息,即“comment_count”,OK,這樣不就好辦了嗎?直接正則表達式提取即可!
三、代碼:
import requests import re import csv from matplotlib import pyplot as plt import matplotlib as mpl import numpy as np list = [] # 列表用來存放商品信息# 構(gòu)造淘寶請求頭 kv = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36","Cookie":'' } # 京東請求頭 jd = {"user-agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36" }# 獲取淘寶HTML頁面 def getHTMLpages(url):try:r = requests.get(url, headers=kv, timeout=30)r.raise_for_status()r.encoding = r.apparent_encodingreturn r.textexcept:return ""# 獲取京東HTML頁面 def getHTMLpages_JD(url):try:r = requests.get(url, headers=jd)# print(r.status_code) # 打印狀態(tài)碼,若為200則正常page_connent = r.content.decode('gbk') # 設(shè)置內(nèi)容編碼格式為gbkreturn page_connentexcept:return "異常"# 將淘寶商品信息存入列表 def getGoodsinfo(list, html, flag):if flag == 0:tit = "榮耀v30手機"elif flag == 1:tit = "小米10手機"else:tit = "vivoS6手機"sales = re.findall(r'\"comment_count\"\:\"[\d]*?\"', html) # 正則表達式查找總銷量sal = eval(sales[0].split(':')[1]) # eval去掉引號,split(":")[1]表示":"后面的內(nèi)容list.append([tit, "淘寶", sal]) # 將信息存進列表return list# 將京東商品信息存入列表 def getGoodsinfo_JD(list, html_jd, flag):if flag == 0:tit = "榮耀v30手機"elif flag == 1:tit = "小米10手機"else:tit = "vivoS6手機"sales = re.findall(r'\"commentCount\"\:[\d]*', html_jd) # 正則表達式查找總銷量sal = eval(sales[0].split(':')[1])list.append([tit, "京東", sal])# 從列表中讀取商品信息 def printGoodsinfo(list):form = "{:<10}\t\t{:<10}\t{:<8}"print(form.format("手機型號", "銷售平臺", "商品銷量", chr(12288)))for i in list: # i代表一行print(form.format(i[0], i[1], i[2], chr(12288)))# 保存數(shù)據(jù)為csv文件 def saveData(list):try:# 創(chuàng)建文件對象f=open('D:\\GoodsInfo.csv','w',newline='',encoding='gbk')# newline=''是為了去掉每條數(shù)據(jù)下面的空行# 基于文件對象構(gòu)建csv寫入對象csv_writer = csv.writer(f)# 構(gòu)建列表頭csv_writer.writerow(["手機型號", "銷售平臺", "商品銷量"])# 寫入csv文件內(nèi)容for i in range(len(list)):csv_writer.writerow(list[i])f.close()print("保存成功!文件為D盤下的GoodsInfo.csv")except:print("保存失敗!")# 根據(jù)csv文件繪圖 def drawData(list):fig, ax = plt.subplots() # 新建一個fig和axes對象mpl.rcParams["font.sans-serif"] = ["SimHei"] # 設(shè)置字體mpl.rcParams["axes.unicode_minus"] = Falsex = np.arange(3) # x軸下標數(shù)量count_taobao = [] # 構(gòu)造列表淘寶銷量count_jd = [] # 京東銷量for i in range(len(list)):if (i % 2 == 0): # 下標0、2、4為淘寶銷量count_taobao.append(int(list[i][2]))else: # 下標1、3、5為京東銷量count_jd.append(list[i][2])bar_width = 0.35 # 柱條寬度tick_label = ["榮耀V30手機", "小米10手機", "vivoS6手機"] # x軸坐標plt.bar(x,count_taobao,bar_width,align="center",color="c",label="淘寶平臺",alpha=0.5) # alpha表透明度plt.bar(x + bar_width,count_jd,bar_width,color="b",align="center",label="京東平臺",alpha=0.5)plt.xlabel("手機型號")plt.ylabel("平臺銷量")ax.set_title("三種型號手機在京東和淘寶銷量對比圖") # 設(shè)置標題plt.xticks(x + bar_width / 2, tick_label) # 實現(xiàn)并列效果plt.legend() # 顯示圖例plt.savefig('D:\\drawData.png') # 保存圖片plt.show() # 將圖片顯示出來if __name__ == "__main__":print("該程序?qū)⒆詣臃謩e爬取華為榮耀V30、小米10和vivoS6手機在淘寶和京東的銷量")print("程序即將開始執(zhí)行......")print("開始爬取華為榮耀V30在淘寶的銷量數(shù)據(jù)...")# 此鏈接為按照銷量排序的鏈接start_url_taobao = "https://s.taobao.com/search?q=" + "榮耀v30" + "&sort=sale-desc"html = getHTMLpages(start_url_taobao)getGoodsinfo(list, html, 0)print("開始爬取華為榮耀V30在京東的銷量數(shù)據(jù)...")start_url_jd = "https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100010260230&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1"html_jd = getHTMLpages_JD(start_url_jd)# print(html_jd)getGoodsinfo_JD(list, html_jd, 0)print("開始爬取小米10在淘寶的銷量數(shù)據(jù)...")start_url_taobao = "https://s.taobao.com/search?q=" + "小米10手機" + "&sort=sale-desc"html = getHTMLpages(start_url_taobao)getGoodsinfo(list, html, 1)print("開始爬取小米10在京東的銷量數(shù)據(jù)...")start_url_jd = "https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100011336064&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1"html_jd = getHTMLpages_JD(start_url_jd)getGoodsinfo_JD(list, html_jd, 1)print("開始爬取vivoS6在淘寶的銷量數(shù)據(jù)...")start_url_taobao = "https://s.taobao.com/search?q=" + "vivoS6" + "&sort=sale-desc"html = getHTMLpages(start_url_taobao)getGoodsinfo(list, html, 2)print("開始爬取vivoS6在京東的銷量數(shù)據(jù)...")start_url_jd = "https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100011924580&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1"html_jd = getHTMLpages_JD(start_url_jd)getGoodsinfo_JD(list, html_jd, 2)print("爬取完畢!結(jié)果如下:")printGoodsinfo(list)print("現(xiàn)在將數(shù)據(jù)存入CSV文件中...")saveData(list)print("現(xiàn)在將數(shù)據(jù)可視化展示出來:")drawData(list)print("圖片保存位置為D盤的drawData.png")?
總結(jié)
以上是生活随笔為你收集整理的爬取京东淘宝商品销量并可视化处理数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端之登录注册页面案例
- 下一篇: 三种方法删除有序表中s和t直接的元素(包