前言
身为程序员,如果想定时在某个网站上面爬一些图片/视频(你懂得),爬完后发一封邮件到自己邮箱通知~不多说,我们开始吧。
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为你上面代码保存的文件名哦)
效果如下
crontab定时任务
然后我们设置Linux定时任务了,定时特定时间让它执行。
crontab -l 可以看到当前系统正在执行的任务。
图中是我设置的,如果你们没设置过的话默认是空的哈~
我们怎么添加一个任务呢?
来,手把手教你
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个单位;
- 用于表示一个范围,如"[1-10]"表示从1到10; , 用于表示若干离散的数字,如"5,15,25"
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
骚年们,又看不懂了把?
之前尝试过很多方法用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-时间
第二行
执行完毕肯定是要发邮件通知的哈~
完毕~
本文由 SAn 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:
2018/04/17 18:22