python实现 _ 图书馆书籍到期之前_自动邮件提醒
一共两个脚本:
第一个是【借书完毕以及借书信息有变更(续借等)】的时候需要执行的脚本;实现模拟登陆,同时最新的借书信息的下载到本地文本;之所以没有这样做,是因为如果每次爬取一遍的话,需要每次输入一遍验证码,就没有意义了;现在输入一次就可以了;导出到文本上,以后直接读取就行了。
第二个脚本,需要添加到启动计划中每天自动执行的(每天自动检查有没有超期书籍)
__author__ = 'Oscar_Yang'
#-*- coding= utf-8 -*-
import subprocess
import sys
import os
import requests
import re
import random
import time
from bs4 import BeautifulSoup
import smtplib
from email.mime.text import MIMEText
from email.header import Header
import pytesseract
from PIL import Image def login(name, password):
random_num = random.random() # 生成随机数,构造获取验证码的链接
url = 'http://202.206.242.99//reader/captcha.php?' + str(random_num) get_captcha = session.get(url).content
with open('captcha.png', 'wb') as f:
f.write(get_captcha)
f.close() '''
这段代码是为了方便我们打开图片,它可以直接打开图片
我们就不用去文件夹里去找,里面是判断使用什么系统,
不同系统打开方式有点差异,可以找python文档了解这部分内容
'''
if sys.platform.find('darwin') >= 0:
subprocess.call(['open', 'captcha.png'])
elif sys.platform.find('linux') >= 0:
subprocess.call(['xdg-open', 'captcha.png'])
else:
os.startfile('captcha.png') # image = Image.open('captcha.png')
# input_captcha = pytesseract.image_to_string(image)
# # print(vcode) input_captcha = input('请输入验证码:')
input_captcha = str(input_captcha) # 构造登录表单,里面就是我们上面提及的四项
post_data = {
'number': name,
'passwd': password,
'captcha': input_captcha,
'select': 'cert_no'
} login_url = 'http://202.206.242.99/reader/redr_verify.php' html = session.post(login_url, data=post_data).content book_hist_url = 'http://202.206.242.99/reader/book_lst.php'
content = session.get(book_hist_url).content.decode('utf-8')
from bs4 import BeautifulSoup
soup=BeautifulSoup(content,"lxml")
return soup def get_data(soup):
titles=soup.select("a.blue")
deadlines=soup.select("font")[1:]
item_urls=soup.select("a.blue")
# print(item_urls)
base_data_list=[]
for title,deadline,item_url in zip(titles,deadlines,item_urls):
base_data={
"title":title.text,
"deadline":deadline.text.strip(),
"item_url":"http://202.206.242.99/"+item_url["href"]
}
# print(data)
base_data_list.append(base_data)
return base_data_list # deadline = data["deadline"]
# yinghuan_time_list = deadline.split("-")
# yinghuan_month = yinghuan_time_list[1]
# yinghuan_day = yinghuan_time_list[2]
def get_detail_data(item_url):
res=requests.get(item_url)
res.encoding="utf8"
soup=BeautifulSoup(res.text,"lxml")
intro=soup.find_all(class_="sharing_zy")
# tupus="http://202.206.242.99/"+soup.select("p > a > img")[0]["src"]
intro=re.findall(r'href="(.*?)"',str(intro))
# data={
# "tupu:":tupus,
# "xiangxi:":intro
# }
print(intro)
# return data def send_email(deadline,title,item_url, day,name):
from_addr = '###'
password = '###'
to_addr = '###'
smtp_server = '###' msg=MIMEText('''hello:\n\n 《{}》这本书还有{}天到期,deadline为{},尽快去还吧!\n\n 注意:为了防止被识别为垃圾邮件,以下内容为自动添加,同时供您查看!\n\n点击链接查看图书详情{}'''.format(title,day,deadline,item_url), 'plain', 'utf-8')
msg['From'] = Header("{}请注意借书到期通知".format(name), 'utf-8')
msg['To'] = Header("{}同学".format(name), 'utf-8') subject = 'hello'
msg['Subject'] = Header(subject, 'utf-8') server = smtplib.SMTP(smtp_server, 25)
server.set_debuglevel(1)
server.login(from_addr, password)
server.sendmail(from_addr, [to_addr], msg.as_string())
server.quit() def data1file(data):
path = r"C:\Users\Oscar\Desktop\数据.txt"
file = open(path, "a", encoding="utf-8")
file.write("\n")
file.write(str(data))
file.close() if __name__ == '__main__':
"""
获取当前时间
"""
local_time = time.strftime("%Y-%m-%d", time.localtime()) # 获取当前时间
local_time = str(local_time)
times = re.split(r'-', local_time)
year = times[0]
now_month = times[1]
now_day = times[2] session = requests.Session()
session.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36'
} name = input("请输入用户名:")
password = input("请输入密码:")
soup=login(name,password)
# print(soup) base_data_list=get_data(soup)
for base_data in base_data_list:
deadline = base_data["deadline"] #应还时间
title=base_data["title"] #书名
item_url=base_data["item_url"] #图书馆的详情页
yinghuan_time_list = deadline.split("-") yinghuan_month = yinghuan_time_list[1]
yinghuan_day = yinghuan_time_list[2]
data_all={
"deadline":deadline,
"title":title,
"item_url":item_url,
"name":name
}
data1file(data_all) if int(now_month) == int(yinghuan_month) - 1:
day = 30 - int(now_day) + int(yinghuan_day)
if day < 7:
send_email(deadline,title,item_url, day,name)
elif now_month == yinghuan_month:
day = int(yinghuan_day) - int(now_day)
if day < 7:
send_email(deadline,title,item_url, day,name)
# time.sleep(120)
else:
pass
# time.sleep(200)
import subprocess
import sys
import os
import requests
import re
import random
import time
from bs4 import BeautifulSoup
import smtplib
from email.mime.text import MIMEText
from email.header import Header def send_email(deadline,title,item_url, day,name):
from_addr = '###@qq.com'
password = '###'
to_addr = '###@qq.com'
smtp_server = 'smtp.qq.com' msg=MIMEText('''hello:\n\n 《{}》这本书还有{}天到期,deadline为{},尽快去还吧!\n\n 注意:为了防止被识别为垃圾邮件,以下内容为自动添加,同时供您查看!\n\n点击链接查看图书详情{}'''.format(title,day,deadline,item_url), 'plain', 'utf-8')
msg['From'] = Header("还书通知:{}请注意".format(name), 'utf-8')
msg['To'] = Header("{}".format(name), 'utf-8') subject = 'hello'
msg['Subject'] = Header(subject, 'utf-8') server = smtplib.SMTP(smtp_server, 25)
server.set_debuglevel(1)
server.login(from_addr, password)
server.sendmail(from_addr, [to_addr], msg.as_string())
server.quit() if __name__ == '__main__':
"""
先是获取当前时间
"""
local_time = time.strftime("%Y-%m-%d", time.localtime()) # 获取当前时间
local_time = str(local_time)
times = re.split(r'-', local_time)
now_year = times[0]
now_month = times[1]
now_day = times[2]
"""
读取之前存好的下载好的借书信息
"""
path=r"C:\Users\Oscar\Desktop\数据.txt"
with open(path,encoding="utf8") as f:
a=f.readlines()
# print(a)
a=a[1:]
for item in a:
# print(item)
deadline=re.findall(r"'deadline': '(.*?)'",item)
item_url=re.findall(r"'item_url': '(.*?)'",item)
title=re.findall(r"'title': '(.*?)'",item)
name=re.findall(r"'name': '(.*?)'",item) yinghuan_time_list = str(deadline).split("-")
yinghuan_month = yinghuan_time_list[1]
yinghuan_day = yinghuan_time_list[2].split("'")[0]
title=str(title).split("'")[1]
name=str(name).split("'")[1]
item_url=str(item_url).split("'")[1] """
判断发不发邮件
"""
if int(now_month) == int(yinghuan_month) - 1:
day = 30 - int(now_day) + int(yinghuan_day)
if day < 7:
send_email(deadline, title, item_url, day,name)
elif now_month == yinghuan_month:
day = int(yinghuan_day) - int(now_day)
if day < 7:
send_email(deadline, title, item_url, day,name)
# time.sleep(120)
else:
pass
# time.sleep(200)
最后效果

