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)舞曲探戈,为了吸引年 ...
随机推荐
- The Ninth Hunan Collegiate Programming Contest (2013) Problem L
Problem L Last Blood In many programming contests, special prizes are given to teams who solved a pa ...
- PreparedStatement和Statment
使用Statment安全性差,存在SQL注入隐患 public static void main(String[] args) { Connection conn=null; Statement st ...
- 日期:Date
API--- java.util.Date:日期类,月份从0-11: 日期对象和毫秒值之间的转换. 1,日期对象转成毫秒值.Date类中的getTime方法. 2,如何将获取到的毫秒值转成具体的日期呢 ...
- 从手工测试转型web自动化测试继而转型成专门做自动化测试的学习路线。
在开始之前先自学两个工具商业web自动化测试工具请自学QTP:QTP的学习可以跳过,我是跳过了的.开源web自动化测试工具请自学Selenium:我当年是先学watir(耗时1周),再学seleniu ...
- 使用eclipse上传项目到开源中国代码托管Git@osc教程
创建项目 安装EGit插件 没有的话看下图 生成公钥 注册git账号 新建git项目 添加公钥 建立本地代码库 本文章版权归博主所有,如需转载请私信.
- 创建母版页导致js出现“ 'document.getElementById(...)' 为空或不是对象”错误
导读:一个控件在设计时的ID往往不同于生成页面后的ID,为了获得控件客户端ID,我们可以从生成的页面入手,冷静思考,把握主次,从底层框架入手 本文将为大家介绍一下 ASP.NET中在创建母版页时引来的 ...
- jquery获取对象
1.JQuery的核心的一些方法 $("Element").length; ‘元素的个数,是个属性 $("Element").size(); ’也是元素的个数, ...
- java servlet上传文件并把文件内容显示在网页中
servlet3.0(JDK1.6)自带的API即可实现本地文件的上传,Servlet3.0新增了Part接口,HttpServletRequest的getPart()方法取得Part实现对象.下面我 ...
- 【Struts 1】Struts1的基本原理和简介
备注:这里介绍的是Struts1的内容,Struts2的内容,会在后续的博客的予以说明! 一.什么是Struts struts的目标是提供一个开发web应用的开源框架,Struts鼓励基于Model2 ...
- php 几种函数类型
<?php header("Content-type:text/html;charset=utf-8"); $a=; $b=; function demo(){ global ...