服务器定时发送邮件爬虫

前言

在深入感受到爬虫的乐趣的时候,多想用它干点简单的事情,我非常喜欢浏览某网站的热点新闻,但如果那天学习忙的天花乱缀(chu qu gui hun)的时候,“WC、WC、我错过了什么大事情”,就会错过当时的热点。怎么才能记录下呢!

预期达成效果:

python爬去某网站上的时刻下最热点新闻,存储到文档中。在lunix下定时每隔n小时启用python去爬取新闻,然后用邮件的形式每隔n小时将新闻文档发到自己的邮箱,以便朕统一的查阅。

执行计划:

  1. 定时执行任务配置【Ubuntu环境下】
  2. 发送邮件相关配置
  3. 执行脚本编写
  4. python爬虫程序编写

注:一千个人心中有一千个哈姆雷特,一千个人配出一千种错误


1、定时执行任务

在ubuntu相爱使用crontab部署定时任务{使用是linux虚拟机ubuntu。}

cron是一个[守护程序]用于在指定的时间内执行行程类的任务,每一个用户都有一个 crontab 文件,来允许他们指定需要执行的内容和时间,此外,系统也有一个 crontab ,用来允许像交替日志和更新本地数据这样有规则的任务。

插入crontab所需要的知识,只需要看看,了解下后面不明白再来看

服务使用命令:

查看cron的状态

sudo  service cron status 

开启cron

sudo /etc/init.d/cron start 

关闭cron

sudo /etc/init.d/cron stop  

重启cron

sudo service cron restart

or重启服务

sudo /etc/init.d/cron restart  

查看命令是否运行

pgrep cron

cron设置用法:

crontab -e #设置定时任务
crontab -l  #查看详情
crontab -r : 删除 crontab 文件  不建议手贱去验证他

定时任务的模版样式:

* * * * * command  星星表示通配符 command表示任务

m h dom mon dow command

分 时 日 月 周 命令

m 分钟 0-59第1列表示分钟1~59 每分钟用或者 /1表示

h 小时 0-23 第2列表示小时1~23(0表示0点)

dow 天1-31 第3列表示日期1~31

mon 月 1-12 第4列表示月份1~12

dow 星期 1-6 0表示星期日第5列标识号星期0~6(0表示星期天)

command 就是要执行的命令 第6列要运行的命令

记住几个特殊符号的含义:

“*”代表取值范围内的数字,

“/”代表”每”,

“-”代表从某个数字到某个数字,

“,”分开几个离散的数字

crontab文件的一些例子:

30 21 * * * /usr/local/etc/rc.d/lighttpd restart

上面的例子表示每晚的21:30重启apache。

45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart

上面的例子表示每月1、10、22日的4 : 45重启apache。

10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart

上面的例子表示每周六、周日的1 : 10重启apache。

0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart

上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。

0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart

上面的例子表示每星期六的11 : 00 pm重启apache。

0 */1 * * * /usr/local/etc/rc.d/lighttpd restart

每一小时重启apache

0 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart

晚上11点到早上7点之间,每隔一小时重启apache

0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart

每月的4号与每周一到周三的11点重启apache

0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart

一月一号的4点重启apac

每天7:50以root 身份执行/etc/cron.daily目录中的所有可执行文件

50   7       *             *     *     root     run-parts     /etc/cron.daily   [ 注:run-parts参数表示,执行后面目录中的所有可执行文件。 ]

每天早上6点

0 6 * * * echo "Good morning." >> /tmp/test.txt //注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。

每两个小时(第一个为15,指明没两个小时的第15min中执行一次)

15 */2 * * * echo "Have a break now." >> /tmp/test.txt 

晚上11点到早上8点之间每两个小时和早上八点

0 23-7/2,8 * * * echo "Have a good dream" >> /tmp/test.txt

每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点

0 11 4 * 1-3 command line

每月(1号凌晨4:42)去执行/etc/cron.monthly内的脚本

42 4 1 * * root run-parts /etc/cron.monthly

注意: “run-parts”这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是文件夹名。

每天的下午4点、5点、6点的5 min、15 min、25 min、35 min、45 min、55 min时执行命令。

5,15,25,35,45,55 16,17,18 * * * command

每年的一月和四月,4号到9号的3点12分和3点55分执行/bin/rm -f expire.1st这个指令,并把结果添加在mm.txt这个文件之后(mm.txt文件位于用户自己的目录位置)。

12,553 4-91,4 * /bin/rm -f expire.1st$#@62;$#@62;mm.txt   (头大)

自己测试小实验,了解他的大概流程与原理:

root123456@ubuntu:~$ crontab –e


使用vi编译器,第一次使用Ubuntu它会让你选着编译器,不要相信他的箭头(easies?)用了老半天就他最费劲 ,还是选择vi,别问为什么, 顺 手!


在里面最下面键入:测试代码

同时在目录下创建/tmp/1.txt

*/1 * * * * date >> /tmp/1.txt

意思是每一分钟将当时的数据打印到/tmp/1.txt中

然后esc –》:wq退出

保存之后重启服务

root123456@ubuntu:~$ sudo service cron restart

查看结果

root123456@ubuntu:~$ cat /tmp/1.txt

每分钟去打印一次时间到1.txt上

定时执行任务这步就可以确定定时可以使用了额,上面的配置是测试定时任务,认识到定时启动任务是什么形式的,还可以去找其他的例子,变换时间 和执行的命令自己做测试。

这步骤是为了后面做铺垫,是后面的基础,就先在这提前介绍了。因为后面很“激情”来不及详细补充定时功能。


#2、发送邮件相关配置
我认为重点和难点就是邮件的发送

自动发送邮件,使用命令行的方式发送邮件。先来陪着两个邮件服务mutt msmtp