python实现 _ 图书馆书籍到期之前_自动邮件提醒的更多相关文章
- 学习笔记之Python全栈开发/人工智能公开课_腾讯课堂
Python全栈开发/人工智能公开课_腾讯课堂 https://ke.qq.com/course/190378 https://github.com/haoran119/ke.qq.com.pytho ...
- python开发_tkinter_获取文本框内容_给文本框添加键盘输入事件
在之前的blog中有提到python的tkinter中的菜单操作 python开发_tkinter_窗口控件_自己制作的Python IDEL_博主推荐 python开发_tkinter_窗口控件_自 ...
- pygame系列_小球完全弹性碰撞游戏_源码下载
之前做了一个基于python的tkinter的小球完全碰撞游戏: python开发_tkinter_小球完全弹性碰撞游戏_源码下载 今天利用业余时间,写了一个功能要强大一些的小球完全碰撞游戏: 游戏名 ...
- C Primer Plus_第四章_字符串和格式化输入输出_编程练习
Practice 1.输入名字和姓氏,以"名字,姓氏"的格式输出打印. #include int main(void) { char name[20]; char family[2 ...
- OpenGL立方体在世界坐标系中_缩放_旋转_平移_顶点片源着色器_光照作用_棋盘纹理贴图
读取bmp等图片格式中的像素还有难度,就先用这个棋盘图象素来弄了 代码打错一个就一直First-chance exception ,貌似还有一个要用q或者Q才能成功退出,不知道缺少哪句,我用窗口红叉退 ...
- Docker入门实战_正版电子书在线阅读_百度阅读
Docker入门实战_正版电子书在线阅读_百度阅读 Docker入门实战
- Payssion,海外本地支付_海外本地收款_小语种本地支付_外贸收款_外贸网店收款_欧洲本地支付_俄罗斯本地支付_巴西支付_跨境支付_PAYSSION,让跨境支付更轻松!
Payssion,海外本地支付_海外本地收款_小语种本地支付_外贸收款_外贸网店收款_欧洲本地支付_俄罗斯本地支付_巴西支付_跨境支付_PAYSSION,让跨境支付更轻松! 首页 / 关于 ...
- 大Q品牌故事_大Q官网_腾讯旗下买卖宝公司倾力打造
大Q品牌故事_大Q官网_腾讯旗下买卖宝公司倾力打造 走在大路上的改变者,有态度的互联网手机品牌
- 【milonga】什么意思_英语milonga在线翻译_有道词典
[milonga]什么意思_英语milonga在线翻译_有道词典 milonga 网络释义英英释义 米隆加 本届探戈艺术节表演最受观众欢迎的是热情欢快的米隆加(Milonga)舞曲探戈,为了吸引年 ...
随机推荐
- iphone显示信号强弱(field test)
第一步,进入[电话]第二步,在拨号键盘上输入*3001#12345#*,然后按下[呼叫]按钮,iOS内置应用Field Test就被启动了,同时左上角也出现了信号强度的精确值. 第三步,按住iPhon ...
- android shape的使用 边框
android中常常使用shape来定义控件的一些显示属性,今天看了一些shape的使用,对shape有了大体的了解,稍作总结: 先写drawable里面的xml文件,里面设置shape来设置文本框的 ...
- 阿里云搭建LAMP环境详细教程
一.云服务器的选择 随着大数据时代的到来,为了满足更为复杂的运算和用户更为苛刻的需求,云计算应运而生,随之而来的就是云服务器.过去的服务器成本较高,运算模式较为单一,资源利用率不高,而云服务器的出现刚 ...
- panguan(判官):一个自研的任务执行引擎的工程实践
来某厂接近半年了,几乎没写过C++代码,说实话还真的有点手生.最近刚好有一个需求,然而我感觉我也没有办法用C++以外的语言去实现它.于是还是花了几天时间用C++完成编码,这是一个简单的任务执行引擎,它 ...
- svn执行clean up命令时报错
svn执行clean up命令时报错“Previous operation has not finished; run 'cleanup' if it was interrupted”.无论你到那个父 ...
- 学习记录 java 链表知识
01.import java.util.HashMap; 02.import java.util.Scanner; 03.import java.util.Stack; 04. 05./** 06. ...
- Android中各组件的生命周期
1.Activity生命周期图 二.activity三种状态 (1)active:当Activity运行在屏幕前台(处于当前任务活动栈的最上面),此时它获取了焦点能响应用户的操作,属于活动状态,同一个 ...
- NULL值比较,两个列的合并,列值按条件替换。
show create table 表名 -- 显示创建表的sql语句. 为已有的表增加新列.alter table 表名 add 列名 int NULL -- 此行加了一个int 类型 默认可以nu ...
- FindResource函数错误代码:1813-找不到映像文件中指定的资源类型 与LoadResource函数错误代码:1812-指定的映像文件不包含资源区域
HRSRC WINAPI FindResource( _In_opt_ HMODULE hModule, _In_ LPCTSTR lpName, _In_ LPCTSTR lp ...
- JS常用的设计模式(10)——模版方法模式
模式方法是预先定义一组算法,先把算法的不变部分抽象到父类,再将另外一些可变的步骤延迟到子类去实现.听起来有点像工厂模式( 非前面说过的简单工厂模式 ). 最大的区别是,工厂模式的意图是根据子类的实现最 ...