使用python批量下载天猫数据并进行合并(非爬虫)
做电商运营少不了数据分析支持,无论是选品、选关键词、研究竞品还是开直通车、店铺引流都需要有数据支持。不过生意参谋虽然强大,但现在都只能显示“指数”,并且能查看的时间段有限,由于指数到实际值的换算规则不透明(不同品类应该是不一样的),只能估个大概。好在有很多第三方的数据网站提供天猫、淘宝的数据服务,可以做为生意参谋的补充。
前一段时间为了研究品类趋势,买了一个淘系数据服务的会员,可以查到你所关注的店铺每天的历史销售数据,并可以下载为CSV文件,这对于研究对标品牌还是非常有帮助的。然而问题是,官方标准版只能按天查看和下载,如果要查看一年的数据,就是重复操作365次,实在是不能忍。于是想到用程序猿一点的方式来搞定它,通常从网站获取数据需要用到爬虫技术,但这个网站直接提供文件下载,那何不直接用程序批量下载呢?
分析了一下下载文件的链接:https://www.xxxxxxxxxxxx.com/member/trades/detail/336649802?d=1575129600&act=out 果然是有规律的,那就好办了,盘它!!! 链接中间的第一串数字是网站要分析追踪的店铺的编号,d=…后面的一串数字其实是个时间戳,也就是日期。所以,要下载某个店铺全年的数据,只需要改变时间戳,并用浏览器发出请求,就可以实现浏览器下载了!
按照上面的思路,脚本写起来就比较简单了,完整脚本如下:
# -*- coding: utf-8 -*-
"""
Created on Thu Dec 3 16:05:21 2020
@author: aladdin
"""
import time,datetime
import webbrowser # 实现这个功能的核心模块就是它了
def days(str1,str2): # 计算两个日期相关的天数,用于控制循环次数
date1=datetime.datetime.strptime(str1[0:10],"%Y-%m-%d")
date2=datetime.datetime.strptime(str2[0:10],"%Y-%m-%d")
num=(date1-date2).days
return num
def months(str1,str2): # 返回某个月一共有多少天
year1=datetime.datetime.strptime(str1[0:10],"%Y-%m-%d").year
year2=datetime.datetime.strptime(str2[0:10],"%Y-%m-%d").year
month1=datetime.datetime.strptime(str1[0:10],"%Y-%m-%d").month
month2=datetime.datetime.strptime(str2[0:10],"%Y-%m-%d").month
num=(year1-year2)*12+(month1-month2)
return num
startdate = '2020-01-01 00:00:00'
enddate = '2020-12-12 00:00:00'
dd = '66164328' # 系统中的店铺ID
urls = []
timeArray = time.strptime(startdate,"%Y-%m-%d %H:%M:%S")
timeStamp = int(time.mktime(timeArray))
print(startdate)
urls.append("https://www.xxxxxxxxx.com/member/trades/detail/%s?d=%s&act=out" % (dd , timeStamp))
daynum = days(enddate,startdate)
for i in range(0,daynum):
# print(i)
timeStamp = timeStamp + (1*24*60*60)
datestr = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(timeStamp))
urls.append("https://www.xxxxxxxxxx.com/member/trades/detail/%s?d=%s&act=out" % (dd , timeStamp))
# print(timeStamp)
# print(datestr)
# print(urls[i])
for url in urls:
print("%d:%s" % (i,url))
chromePath = r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" # Chrome浏览器的安装目录
webbrowser.register('chrome', None, webbrowser.BackgroundBrowser(chromePath))
webbrowser.get('chrome').open(url)
time.sleep(2) #为了防止一下把浏览器跑死,下载文件请求间隔2秒钟
脚本逻辑很简单,但是可以快速解决问题,这就够了!
接下来还有一步,需要把下载下来的几百个CSV文件合并成一个,这又是一个费劲的活儿,还是用脚本来搞定它吧:
# -*- coding: utf-8 -*-
"""
Created on Thu Dec 3 09:53:44 2020
@author: aladdin
"""
import re
import glob
import pandas as pd
import winsound
def matchdate(datestr):
match = re.search(r'\d{4}-\d{2}-\d{2}', datestr)
if match:
match = match.group()
return match
else:
print("没有获取到有效日期")
def hebing(csv_list, outputfile):
for i in range(0, len(csv_list)):
filepath = csv_list[i]
df = pd.read_csv(filepath, encoding="gbk", low_memory=False)
df = df.to_csv(outputfile, encoding="gbk", index=False, header=1, mode='a+')
print('完成合并')
def quchong(file):
df = pd.read_csv(file, header=None,encoding="gbk", low_memory=False)
datalist = df.drop_duplicates()
datalist.to_csv('C:/Users/aladdin/Desktop/result_qucong.csv', index=False,encoding="gbk", header=False)
print('完成去重')
if __name__ == '__main__':
inputfile = r"C:/Users/aladdin/Desktop/data2020/*.csv" #要合并的文件路径
outputfile = r"C:/Users/aladdin/Desktop/combine.csv" #合并后保存的文件路径
csv_list = glob.glob(inputfile)
for csv in csv_list:
print(matchdate(csv))
df = pd.read_csv(csv,encoding='gbk')
df['日期'] = matchdate(csv) # 因为下载下来的CSV文件是以日期命名的,但是数据中并没有日期列,所以这里要插入日期列,以便后续分析
df.to_csv(csv,encoding="gbk",index=None,header=1)
hebing(csv_list, outputfile)
quchong(outputfile) # 去除合并后重复的标题行
print("Work done! 合并成功!!!")
duration = 1000 # millisecond
freq = 440 # Hz
winsound.Beep(freq, duration) # 完成后让电脑哔哔一声
以上两个步骤完成之后,就得到了一个店铺全年的销售数据明细,接下来可以用excel透视表或者tableau或者直接用python进行数据分析了。
以上两个步骤完成之后,就得到了一个店铺全年的销售数据明细,接下来可以用excel透视表或者tableau或者直接用python进行数据分析了。
很多时候写脚本解决问题,方式有很多,不一定要追求代码的完美,能快速解决问题就好了!