title: 服务器定时发送邮件爬虫
date: 2017-08-30 18:19:48
前言
开心做技术
在深入感受到爬虫的乐趣的时候,多想用它干点简单的事情,我非常喜欢浏览某网站的热点新闻,但如果那天学习忙的天花乱缀(chu qu gui hun)的时候,“WC、WC、我错过了什么大事情”,就会错过当时的热点。怎么才能记录下呢!
预期达成效果:
python爬去某网站上的时刻下最热点新闻,存储到文档中。在lunix下定时每隔n小时启用python去爬取新闻,然后用邮件的形式每隔n小时将新闻文档发到自己的邮箱,以便朕统一的查阅。
执行计划:
- 定时执行任务配置【Ubuntu环境下】
- 发送邮件相关配置
- 执行脚本编写
- 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文档中
附录:随手最简单的爬虫小程序
import urllib.request
from bs4 import BeautifulSoup
url='http://neihanshequ.com/'
html=urllib.request.urlopen(url).read()
soup=BeautifulSoup(html,"lxml")
ps=soup.find_all('p')
i=[]
for p in ps:
i.append(p.get_text())
with open ('/tmp/email/1.txt','w+') as f:
f.writelines(i)
实现过程 写好程序同样也放在email的目录下
然后crontab加入定时运行python
定时运行py总过程结束
效果图:
网页显示:将邮件放在指定的邮箱。
网页手机端显示:设置为每两分钟接受一次邮件。
iphone做这个小的应用集成,无非是做简单的技术实现,脑洞打开-同样也可以将里面的部分内容去置换。发送的邮件,不是这些无味的粗粮,如一些log日志,跟进工作中的copy事项,去完成其所需要的要求。
网友评论