引言
中秋佳节我们要吃传统美食——月饼。小编忽然间有个想法,想要知道在淘宝上哪种月饼更受欢迎。说干就干,立马操练起来~
需求分析
通过爬取淘宝散装月饼销售记录,对用户购买过的月饼进行统计,分析最受欢迎的月饼种类。由于搜索关键字“月饼”会出现很多套装礼盒,影响我们的判断数据,所以我们将关键字定位“散装月饼”。
最终需求定为:爬取淘宝“散装月饼”搜索结果中,所有产品的评价,通过评价中展示的月饼馅类型,进行分析。
知识点
爬取数据:requests库
多线程:ThreadPoolExecutor
图形分析:pyecharts
获取产品ID
首先登陆淘宝网,打开开发者工具,搜索关键字“散装月饼”,观察URL。点击下一页,再次观察URL。下面列出前三页的URL。
第一页:https://s.taobao.com/search?ie=utf8&initiative_id=staobaoz_20180924&stats_click=search_radio_all%3A1&js=1&imgfile=&q=%E6%95%A3%E8%A3%85%E6%9C%88%E9%A5%BC&suggest=0_1&_input_charset=utf-8&wq=%E6%95%A3%E8%A3%85&suggest_query=%E6%95%A3%E8%A3%85&source=suggest
第二页:https://s.taobao.com/search?ie=utf8&initiative_id=staobaoz_20180924&stats_click=search_radio_all%3A1&js=1&imgfile=&q=%E6%95%A3%E8%A3%85%E6%9C%88%E9%A5%BC&suggest=0_1&_input_charset=utf-8&wq=%E6%95%A3%E8%A3%85&suggest_query=%E6%95%A3%E8%A3%85&source=suggest&bcoffset=3&ntoffset=3&p4ppushleft=1%2C48&s=44
第三页:https://s.taobao.com/search?ie=utf8&initiative_id=staobaoz_20180924&stats_click=search_radio_all%3A1&js=1&imgfile=&q=%E6%95%A3%E8%A3%85%E6%9C%88%E9%A5%BC&suggest=0_1&_input_charset=utf-8&wq=%E6%95%A3%E8%A3%85&suggest_query=%E6%95%A3%E8%A3%85&source=suggest&bcoffset=0&ntoffset=6&p4ppushleft=1%2C48&s=88
这是前三个页面的URL,可以发现,除了"q="和"s="后面的数据不一样,其他的都是一样的,因此,可以把URL简化为:
https://s.taobao.com/search?q=keyword&s=pagenum
其中,q代表搜索的关键词,s代表商品列表的页数,0代表第一页,44代表第二页,88代表第三页……以此URL抓取商品的ID等信息。
此部分代码如下:
def get_product_id_list(num,all_product_list):
base_url = "https://s.taobao.com/search"
params = {
"q":"月饼散装",
"s":num*44,
}
r = requests.get(base_url,params=params,headers=headers)
nids=re.findall(pattern='"nid":"(.*?)"',string=r.text)
for nid in nids:
if nid not in all_product_list:
all_product_list.append(nid)
print("第%s页product-id提取完成"%num)
return all_product_list
获取月饼种类
上述代码可以获取到商品ID,利用商品ID信息,跳转到具体的商品详情页面,对其评论进行抓取。点击商品详情页的评论信息,可以看到调用了如下的接口信息:
上面的接口信息,我们去除不必要的参数,可以得到链接: https://rate.taobao.com/feedRateList.htm?auctionNumId=575182860576¤tPageNum=1 。推测auctionNumId为产品ID,currentPageNum为当前评论页数。根据上述分析,我们可以得到用户评论中的产品信息。部分代码如下:
while True:
params = {
"auctionNumId":product_id,
"currentPageNum":currentPageNum
}
r = requests.get(base_url,params=params,headers=headers)
try:
data = eval(r.text.strip("(").strip(")").replace("true","True").replace("false","False").replace("null","None"))
total = data["total"]
except:
total = 0
if total != 0:
comments = data["comments"]
for comment in comments:
auction = comment["auction"]
sku = auction["sku"]
if sku in product.keys():
product[sku] += 1
else:
product[sku] = 1
else:
break
print("第%s条商品的第%s页评论爬取完成"%(num,currentPageNum))
currentPageNum += 1
print("第%s条商品的评论爬取完成" % num)
最后将爬取结果分类整理至本地文件。(代码略)
数据分析
通过上述的爬虫,我们最终爬取了22W条月饼销售记录。最后形成柱形图、饼图及词云图。
根据上述内容可以看到,除去礼盒类型,蛋黄、五仁、莲蓉、火腿为销售数量比较多的。(此部分统计数据是将杂项去除之后的数据)
除了按照馅的种类进行划分之外,我们还可以根据产地进行划分。结果如下图所示。
按照口味划分:
按照月饼皮类型分类:
以上数据均为部分数据,分析结果仅供参考!
源码
链接:https://pan.baidu.com/s/1ZHaOvyt1wRrzZOZnHthTjw 密码:27em