1、linux使用crontab定时执行脚本:
a、crontab启动、停止、启动、重启crontab服务:
一、正常情况(linux版本有service命令的):
重启命令:service crond restart
启动命令:service crond start
停止命令:service crond stop
二、没有service命令的情况:
停止指令:/etc/init.d/cron stop
启动指令:/etc/init.d/cron start
b、crontab定时任务的编写:
搭配cron服务的一些参数说明:
-u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
-l //列出某个用户cron服务的详细内容
-e //编辑某个用户的cron服务
-r //删除某个用户的cron服务
例如:
root@iZzxf7ditZ:~# crontab -u root -e
其就会进入到一个编辑文件里面,即可以在里面填写要进行自动执行的指令,其前面有五个参数是用来指定时间的,详细使用看下面的时间规则。其这里的指令最好用sh脚本来而不是使用详细的执行内容,这样方便后期的维护。例如这里位:
1 8 * * 1-6 bash /home/DayDay/start.sh
这里周日是0,这里的意思是周一至周六的每天8:01进行执行这个脚本。其中sh脚本了的内容位:
cd /home/DayDay
/root/anaconda3/bin/python /home/DayDay/beautifget2.py
注意:可以看到这里的python和py文件都是全路径,因为crontab不知道我们需要的一些环境变量,即他不像shell控制台一样会自动加载一些环境变量,像:/usr/bin文件下的一些软连接等,所以需要使用全变量,否则其不会执行,因为找不到python这个软链接。
c、crontab的定时任务的时间格式规则编写:
指令前面的五个参数分别是:分(0-59) 小时(0-23) 日(1-31) 月(1-12) 星期(0-6) //0代表是星期天。
使用这些参数的一些规制:"*"代表所有取值范围内的数值 "/"代表每的意思 "*/5"代表每间隔5 "-"代表从某个值到某个值,
","代表几个指定的离散值
如在4点到6点 每分钟向test.text中打印Hello world
- d、查看在执行的任务指令:
crontab -l
2、使用smtplib自动登陆邮箱:
使用smtplib主要注意的一点就是关于是进行ssl加密传输还是直接使用smtp进行传输。因为在服务器上例如阿里云上其是关闭了25端口的,而这个端口是使用smtp直接传输的,这个就会导致链接smtp不成功。而使用自己电脑搭建服务器则可以使用两种方法。
第一种云服务跟本地电脑都适用的为:
# 发生邮件
def sendallmail(title, msg):
host_server = 'smtp.qq.com'
sendqqmail = '自己的QQ邮箱'
receiver = '接收者的QQ邮箱'
pwd = '发送者的服务码' #填自己的服务码,不是qq密码
# 登陆邮箱操作,要使用ssl进行加密发送,否则在服务器上25端口会被封了
smtp = smtplib.SMTP_SSL(host_server, 465)
# smtp.debuglevel(1)
# smtp.set_debuglevel(1)
# 开始链接到smtp服务
smtp.ehlo()
smtp.login(sendqqmail, pwd)
summsg = ""
for data in msg:
#为每个信息之间添加换行
summsg = summsg + str(data) + "\n"
# 填写邮件内容,可以在MIMEText输入文本里添加换行符
msg = MIMEText(summsg, 'plain', 'utf-8')
msg['Subject'] = Header(title, 'utf-8')
msg['From'] = sendqqmail
msg['To'] = receiver
# 发生信息
smtp.sendmail(sendqqmail, receiver, msg.as_string())
smtp.quit()
2.2 poplib进行邮件读取解析:
主要参考博客:认真对待Python3收邮件 其代码也已经提交到自己的代码仓库:https://gitee.com/yangdashi/receive-mails
3、BeautifulSoup进行网页爬取:
其中爬取主要使用到的函数就是:findAll()或者find_all()用于查找指定的所有的html元素,其返回值是一个list(重要);get_text()
其是把html元素里的所有文本进行获取,返回值是一个字符串。split()对返回的粘连字符串进行分割,由于split不能使用多个分割符,如果多个的话可以使用re模块或者多个split联合使用。
#传入网址,返回对应的网页信息
def geturl_utf8(url):
html = requests.get(url, headers=header).content.decode('utf-8')
soup = BeautifulSoup(html, 'lxml')
return soup
# 爬取网页
def webAnalyze(soup):
name = None
curvalue = None
yesterday = None
yesterday_date = None
try:
tags = soup.select('dd')
curvalue = (tags[0].find_all('span')[0].string)
yesterday = (tags[3].find_all("span")[0].string)
# 切记这两个findAll得出的是一个list,即有[]的下面的要获取文本一定要加
# 索引,要么就会报错,其错误信息是没有提示的。
titls = soup.find_all(class_='fundDetail-tit')
#要加索引,否则会报错。
name = titls[0].get_text()
# 获得昨天的时间
dl = soup.findAll(class_="dataItem02")
p = dl[0].select("p")
yesterday_date = p[0].get_text().split(' ')[1]
print(yesterday_date)
return name, curvalue, yesterday, yesterday_date
# print(titls)
except:
return name, curvalue, yesterday
4、logging进行错误日志记录:
当程序代码进行运行的时候,最好能把一些错误日志记录起来,方便检测使用。例子
import logging
from logging import handlers
class Logger(object):
level_relations = {
'debug': logging.DEBUG,
'info': logging.INFO,
'warning': logging.WARNING,
'error': logging.ERROR,
'crit': logging.CRITICAL
} # 日志级别关系映射
def __init__(self, filename, level='info', when='D', backCount=3,
fmt='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'):
self.logger = logging.getLogger(filename)
format_str = logging.Formatter(fmt) # 设置日志格式
self.logger.setLevel(self.level_relations.get(level)) # 设置日志级别
sh = logging.StreamHandler() # 往屏幕上输出
sh.setFormatter(format_str) # 设置屏幕上显示的格式
th = handlers.TimedRotatingFileHandler(filename=filename, when=when, backupCount=backCount,
encoding='utf-8') # 往文件里写入#指定间隔时间自动生成文件的处理器
# 实例化TimedRotatingFileHandler
# interval是时间间隔,backupCount是备份文件的个数,如果超过这个个数,就会自动删除,when是间隔的时间单位,单位有以下几种:
# S 秒
# M 分
# H 小时、
# D 天、
# W 每星期(interval==0时代表星期一)
# midnight 每天凌晨
th.setFormatter(format_str) # 设置文件里写入的格式
self.logger.addHandler(sh) # 把对象加到logger里
self.logger.addHandler(th)
#其中log.txt如果存在,则不新建,如果不存在,则新建。
log = Logger('log/log.txt', level='debug')
#往日志里写入错误信息,其中error表示这是一条错误信息。
log.logger.error('sendmail error!')
其中文件里的内容为:
2019-04-28 12:57:31,239 - H:/python/BeiHang/DayDayDay/beautifget2.py[line:104] - ERROR: sendmail error!