利用Python对天猫店铺销售进行分析.下

<p>相隔两个月,爬虫任务完成了。上次说道(利用Python对天猫店铺销售进行分析.上),后续要完成四个功能,包括:</p>

  • 每天晚上对一天采集的数据进行分析,分析出今天的最佳销量;
  • 通过销量和单价计算每日的销售额;
  • 将上面的内容统一生成pdf报表;
  • 将报表发到邮箱中;

<p>在上一个任务完成之后,任务的最后是通过crontab设置每天8点,13点,18点,23点,定时采集任务,而该篇内容的目的就是在每天23点最后一次任务完成之后,对该天采集的数据进行处理,时间设定在23点30分,也是采用crontab来定时开启。</p>


计算最佳销量以及计算销售额

<p>这个只要通过SQLite将每天收集的数据重新提取出来,由于我们的当天的销售数据是收集在SCOUNT表格中,而数据的列名称是依据时间来命名,为了获得当天四个时间点采集的销售数据,需要先获得列名称。</p>
<p>在SQLite里面,可以通过Pragma获得所有的列名称信息,Pragma有两个功能,包括更改内部操作以及获得表格固有数据,通过其中的table_info,既可以获得列名称信息,所有列名称信息获得后,通过list comprehensions(这个实在不知道怎么翻译),可以获得今天的新生成的4个销售数据列:</p>

def get_today_columns(c, today):
    c.execute("PRAGMA table_info(SCOUNT);")
    column_list = c.fetchall()
    return ["[" + column[1] + "]" for column in column_list if today in column[1]]

<p>然后就是获得进行的销售数据,由于每个SKU一天将采集四次数据,并且收集的SKU有下架的可能,SKU列表中的不是每个SKU都有可能被采集,所以对采集出来需要的数据需要dropna,并且需要将SKU信息表格和销售数据表格通过merge函数合并,形成我们需要的data。每个SKU在每个时刻采集的数据会出现波动,销量数据并不是一个连续增长的过程,因此为了求得当天的销量,可取一天中最大数和最小数差值。</p>

def today_sells(today_columns, conn):
    query_data = "SELECT scountskuid,%s, %s, %s, %s FROM SCOUNT;" % (today_columns[0],today_columns[1],today_columns[2],today_columns[3])
    data = pd.read_sql(query_data, conn, index_col="scountskuid")
    data.dropna(axis= 0 , how='all', inplace=True)
    query_name = "SELECT skuid, name FROM UB"
    name = pd.read_sql(query_name, conn, index_col="skuid")
    data = pd.merge(name, data, how = 'inner', left_index=True, right_index=True)
    data['sells'] = data.max(axis=1, numeric_only=True)-data.min(axis=1, numeric_only=True)
    return data[['name', 'sells']]

<p>生成销售额的方法类似,就不在这里列出。</p>

生成PDF报表

<p>生成PDF,这是当时的一个设想,后来参考这篇教程做出来了(Practical Business Python 是个好网站,推荐),原理是通过DataFrame转化为HTML,再将HTML转化为PDF。但是写邮件模块的时候,发现邮件可以内嵌HTML,因此就没有必要专门生成PDF,再通过邮件以附件的形式发送了。但在这里,还是先梳理下整个流程:</p>

<p>采用Jinja2生成PDF,首先需要生成一个模板,模板里面需设定好HTML的样式,这是参考教程写出的一个HTML的样式:</p>

<!DOCTYPE html>
<html>
<head lang="zh">
    <meta charset="UTF-8">
    <title>{{ title }}</title>
</head>
<body>
    <h2>{{ table_title }}</h2>
     {{ data_table }}
</body>
</html>

<p>完成后,再将DataFrame通过to_html函数转化为HTML并填入到样式中。</p>

from jinja2 import Environment, FileSystemLoader
    env = Environment(loader=FileSystemLoader('.'))
    template = env.get_template('myreport.html')
    template_vars = {'title': today+'天猫销售',
                    'table_title': today,
                    'data_table': data.to_html()}
    html_out = template.render(template_vars)

<p>最后生成PDF,只加入一个模块喝一句话就可以了。weasyprint这个模块是专门用于将HTML或者CSS转化为PDF:</p>

from weasyprint import HTML
    HTML(string = html_out).write_pdf("my_report.pdf")

发送邮件

<p>python里面有专门的发送邮件模块,email模块。邮件的模块包括两部分,一部分是邮件正文模块,一部分邮件发送模块:</p>

<p>邮件正文模块,通过MIMEText完成。在email模块里面有专门的(MIME, Multipurpose Internet Mail Extensions,多用途互联网邮件扩展)模块,用来生成对应的邮件正文类型。在这里先采用文本模块MIMEText做个示范:</p>

from email.mime.text import MIMEText
# me == 发送地址
# you == 接受地址
msg = MIMEText(html_out, 'html')
msg['Subject'] = " %s 销售日报" % today
msg['From'] = me
msg['To'] = you

<p>然后就是发送邮件了,需要经过stmplib模块,下面详细讲讲。发送邮件首先需要设置smtp(Simple Mail Transfer Protocol,简单邮件传输协议)的地址和端口,然后部分邮箱需要采用TTS加密协议的时候,则需要使用starttts()函数。然后对应的是登陆的用户名的密码,再将上面编写的msg发出去,最后quit即可。</p>

#smtp_address:发送收件的smtp地址;
#smtp_port:发送收件的smtp地址对应的端口,如果采用TTS加密的话,一定要注意端口的设置;
#login_username:邮箱登陆的用户名;
#login_password:邮箱登陆的密码;

import smtplib
try:
    s = smtplib.SMTP(smtp_address, smtp_port)
    s.starttls()
    s.login(login_username, login_password)
    s.send_message(msg)
    s.quit()
    print(today + "发送成功!")
except smtplib.SMTPException:
    print("Error: 无法发送邮件")

结语

<p>总结下,之前设定的任务大体完成了。但是还是有很多可以深化的内容,例如前面采用DataFrame的时候,没有对数据进行可视化,HTML的模板还可以再美化下,另外假如引入了数据可视化,要怎么将可视化的图片嵌入到邮件中。邮件登陆那部分,部分邮箱没有办法采用这个方法发出(需要再考虑smtp设置)。</p>

<p>上面这些问题,后续会继续以小项目的形式进行研究。后面还可以进行平台之间的销售情况对比等等,总而言之,该项目还是有很大的扩张空间的。嘛,这一次就先这样结束吧。</p>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • 自从上年年底了解到数据分析和挖掘这个概念之后,今年1月底毕业前夕,让自己完全沉下心来学习Python的数据,截止到...
    Garfield_Liang阅读 2,999评论 5 6
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,637评论 18 139
  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    aimaile阅读 26,454评论 6 428
  • GitHub 上有一个 Awesome - XXX 系列的资源整理,资源非常丰富,涉及面非常广。awesome-p...
    若与阅读 18,630评论 4 418
  • 放假三天 ,72小时没有出门,在沙发躺24小时,床上躺36小时, 看了两本穿越三国的书, 回顾了三期2014中国成...
    王俊杰猛阅读 280评论 4 1