python下载文件加上日期_如何用Python下载并整理上千张表

最近领导给了笔者一个需求-需要看店铺主卖产品的每日销售额情况和访客来源,效果图大概是这样

WOC,这么简单的需求也叫需求?直接用SUMIFS函数不就好了。

但转念一想,不对呀,销售数据笔者已经有了,但是每个产品的访客数据还没有,要去天猫后台下载,进去一看我傻眼了,数据一次只能下载一天的数据。

粗略一算,若时间是从今年1月1号到昨天3月17号,一共要下载77次,总共十一个产品,那就是847次,一个表从下载到打开到复制粘贴到关闭大概至少要20秒时间。WTF,这么一算至少要4.7个小时还不带休息的。这怎么行,笔者脑袋飞速运转,于是想到了Chrome的一个插件,Chrono下载器。

为什么呢,这个下载器有一个牛逼的地方,就是可以通过添加下载地址来下载文件,并且可以一次性下载N个文件,如图

所以只要下载的文件地址有规律,那么就可以一次性把文件下载。所以现在的问题就是找出下载地址的规律。果不其然,发现同一个产品不同时间的下载链接只是日期不一样

看到这里笔者心里美滋滋啊,那只要把所以链接列出来然后复制黏贴就OK了,几个小时的事情几分钟就搞定了。但是,后面又头疼了,数据是下载下来了,可你要整合在一张表里啊,要是每张表都打开然后复制粘贴...不敢想不敢想,于是乎,想到了Python。

因为下载下来的文件名也有一个规律,除了日期不同,其他都一样

而Python中可以用pandas读取文件,那么我只要用循环语句每个文件都读取一遍并且合并在一起就OK了,代码如下。首先导入需要的模块

import pandas as pd

import numpy as np

import os然后利用日期的规律用for循环语句遍历文件

def clear(month,star,end):

"""month:月份star:起始日end:结束日"""

os.chdir(r"C:\Users\Tao\Downloads")

#先创建一个同样的DataFrame,我这里选择的是直接赋值起始日的数据,就不用重新创建了

data = pd.read_excel(r"【生意参谋平台】无线商品二级流量来源详情-2020-0{}-{}_2020-0{}-{}.xls".format(month,star,month,star),skiprows=5)

data["日期"] = "2020-{}-{}".format(month,star)

#因为上面有了第一天的数据,下面循环的时候star+1表示从第二天开始

for i in range(star+1,end+1):

if i<10:

data2 = pd.read_excel(r"【生意参谋平台】无线商品二级流量来源详情-2020-0{}-0{}_2020-0{}-0{}.xls".format(month,i,month,i),skiprows=5))

else:

data2 = pd.read_excel(r"【生意参谋平台】无线商品二级流量来源详情-2020-0{}-{}_2020-0{}-{}.xls".format(month,i,month,i),skiprows=5)

data2["日期"] = "2020-{}-{}".format(month,i)

data = pd.concat([data,data2])

return data

上面这个代码有几点需要注意,第一点首先需要创建一个同样的数据表,第二点有个细节,从上面的名称图可以看出来当日期小于10的时候也是采用两位数,前面会有一个0比如7号8号会用07、08来表示的,而python中个位数前面加不了0,所以用if语句来判断处理,第三点是这个代码有个缺点就是只能遍历同月份的数据,不能跨月处理,所以还需要代码来执行跨月合并,最后一点就是每次只能处理一个产品,因为每个产品同个日期的表格名字是一样的,这样表格名字后缀就会出现(1)(2)这样的名称。

def clear2():

data = clear(1,1,31)

data2 = clear(2,1,29)

data3 = clear(3,1,17)

data4 = pd.concat([data,data2,data3])

return data4

if __name__ == '__main__':

data = clear2

data.to_excel(r"F:\数据库\数据\1.流量数据\2.2-单品流量来源表\python.xlsx")

这样就完成了1月1日到3月17日的的数据下载和整理,但这只是一个产品,然后十一个产品重复这个代码就可以了,最后半小时不到就处理完成,节省了4个多小时,效率还是刚刚的。

但是又有个问题出现了,以后我还需要更新这些数据,每一次更新都花个半小时还是很耗时间,那么怎么才能用代码一次性下载所有产品的数据呢。首先要解决两个问题,一个是怎么样用python来下载数据,第二个是怎么解决产品之间的重名问题。

