一共两个脚本:

第一个是【借书完毕以及借书信息有变更(续借等)】的时候需要执行的脚本;实现模拟登陆,同时最新的借书信息的下载到本地文本;之所以没有这样做,是因为如果每次爬取一遍的话,需要每次输入一遍验证码,就没有意义了;现在输入一次就可以了;导出到文本上,以后直接读取就行了。

第二个脚本,需要添加到启动计划中每天自动执行的(每天自动检查有没有超期书籍)

 __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实现 _ 图书馆书籍到期之前_自动邮件提醒的更多相关文章

  1. 学习笔记之Python全栈开发/人工智能公开课_腾讯课堂

    Python全栈开发/人工智能公开课_腾讯课堂 https://ke.qq.com/course/190378 https://github.com/haoran119/ke.qq.com.pytho ...

  2. python开发_tkinter_获取文本框内容_给文本框添加键盘输入事件

    在之前的blog中有提到python的tkinter中的菜单操作 python开发_tkinter_窗口控件_自己制作的Python IDEL_博主推荐 python开发_tkinter_窗口控件_自 ...

  3. pygame系列_小球完全弹性碰撞游戏_源码下载

    之前做了一个基于python的tkinter的小球完全碰撞游戏: python开发_tkinter_小球完全弹性碰撞游戏_源码下载 今天利用业余时间,写了一个功能要强大一些的小球完全碰撞游戏: 游戏名 ...

  4. C Primer Plus_第四章_字符串和格式化输入输出_编程练习

    Practice 1.输入名字和姓氏,以"名字,姓氏"的格式输出打印. #include int main(void) { char name[20]; char family[2 ...

  5. OpenGL立方体在世界坐标系中_缩放_旋转_平移_顶点片源着色器_光照作用_棋盘纹理贴图

    读取bmp等图片格式中的像素还有难度,就先用这个棋盘图象素来弄了 代码打错一个就一直First-chance exception ,貌似还有一个要用q或者Q才能成功退出,不知道缺少哪句,我用窗口红叉退 ...

  6. Docker入门实战_正版电子书在线阅读_百度阅读

    Docker入门实战_正版电子书在线阅读_百度阅读 Docker入门实战

  7. Payssion,海外本地支付_海外本地收款_小语种本地支付_外贸收款_外贸网店收款_欧洲本地支付_俄罗斯本地支付_巴西支付_跨境支付_PAYSSION,让跨境支付更轻松!

    Payssion,海外本地支付_海外本地收款_小语种本地支付_外贸收款_外贸网店收款_欧洲本地支付_俄罗斯本地支付_巴西支付_跨境支付_PAYSSION,让跨境支付更轻松!       首页 / 关于 ...

  8. 大Q品牌故事_大Q官网_腾讯旗下买卖宝公司倾力打造

    大Q品牌故事_大Q官网_腾讯旗下买卖宝公司倾力打造 走在大路上的改变者,有态度的互联网手机品牌

  9. 【milonga】什么意思_英语milonga在线翻译_有道词典

    [milonga]什么意思_英语milonga在线翻译_有道词典 milonga 网络释义英英释义   米隆加 本届探戈艺术节表演最受观众欢迎的是热情欢快的米隆加(Milonga)舞曲探戈,为了吸引年 ...

随机推荐

  1. Android GridView 指定行数,动态行宽,占满空间

    有时间我们需要 使用GridViw 让它占满父控件,例: 特别是在适配的时间比较麻烦,在不同的机型上可能分出下,下面空的太多,或有滚动条问题,; 下面说一下实现思路: 首先,设置GridView 为三 ...

  2. SMTP邮件发送命令

    第一步,远程登录smtp服务器 在命令行窗口输入 telnet smtp.163.com 25 然后回车第二步,用户登录 输入 helo 163.com 回车,这是向服务器表明你的用户身份250 OK ...

  3. 用Asroute解决复杂状态切换问题

    项目地址:https://github.com/boycy815/asroute 首先明确几个概念 状态: 很多情况下,一个复杂的UI组件可能会有很多种不同的“状态”,不同的“状态”下组件本身对外界会 ...

  4. 学习总结 HTML简单应用

    <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo ...

  5. php文件大小单位转换GB MB KB

    private function formatBytes($size){ $units = array('字节','K','M','G','T'); $i = 0; for( ; $size>= ...

  6. Mac 平台下功能强大的Shimo软件使用指南

    年初自从换了MAC工作站后,彻底享受了Apple产品给我们带来的完美体验,可能是刚转过来不适应,在访问网络设备时觉得远程连接不方便,例如ssh,vpn登陆都不是很方便,后来又安装了openvpnfor ...

  7. PAT1013. Battle Over Cities(邻接矩阵、邻接表分别dfs)

    //采用不同的图存储结构结构邻接矩阵.邻接表分别dfs,我想我是寂寞了吧,应该试试并查集,看见可以用并查集的就用dfs,bfs代替......怕了并查集了 //邻接矩阵dfs #include< ...

  8. 做权限树时 使用EasyUI中Tree

    符合EasyUI中Tree的Json格式,我们先看一下,格式是如何的 [{ "id":1, "text":"My Documents", & ...

  9. 值得推荐的C/C++框架和库(转)

    值得学习的C语言开源项目 C++ 资源大全 值得学习的C语言开源项目 1.Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我 ...

  10. Splash Screen开场屏在Android中的实现

    很多网友可能发现近期Tencent推出的手机QQ Android版包含了一个开场屏Splash Screen载入效果,通常游戏或大型软件打开时可能需要一个释放解析资源的过程,需要一个前台的动画播放和后 ...