一共两个脚本:

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

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

 __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. oracle登陆的命令是什么?导出数据表的命令是什么?

    登陆的命令: su - oracle sqlplus / as sysdba 导出数据表的命令: exp user/pwd@SID file=path/sth.dmp tables=(table1,t ...

  2. selenium 速查手册 python版

    1.安装与配置 pip install selenium 基本使用selenium都是为了动态加载网页内容用于爬虫,所以一般也会用到phantomjs mac下如果要配置phantomjs环境的话 e ...

  3. onenote网页版如何打开链接弄到客户端

    1.网页登录https://onedrive.live.com 2.登录MS帐号 3.输入复制的分享链接,回车 4.点击编辑,在客户端编辑,弹出是否启动应用,点启动,等一段时间完成.

  4. APP完整的启动流程

    0.加载+load方法 1.执行Main函数 2.执行UIApplicationMain函数. 3.创建UIApplication对象,并设置UIApplicationMain对象的代理.UIAppl ...

  5. Java导出数据为EXCEL的两种方式JXL和POI

    JXL和POI导出数据方式的比较 POI支持excel2003和2007,而jxl只支持excel2003. 下面为测试代码: public class TestCondition { /** * 生 ...

  6. noip2009提高组题解

    NOIP2009题解 T1:潜伏者 题目大意:给出一段密文和破译后的明文,一个字母对应一个密文字母,要求破译一段密文,如果有矛盾或有未出现密文无法破译输出failed,否则输出明文. 思路:纯模拟题 ...

  7. 【Spring 1】Spring简介

    一.Spring简介 首先,Spring框架是由于软件开发的复杂性而创建的.Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Spring的用途不仅仅限于服务器端的开 ...

  8. CSS现代字体栈

    CSS字体栈是一系列的字体,它包含了能在不同操作系统和平台上战士的字体,以尽可能的使排版保持一致性.浏览器会在font-family规定的所有字体中从前往后一次查找,如果找不到当前字体就查找下一个字体 ...

  9. 从汇编层面深度剖析C++虚函数

    文章出处:http://blog.csdn.net/linyt/article/details/6336762 虚函数是C++语言实现运行时多态的唯一手段,因此掌握C++虚函数也成为C++程序员是否合 ...

  10. SQL 数据库 复制 与订阅 实现数据同步

    摘自: http://www.jb51.net/article/18039.htm