第一个问题我想到了urllib库,用urllib.request.urlretrieve函数可以下载数据,但让我抓狂的是每次下载下来的数据都是空白的,折腾了半个小时才发现是账号登录的问题,因为数据并不是公共下载资源,而是在生意参谋下载的,要下载必须登录账号,那么这个函数显示是不行的。此刻我的内心是崩溃的...需要登录账号才能下载的话,那不是可以用神器selenium吗,想到这里嘴角露出一丝微笑。然后第二个问题,可以采用读取数据后用os.remove函数删除文件的方法的来操作。方法如下:同样的,先导入相关库

from selenium import webdriver

import time

import os

from selenium.webdriver.chrome.options import Options

import pandas as pd

import numpy as np设置selenium,注意天猫对爬虫比较敏感,需要在设置里写入缓存数据才能登录账号,相关的数据目录需要自己手动改成自己的目录,代码如下。

option = webdriver.ChromeOptions()

option.add_argument('lang=zh_CN.UTF-8') # 字符集

option.add_argument("--start-maximized") # 最大化启动

#option.add_argument('--headless') # 无界面模式

option.add_argument('--no-sandbox')# 以最高权限运行

option.add_argument('--disable-gpu')

# 使用用户配置启动,指定目录为用户的chrome数据目录

option.add_argument("user-data-dir=F:/User Data")

option.add_argument("disk-cache-dir=C:/Users/Tao/AppData/Local/Google/Chrome/User Data/Default")

# 模拟浏览器

option.add_argument('user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120"')

driver = webdriver.Chrome(executable_path="C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe",chrome_options=option)设置好相关属性,然后下载和整理数据。

#数据收集升级版

#因为每个产品对应不同的ID以及产品名字

ID = [596069333731,557148040184,16199354246,16265803007,525645607057,43791788131,594262381067,15250962059,44356507654,18049110820,16400101607]

name = ["养颜美白粉","玻尿酸面膜","纯珍珠粉60g","美白层粉","美白补水面膜21片","祛斑霜","素颜珍珠膏","盈润保湿霜",

"盈润套装","裸妆透白套装","靓采套装"]

def clear(month,star_time,end_time):

'''

month:月份

star_time:开始日

end_time:结束日

'''

os.chdir(r"C:\Users\Tao\Downloads")

#因为链接和表名比较长,这里进行赋值处理

a = 'https://sycm.taobao.com/flow/excel.do?spm=a21ag.12100465.0.0.4ea450a5NVsZrs&_path_=v3/excel/item/source/cc&belong=all&dateType=day&dateRange='

c = "【生意参谋平台】无线商品二级流量来源详情-"

#新建一个同样的Dateframe

data = pd.DataFrame(columns=['来源名称', '访客数', '浏览量', '支付金额', '浏览量占比', '店内跳转人数', '跳出本店人数', '收藏人数',

'加购人数', '下单买家数', '下单转化率', '支付件数', '支付买家数', '支付转化率', '直接支付买家数',

'收藏商品-支付买家数', '粉丝支付买家数', '加购商品-支付买家数', '日期', '产品'])

for i in ID:

for j in range(star_time,end_time+1):

if j <10:

driver.get(a+'2020-0{}-0{}|2020-0{}-0{}&device=2&itemId={}&page=1&order=desc&orderBy=uv'.format(month,j,month,j,i))

else:

driver.get(a+'2020-0{}-{}|2020-0{}-{}&device=2&itemId={}&page=1&order=desc&orderBy=uv'.format(month,j,month,j,i))

time.sleep(10)

for k in range(star_time,end_time+1):

if k<10:

data2 = pd.read_excel(c+"2020-0{}-0{}_2020-0{}-0{}.xls".format(month,k,month,k),skiprows=5)

os.remove(c+"020-0{}-0{}_2020-0{}-0{}.xls".format(month,k,month,k))

else:

data2 = pd.read_excel(c+"2020-0{}-{}_2020-0{}-{}.xls".format(month,k,month,k),skiprows=5)

os.remove(c+"2020-0{}-{}_2020-0{}-{}.xls".format(month,k,month,k))

data2["日期"] = "2020-{}-{}".format(month,k)

data2["产品"] = name[ID.index(i)]

data = pd.concat([data,data2])

return data

if __name__ == '__main__':

data = clear(3,10,17)

data.to_excel(r"F:\数据库\数据\1.流量数据\2.2-单品流量来源表\单品来源过渡表.xlsx")

这样就可以用一次处理好了,几分钟搞定,Python是真的强大啊,学好一阵子,受益一辈子。

总结

因为数据涉及账号登陆以及商业问题,就不提供了,这里只是提供大家一个思路,当大家遇到类似的问题的时候,可以采用这样的方法来处理,让你的效率大大提高。最后希望能帮到大家,有什么问题大家再一起讨论讨论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值