使用 Python 进行 Gmail 数据分析
使用 Python 进行 Gmail 数据分析
最近,当我使用我的 Gmail 时,弹出一个通知。
我的存储空间快用完了。所以我有两个选择。要么购买存储空间,要么释放现有空间。我没有兴趣购买额外的空间,所以显而易见的解决方案是释放空间。现在要释放空间,我必须要么删除我的电子邮件,要么从谷歌云或谷歌照片中删除我的文件。
我不想从谷歌照片或云端删除文件。因为我觉得他们很重要。所以下一个选择是删除我的电子邮件。有很多!
一个疯狂的念头冒出。我的数据分析师开始问一些问题。为什么我不能将所有电子邮件导出到电子表格或作为 pandas 数据框并进行一些数据分析?所以我花了我的周日提取我的电子邮件并使用 python 和 Excel 进行分析。让我们看看如何做到这一点。这是一个非常简单直接的过程。
要将您的电子邮件提取到脚本中,您需要做两件事。
- 您需要在 Gmail 中启用 IMAP 访问
- 您需要生成您的应用程序密码 (建议在 Gmail 中使用两步验证)
要启用 IMAP 访问,请转到常规设置 - > 转发和 POP /IMAP->IMAP 访问 -> 启用
要生成应用程序密码,请转到管理您的 google 帐户 - > 安全性-> 最近的安全活动-> 应用程序密码
如果您之前没有生成它,您将看不到任何内容。单击它后,您需要选择应用程序和设备。选择邮件作为您的应用程序和其他作为您的设备名称。提供任何自定义名称并单击生成。将生成您的应用程序密码。复制密码,我们将在代码中使用此密码。
生成密码后,我们需要使用您的用户名和密码创建一个 .yaml 文件,如下所示:
好吧,让乐趣开始吧!
让我们首先导入所有需要的包
导入 imaplib
导入电子邮件
导入yaml
现在加载我们创建的 .yaml 文件并将用户名和密码存储在一个变量中。
使用 open('credentials.yaml') 作为 f:
content = f.read()my_credentials = yaml.load(content, Loader = yaml.FullLoader)user, password = my_credentials['user'], my_credentials['password']
现在让我们连接到我们的电子邮件并使用用户名和密码登录
imap_url = 'imap.gmail.com'my_mail = imaplib.IMAP4_SSL(imap_url)my_mail.login(用户、密码)
在此之后,您应该能够看到带有您的电子邮件 ID 的成功消息,如下所示 '[email protected] 已通过身份验证(成功)'
my_mail 是一个创建的 imaplib 对象,它基本上可以让我们连接到 IMAP 服务器。
现在我们可以使用创建的这个 IMAP 对象访问所有电子邮件。要选择收件箱中的电子邮件总数,我们可以使用
my_mail.select('收件箱')
这将选择收件箱中的所有电子邮件。
I have around 140650 emails in my inbox. That’s a lot. I will import around 100000 of them and see.
您可以导入所有电子邮件,甚至可以使用密钥搜索一些电子邮件
数据 = my_mail.search(无,“全部”)
现在创建的数据对象将具有所有电子邮件 ID。如果您只是打印并查看数据对象,您会发现它只是一个包含两个元素的元组,第一个只是一条消息,第二个是包含所有电子邮件 ID 的列表。例如,如果您的收件箱中有 1000 封电子邮件,则此列表包含从 1 到 1000 的数字。因此,为每封电子邮件分配一个数字。
现在让我们创建一个包含所有这些电子邮件 ID 的列表。
mail_ids = data[1]id_list = mail_ids[0].split()len(id_list)#这应该等于你上面看到的邮件总数first_email_id = int(id_list[0])latest_email_id = int(id_list[- 1])
实际上,您可以从最后一个电子邮件 ID 循环到第一个电子邮件 ID,并将所有消息附加到数据框中,或者您可以从特定数字开始。我将从 100000 循环它,而不使用我电子邮件中的所有消息。
让我们首先创建一个空的 pandas 数据框。
将熊猫导入为 pd
email_df = pd.DataFrame(columns=['Date','From', 'Subject','Status'], index=range(100000,first_email_id,-1))
我创建了一个空的 pandas 数据框,它有 100000 行和四列。我只想从电子邮件中提取这些列,例如日期、发件人、主题和状态。我会在下面让你知道它有哪些栏目。
现在我们需要从电子邮件中获取响应部分并创建一个消息对象。现在从这个消息对象中,我们需要提取我们需要的数据。获得数据后,我们需要将其附加到我们在上面创建的数据框中。
对于我在范围内(100000,first_email_id,-1):
数据 = my_mail.fetch(str(i), '(RFC822)' )
对于数据中的 response_part:
arr = response_part[0]
如果是实例(arr,元组):
msg = email.message_from_string(str(arr[1],'ISO-8859–1'))
print(i) #这会让你知道正在追加哪一行
new_row = pd.Series({"Date":msg['Date'] , "From":msg['from'] , "Subject":msg['subject'], "Status":msg['X-Antivirus -地位'] })
email_df = email_df.append(new_row, ignore_index=True)
这里的关键元素是 ** 味精** 包含所有数据的变量。
您可以使用 msg 变量查看所有其他变量并根据需要导出它们。
在此之后,数据框看起来像这样
我已将整个数据框导出到 Excel 表中,拆分两列 ** 从** 和 ** 日期,** 并准备了一些图来理解数据。他们在这里如下
我们还可以在主题栏上构建一个词云。这向我们展示了我通常会收到什么样的电子邮件。
从 wordcloud 导入 WordCloud,STOPWORDStext = email_df['Subject'].valuesstopwords = set(STOPWORDS)
stopwords.update([" "]) #有的话可以添加停用词 wordcloud = WordCloud(stopwords=stopwords, background_color="white", width=800, height=400).generate(str(text))
plt.figure(figsize = (20, 20), facecolor = None)
plt.imshow(wordcloud)
plt.axis(“关闭”)
plt.show()
通过使用自然语言处理技术,我们甚至可以深入挖掘这些电子邮件。
结论
请关注我,你会帮助我很多。
谢谢阅读。如果您觉得这篇文章有用,请不要忘记鼓掌并与您的朋友和同事分享。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明