如何自动发每日数据邮件?| 小白学编程

优采云 发布时间: 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(&#39;j-coursehead&#39;).text<br />7 a = data.find(&#39;\n&#39;)<br />8 b = data[a + 1:].find(&#39;\n&#39;)<br />9 num = data[a + 1:a + 1 + b]<br />10 driver.quit()<br />11 print(&#39;网易云课堂的销量为:&#39;,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(&#39;j-coursehead&#39;).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(&#39;\n&#39;)

b = data[a + 1:].find(&#39;\n&#39;)

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, &#39;utf-8&#39;).encode(), addr))<br />    

from_addr = &#39;寄信的邮箱地址&#39;<br />password = &#39;邮箱密码&#39;<br />to_addr = &#39;收信的邮箱&#39;<br />smtp_server = &#39;发信邮箱的stmp服务器地址&#39;<br />msg = MIMEText(要发送的内容, &#39;plain&#39;, &#39;utf-8&#39;)

msg[&#39;From&#39;] = _format_addr(&#39;发件人 &#39; % from_addr)

msg[&#39;To&#39;] = _format_addr(&#39;收件人 &#39; % to_addr)

msg[&#39;Subject&#39;] = Header(&#39;邮件标题&#39;, &#39;utf-8&#39;).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(&#39;j-coursehead&#39;).text

   a = data.find(&#39;\n&#39;)

   b = data[a + 1:].find(&#39;\n&#39;)

   num = data[a + 1:a + 1 + b]

   driver.quit()    <br />    return (&#39;网易云课堂的销量为:&#39;+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(&#39;info_inner&#39;)

   data_num=[]    <br />    for i in data :

       j = int(i.text)

       data_num.append(j)

   num = sum(data_num)

   driver.quit()    <br />    return (&#39;腾讯视频上的观看量为:&#39;+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(&#39;vnum&#39;).get_attribute(&#39;title&#39;)

   num = data

   driver.quit()    <br />    return (&#39;优酷视频上的观看量为:&#39;+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(&#39;zm-profile-header-user-agree&#39;).text

   num = data[:-2]

   driver.quit()    <br />    return (&#39;知乎上的点赞为:&#39;+str(num))

report_data = neteasy_crawler()+&#39;\n&#39;+tencent_crawler()+&#39;\n&#39;+youku_crawler()+&#39;\n&#39;+zhihu_crawer()<br />    <br />def _format_addr(s):

   name, addr = parseaddr(s)    <br />    return formataddr((Header(name, &#39;utf-8&#39;).encode(), addr))

from_addr = &#39;******@qq.com&#39;<br />password = &#39;******&#39;<br />to_addr = &#39;******@qq.com&#39;<br />smtp_server = &#39;smtp.qq.com&#39;<br />msg = MIMEText(report_data, &#39;plain&#39;, &#39;utf-8&#39;)

msg[&#39;From&#39;] = _format_addr(&#39;员工 &#39; % from_addr)

msg[&#39;To&#39;] = _format_addr(&#39;老板 &#39; % to_addr)

msg[&#39;Subject&#39;] = Header(&#39;每日汇报&#39;, &#39;utf-8&#39;).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

  重启服务才能使用

  到了这里,所有代码就都完成啦!开始享受程序为你工作的感觉吧~

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线