Linux定时执行Python爬虫并发送Email通知

/ 默认分类 / 无站内评论 / 1712浏览

前言

身为程序员,如果想定时在某个网站上面爬一些图片/视频(你懂得),爬完后发一封邮件到自己邮箱通知~不多说,我们开始吧。 alt

Python版本3.5

import smtplib
from email.header import Header
from email.mime.text import MIMEText

# 第三方 SMTP 服务
mail_host = "smtp.163.com"      # SMTP服务器
mail_user = "xxx@163.com"                  # 用户名
mail_pass = "xxx"               # 授权密码,非登录密码 设置里面找到smtp开启

sender = 'xxx@163.com'    # 发件人邮箱(最好写全, 不然会失败)
receivers = ['xxx1@qq.com','xxx2@qq.com','xxx2@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱。

# 发图片会被收入垃圾箱。。。。
# content = '<img src="http://i1.bvimg.com/641359/a13fce45083b5e8b.gif">'
# HTML格式
content = '<h1><a href="http://xxxx">任务执行完毕,点击进入</a></h1>">'
title = 'Python定时任务'  # 邮件主题

def sendEmail():
    # 敲黑板!!!如果想发普通文本内容,把html改成plan即可,上面的content直接写文本内容
    message = MIMEText(content, 'html', 'utf-8')  # 内容, 格式, 编码
    message['From'] = "{}".format(sender)
    message['To'] = ",".join(receivers)
    message['Subject'] = title

    try:
        smtpObj = smtplib.SMTP_SSL(mail_host, 465)  # 启用SSL发信, 端口一般是465
        smtpObj.login(mail_user, mail_pass)  # 登录验证
        smtpObj.sendmail(sender, receivers, message.as_string())  # 发送
        print("send successfully.")
    except smtplib.SMTPException as e:
        print(e)


if __name__ == '__main__':
    sendEmail() # 发送


如何发送呢?

python xxx.py(xxx为你上面代码保存的文件名哦) 效果如下 alt

crontab定时任务

然后我们设置Linux定时任务了,定时特定时间让它执行。 crontab -l 可以看到当前系统正在执行的任务。 alt

图中是我设置的,如果你们没设置过的话默认是空的哈~

我们怎么添加一个任务呢?

来,手把手教你 alt crontab -e 这时候会使用VIM编辑器进行编辑,骚年门,不会vim出门左拐搜索vim。 其实我写过了,点我

不想截图了,看文字吧 ヾ(。 ̄□ ̄)ツ゜゜゜

[root@VM_166_249_centos shell]# crontab -e

0 10,21 * * * cd /usr/local/myspider/project/blog13 && sh /usr/local/myspider/project/shell/task.sh

crontab 文件中命令格式如下:

minute hour day-of-month month-of-year day-of-week commands

即:"分 时 日 月 周 命令",共计6段,前5段都是时间,最后一段才是你要定期执行的指令。每段之间使用空格或者制表符分隔。

来看一下前5段即日期和时间的取值范围:

1,分钟[00-59] 2,小时[00-23] 3,日[01-31] 4,月份[01-12] 5,周[0-6] ;注意,这里的0表示周日

上面这条指令里使用了特殊符号"",代表当前段取值范围内的所有数字,如第3段上的""代表[01-31]日,第4段上的"*"代表[01-12]月。

特殊符号除了"*"号还有"/"、"-"、",":

/ 代表"每"的意思,如"/5"表示每5个单位;

crontab例子

每1分钟执行一次command

* * * * * command
每小时的第3和第15分钟执行

3,15 * * * * command
在上午8点到11点的第3和第15分钟执行

3,15 8-11 * * * command
每隔两天的上午8点到11点的第3和第15分钟执行

3,15 8-11 */2 * * command
每个星期一的上午8点到11点的第3和第15分钟执行

3,15 8-11 * * 1 command
每晚的21:30重启smb 

30 21 * * * /etc/init.d/smb restart
每月1、10、22日的4 : 45重启smb 

45 4 1,10,22 * * /etc/init.d/smb restart
每周六、周日的1:10重启smb

10 1 * * 6,0 /etc/init.d/smb restart
每天18 : 00至23 : 00之间每隔30分钟重启smb 

0,30 18-23 * * * /etc/init.d/smb restart
每星期六的晚上11:00 pm重启smb 

0 23 * * 6 /etc/init.d/smb restart
每一小时重启smb 

* */1 * * * /etc/init.d/smb restart
晚上11点到早上7点之间,每隔一小时重启smb

* 23-7/1 * * * /etc/init.d/smb restart
每月的4号与每周一到周三的11点重启smb 

0 11 4 * mon-wed /etc/init.d/smb restart
一月一号的4点重启smb

0 4 1 jan * /etc/init.d/smb restart
每小时执行/etc/cron.hourly目录内的脚本

01 * * * * root run-parts /etc/cron.hourly

懂了吗? 因此我任务执行的是: 每天早上九点和晚上九点执行python脚本,并且发送邮件通知。

shell脚本

cd /usr/local/myspider/project/blog13 && sh /usr/local/myspider/project/shell/task.sh

骚年们,又看不懂了把? alt 之前尝试过很多方法用crontab执行scrapy的爬虫任务,但是都没出成功,总结下来有两点错误与相应的解决方法:

1、手动执行时,在工程目录下输入scrapy crawl xxx就可以执行爬虫脚本了,但是用crontab时,如果直接在crontab -e中输入00 00 * * * scrapy crawl xxx,定时任务是不会生效的,因为我们不知道crontab执行时,其所处的目录,很有可能就没有scrapy命令。

2、为了解决第一个问题,我尝试如下做法00 00 * * * /usr/local/bin/scrapy crawl xxx,貌似解决了第一个找不到scrapy命令的问题,但是又有新的问题出现,即找不到crawl命令,在不同的路径下scrapy后面跟的命令是不一样的,只有在scrapy的工程目录下才会有crawl命令,因此,我们需要先进入工程目录再执行启动命令,因此,书写如下crontab的指令:00 00 * * * cd /home/workspace/scrapy && /usr/local/bin/scrapy crawl xxx,就可以正常的执行定时任务了,有时候爬虫比较多,需要shell脚本集中管理00 00 * * * cd /home/workspace/scrapy && sh startup.sh,在shell脚本中的代码是:

脚本说明


#!/bin/sh
scrapy crawl blog -o  /usr/share/san/spider/data-"$(date +%F)".json
python /usr/local/myspider/project/shell/sendHTML.py

第一行 执行爬虫,并且保存数据到执行目下,文件格式为data-时间 第二行 执行完毕肯定是要发邮件通知的哈~ alt 完毕~

召唤蕾姆
琼ICP备18000156号

鄂公网安备 42011502000211号