如何自动发每日数据邮件?| 小白学编程
优采云 发布时间: 2022-05-13 08:11如何自动发每日数据邮件?| 小白学编程
好像老板总是会有越来越多的需求,而时间总是不够用……
谁都不想晚上回家还要做这种重复工作,得想想办法……那么,就用一个程序爬取数据之后自动发邮件吧!
成果是这样的:什么都不用做,就可以每天12点自动定时发数据汇报邮件了!
你也想试试么?花3分钟学习一下吧!
工具
里面,下载量很容易抓取到。而这次要抓的信息里面,许多 数据项都是 JS 的,无法直接用 BeautifulSoup 直接抓取到,所以我们要使用更强大的库和工具来应对 JS。
首先介绍一下我们今天要用到的工具:
Python想必已经不用我介绍了,这里选用Python3是因为它对中文的支持更加强大;
PhantomJS可以理解成是一个模拟的浏览器,在你输入网址后跟真正的浏览器一样,执行页面上的JS语句生成我们看到的页面;
selenium用来读取PhantomJS解析出来的页面。
安装PhantomJS
PhantomJS的安装十分简单,去官网()下载回来最新版的PhantomJS,然后随便找个地方解压缩就好了。
解压缩后如图:
打开bin文件夹,我们会看到我们要用的phantomjs.exe文件,请记住这个文件的路径。
好了,PhantomJS安装完毕了。
安装selenium
selenium是Python的一个库,所以它可以通过pip安装,只要在命令行输入:
pip install selenium
就可以完成安装啦!如下图:
第一步:简单的动态网页抓取
首先,我们要抓取报表中的各项数据,包括:云课堂销量、优酷播放量、腾讯播放量、知乎点赞量。
直接上代码(复制的时候注意不要复制上行号哦):
1 from selenium import webdriver<br />2 import time<br />3 driver = webdriver.PhantomJS(executable_path="C:/phantomjs-2.1.1-windows/bin/phantomjs.exe")<br />4 driver.get("http://study.163.com/course/courseMain.htm?courseId=1002810012")<br />5 time.sleep(5)<br />6 data = driver.find_element_by_id('j-coursehead').text<br />7 a = data.find('\n')<br />8 b = data[a + 1:].find('\n')<br />9 num = data[a + 1:a + 1 + b]<br />10 driver.quit()<br />11 print('网易云课堂的销量为:',num)
下面我们来逐行讲解每行代码的意思:
第一行:
from selenium import webdriver
导入selenium库中的webdriver
第二行:
import time
导入Python的内建库——time。time主要实现与时间有关的功能。
第三行:
driver = webdriver.PhantomJS(executable_path="C:/phantomjs-2.1.1-windows/bin/phantomjs.exe")
这行的格式是:
变量名 = webdriver.PhantomJS(executable_path="刚才说的phantomjs.exe的地址")
即我们指定调用PhantomJS来解析网页。
第四行:
driver.get("http://study.163.com/course/courseMain.htm?courseId=1002810012")
这行的格式是:
第三行定义的变量名.get("目标网址")
显然,这行的功能是使用PhantomJS来解析我们指定的网址,这里网址使用网易云课堂上我们爬虫课的网址。
第五行:
time.sleep(5)
这行的格式是:
time.sleep(你希望推迟的秒数)
使用time函数推迟调用线程的运行,可以理解成使程序暂停若干秒。在这里我们使用它的目的是确保上一步网页加载完成。
第六行:
data = driver.find_element_by_id('j-coursehead').text
这一行的格式是:
第三行定义的变量名.查找方法(‘查找的内容’).text
这一行用于在PhantomJS解析出来的网页上查找我们需要的内容,这里我选用的是find_element_by_class_name()的方法,即通过class的名称来查找元素,而提供的方法还有很多,常见的有:
find_element_by_id()通过ID来查找
find_element_by_css_selector()通过CSS选择器查找
find_element_by_xpath()通过xpath查找
find_element_by_link_text()通过连接文字查找
find_element_by_tag_name()通过tag的名称查找
有了查找方法,那我们如何获取想查找的内容呢?
用IE浏览器打开我们的目标网址,这里使用。
在我们想抓取的内容上(这里用课程销量)点鼠标右键,选“检查元素”,如图:
然后就会出现DOM资源管理器,并且自动定位到我们想抓取的内容所在位置上。
如图:
可以看到,上图的两个箭头处,我们既可以通过第一个箭头位置的ID进行查找,也可以通过第二个箭头处的class名称查找。
第七行、第八行、第九行:
a = data.find('\n')
b = data[a + 1:].find('\n')
num = data[a + 1:a + 1 + b]
这三行用于整理我们抓取到的数据,使用的方法是字符串的分段,在之前的教程中我们已经讲过了。
第十行
driver.quit()
在程序结束后,退出,否则会在后台一直占用系统性能的。
第十一行
程序运行一下,结果为:
(使用的IDE是Pycharm)
显然,我们成功的完成了动态内容的抓取。
刚才的演示是云课堂的销量,其他的数据爬取,比如:优酷播放量、腾讯播放量、知乎点赞量等等也是类似的,就不重复说明了。
第二步:发送邮件
每天晚上12点,把数据自动发邮件汇报,这个也交给程序来自动运行,就不用熬夜刷数据了。
代码如下:
from email.header import Header<br />from email.mime.text import MIMEText<br />from email.utils import parseaddr, formataddr<br />import smtplib<br /><br />def _format_addr(s):
name, addr = parseaddr(s) <br /> return formataddr((Header(name, 'utf-8').encode(), addr))<br />
from_addr = '寄信的邮箱地址'<br />password = '邮箱密码'<br />to_addr = '收信的邮箱'<br />smtp_server = '发信邮箱的stmp服务器地址'<br />msg = MIMEText(要发送的内容, 'plain', 'utf-8')
msg['From'] = _format_addr('发件人 ' % from_addr)
msg['To'] = _format_addr('收件人 ' % to_addr)
msg['Subject'] = Header('邮件标题', 'utf-8').encode()
server = smtplib.SMTP_SSL(smtp_server, smtp端口, timeout=10)
server.set_debuglevel(0)
server.login(from_addr, password)
server.sendmail(from_addr, [to_addr], msg.as_string())
server.quit()
这里应用到了 python 的内建库:email 和 smtplib,通过 email 构建邮件,通过 smtplib 发送邮件。
这段代码只要套用就好,不做详细解释。
重点说一下三个地方:
1、邮箱密码:比如QQ和163邮箱,这里输入的并不是你的邮箱密码,而是“授权码”,在邮箱设置中可以查询到。
2、发信邮箱的smtp服务器:搜索一下很容易找到,一般类似
3、smtp端口:通常为25,但QQ邮箱为465,请根据实际情况修改,也很容易搜索到。
第三步:完整代码
注意:最后发邮件部分的代码,需要根据你自己的信息来填写替换。
from selenium import webdriver<br />import time<br />from email.header import Header<br />from email.mime.text import MIMEText<br />from email.utils import parseaddr, formataddr<br />import smtplib<br />def neteasy_crawler():
driver = webdriver.PhantomJS(executable_path="C:/phantomjs-2.1.1-windows/bin/phantomjs.exe")
driver.get("http://study.163.com/course/courseMain.htm?courseId=1002810012")
time.sleep(5)
data = driver.find_element_by_id('j-coursehead').text
a = data.find('\n')
b = data[a + 1:].find('\n')
num = data[a + 1:a + 1 + b]
driver.quit() <br /> return ('网易云课堂的销量为:'+str(num))<br />def tencent_crawler():
driver = webdriver.PhantomJS(executable_path="C:/phantomjs-2.1.1-windows/bin/phantomjs.exe")
driver.get("http://v.qq.com/vplus/8bfeadf782010957b865a967fcf9e3f7/videos")
time.sleep(5)
data = driver.find_elements_by_class_name('info_inner')
data_num=[] <br /> for i in data :
j = int(i.text)
data_num.append(j)
num = sum(data_num)
driver.quit() <br /> return ('腾讯视频上的观看量为:'+str(num))<br />def youku_crawler():
driver = webdriver.PhantomJS(executable_path="C:/phantomjs-2.1.1-windows/bin/phantomjs.exe")
driver.get("http://i.youku.com/i/UMTQ0MjEyMTgw")
time.sleep(5)
data = driver.find_element_by_class_name('vnum').get_attribute('title')
num = data
driver.quit() <br /> return ('优酷视频上的观看量为:'+str(num))<br />def zhihu_crawer():
driver = webdriver.PhantomJS(executable_path="C:/phantomjs-2.1.1-windows/bin/phantomjs.exe")
driver.get("https://www.zhihu.com/people/lin-qian-qian")
time.sleep(5)
data = driver.find_element_by_class_name('zm-profile-header-user-agree').text
num = data[:-2]
driver.quit() <br /> return ('知乎上的点赞为:'+str(num))
report_data = neteasy_crawler()+'\n'+tencent_crawler()+'\n'+youku_crawler()+'\n'+zhihu_crawer()<br /> <br />def _format_addr(s):
name, addr = parseaddr(s) <br /> return formataddr((Header(name, 'utf-8').encode(), addr))
from_addr = '******@qq.com'<br />password = '******'<br />to_addr = '******@qq.com'<br />smtp_server = 'smtp.qq.com'<br />msg = MIMEText(report_data, 'plain', 'utf-8')
msg['From'] = _format_addr('员工 ' % from_addr)
msg['To'] = _format_addr('老板 ' % to_addr)
msg['Subject'] = Header('每日汇报', 'utf-8').encode()
server = smtplib.SMTP_SSL(smtp_server, 465, timeout=10)
server.set_debuglevel(0)
server.login(from_addr, password)
server.sendmail(from_addr, [to_addr], msg.as_string())
server.quit()
第四步:自动运行
保存python文件为report.py
windows系统下:
进入命令提示符cmd
Win7及以下:使用at命令
net start schedule 这行命令用来启用Windows的计划任务<br />
at 0:00 /every:Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday python report.py
(Win8、Win10使用 SCHTASKS 命令)
linux系统下:
修改时区:
sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
设置NTP服务器
sudo ntpdate cn.pool.ntp.org
显示时间,检查是否正确
date
每天 0:00,用Python执行/root/report.py文件。
编辑定时任务:
#crontab -e
0 0 * * * python /opt/aa.py
保存,退出
执行
/etc/init.d/cron restart
重启服务才能使用
到了这里,所有代码就都完成啦!开始享受程序为你工作的感觉吧~