在ubuntu下安装mutt很方便,只需要sudo apt-get install mutt

sudo apt-get install mutt

另外需要安装msmtp,一个发邮件的小工具,sudo apt-get insall msmtp。

sudo apt-get insall msmtp

在安装的过程中会出现package configuration,这时候发现无发选到ok

按住Tab点亮ok 然后按住Enter键,接下来一顿默认猛如虎的操作(就乖乖的选默认)

假装有图(安过后就忘了截图噜!)

配置Muttrc

打开文件,路径/etc/Muttrc

set sendmail="/usr/bin/msmtp"  
set use_from=yes  
set realname="mailnam"    邮箱的名字
set from=mailnam@163.com  你的邮箱
set envelope_from=yes 

配置msmtp

msmtp默认没有,所以在/etc路径下创建msmtprc配置文件

我本想用日志文件做测试,创建/var/log/msmtp.log,如果发生错误的话,能检测到原因

打开msmtprc文件配置下面的内容

account default  
host smtp.163.com     不要动
from mailname@163.com 你的邮箱
auth plain  
user mailname        你的名字
password 123456      网易云邮箱客户端授权码,去网易云邮箱设置  教程向下面翻翻 

这个设置权限步骤,只要你胆子大就不用(我是没改,太难了)

由于我们的密码是明文,所以要稍稍的修改下权限(哈哈,你看不到我的pw,你看不到)

chmod 600 msmtprc

现在基本配置完成了,使用命令行输出测试一波

我把以my_first_test为主题,test为内容的邮件发送到另一个我的邮箱

echo "test" |mutt -s "my_first_test" 1599121712@qq.com

哈哈,成功

到这里邮箱配置的环境可以了,现在只能只能用命令行发送邮件。如何做到自动发送,且向下see

常见的报错,搜一下一大推解决方案,奔溃边缘就重新配置,从0开始!

mutt的常用命令

mutt [-hnpRvxz][-a<文件>][-b<地址>][-c<地址>][-f<邮件文件>][-F<配置文件>][-H<邮件草稿>][-i<文件>][-m<类型>][-s<主题>][邮件地址]

Linux命令参数:

-a<文件 在邮件中加上附加文件。

-b<地址 指定密件副本的收信人地址。

-c<地址 指定副本的收信人地址。

-f<邮件文件 指定要载入的邮件文件。

-F<配置文件 指定mutt程序的设置文件,而不读取预设的.muttrc文件。

-h 显示帮助。

-H<邮件草稿>  将指定的邮件草稿送出

-i<文件 将指定文件插入邮件内文中

-m<类型 指定预设的邮件信箱类型。

-n 不要去读取程序培植文件(/etc/Muttrc)

-p 在mutt中编辑完邮件后,而不想将邮件立即送出,可将该邮件暂缓寄出。

-R 以只读的方式开启邮件文件

-s<主题 指定邮件的主题。

-v 显示mutt的版本信息以及当初编译此文件时所给予的参数。

-x 模拟mailx的编辑方式。

-z 与-f参数一并使用时,若邮件文件中没有邮件即不启动mutt。

举个橘子:

mutt -s "subject" -a /home/admin/backup.tar.gz < /tmp/x.txt

  -s: 邮件标题,用””括上

  -a: 邮件附件。如上命令就是将/backup目录下 backup.tar.gz文件作为附件发送。

  < /tmp/x.txt:/tmp目录下x.txt文件里的内容作为邮件内容发送。

  给多人发送邮件,只要在邮箱地址后加空格接着输入邮箱地址即可,如:

mutt -s "subject" -a /home/admin/backup.tar.gz < /tmp/x.txt

网易163邮箱获取授权码

163免费邮箱可以直接要网页上进行收发邮件,,如果在客户端上收发邮件必须使用授权码才能够使用

授权码163邮箱的一个安全机制

登录163邮箱,在设置里面


查看,应该是没开启的状态,我的开启了

点击开启,手机验证,输入的密码就是上面配置中输入的密码
同时开通POP3/SMTP/IMTP邮件收发服务,你的手机邮件都会记录下这个密码的。

在测试的时候出现错误:不要怕,去翻译去百度(我就是这么煎熬的过来的)


#3、执行脚本编写

前面的的步骤成在Ubuntu上配置,下面就让发送邮件和定时功能结合起来,编写.sh小脚本

在tmp下创建emil文件夹

测试小实验:

在里面创建a.sh文件,输入

echo "aaaaaaaaaa" | mutt -s "this is title" 1599121712@qq.com

邮箱是要发到的邮箱。

bash '/tmp/email/a.sh'

收到邮件

然后在crontab中定时执行这个脚本

crontab -e

添加定时语句,每一分钟执行一次a.sh的脚本

*/1 * * * * bash  /tmp/email/a.sh

保存 退出 重启服务器

这是就会每分钟自动发送给你一次邮件


不行我要赶紧关了,这一分钟一次也太烦了!!小实验到此实验成功!

下面写将python爬取数据的1.txt文本中的内容发送到邮件上的.sh脚本

同样的步骤依旧在原email的目录下创建1.sh和1.txt

编写1.sh内容

echo  "this is my computer"|mutt -s "my_conputer server" 1599121712@qq.com  </tmp/email/1.txt   -a /tmp/email/1.txt


然后让他定时运行脚本

*/30 * * * * bash /tmp/email/1.sh

30分钟给我发送一次,自己可以任意修改时间

保存,重启服务
完成.sh脚本的编写

python爬虫程序的编写,将爬取的内容加入的/tmp/email/1.txt文档中

(没有小实验)

实现过程 写好程序同样也放在email的目录下

然后crontab加入定时运行python

总过程结束

效果图