ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

以Python为例查询学校图书馆剩余书籍信息,挂在云服务器上并定时发送邮件提醒

2021-03-07 12:31:42  阅读:287  来源: 互联网

标签:请求 为例 Python smtp 查询 json mail 服务器 id


目录

前言

最近想从图书馆里借一本书,可是图书馆里那两本书都借走了,其中有一本书在3月3号到期应还,所以我想着这几天那个人应该会来图书馆还书,所以我写了个python脚本,放在服务器上,每隔一段时间查询,如果那人还书了,邮件通知我。这样我就可以及时借书了,哈哈。

使用的工具:
谷歌浏览器;Python3.8 ,云linux服务器

所需知识:
浏览器开发者工具的基本使用;http get请求;json处理;smtp邮件发送;linux服务器crontab的使用



分析web页面

判断数据加载方式

找到需要分析的web页面,打开浏览器的开发者工具,刷新。
这是我学校图书馆网址:图书馆书籍查询
分析web页面
上图展示的是我要查询的书(《tensorflow从零开始学》),第二个标注的是书的存在状态。

页面有了,于是开始分析这些信息是怎么来的。

幸运的是,书的存在状态是网页通过AJAX获取的json来加载信息。下一标题会展示我是怎么找数据的。分析json信息即可得到所需数据(因为数据是后来加载的,可以先把网页下载下来,看看有没有信息,没有的话,就是后期js获取的)
如果服务器直接返回的页面直接包含所需数据,那就比较麻烦了,需要分析html页面,不过也简单,以前用java的jsoup工具分析html比较好用,Python应该也有处理html的库,初学python,不大熟悉。

回归正题
js获取的内容可以在谷歌浏览器的开发者面板里,找到Network,再选择XHR。如下图
在这里插入图片描述
列表里展示的是这个页面所有的js请求

分析js请求

通过枯燥乏味的寻找(一定要耐心寻找,这是最耗时间的地方),我终于找到一个请求,里面是json信息,如下图
在这里插入图片描述
可以看到第四个js请求中返回的是json数据,json数据中有我需要的信息

分析http请求

切换到header选项,如下图
http请求
你会发现请求方式为Get请求,参数为如下图所示
在这里插入图片描述
一看就知道bookrecnos为请求书目的id,想查什么数目就加上数目id参数

然后返回的是json格式数据,我把json数据复制到csdn的json解析工具里(什么json解析工具无所谓。我只是为了方便看json信息,我用的是CSDN插件中json工具,使用方便一些),如下图
在这里插入图片描述
左侧为原本数据,右侧为json工具处理的,是不是清爽了许多?

分析json数据

可以看到key为previews里面有书籍信息,我们要查找的数目id为1901457577
找id的话的可以使用我的方法,使用小箭头点击图片,图片里有bookrecno属性,values为我们查询数目的id,如下图
在这里插入图片描述
1901457577里面有多组信息,因为我们学校有多个校区,所以展示的是多个校区的查询结果,我们只要青岛校区的数据,数据如下:

"1901445771": 
      {
        "bookrecno": 1901445771,
        "callno": "TP183/147",
        "curlib": "01000",
        "curlibName": "青岛校区",
        "curlocal": "QZKK",
        "curlocalName": "青岛自科书库",
        "copycount": 2,
        "loanableCount": 0,
        "shelfno": null,
        "barcode": "4634944"
      },

copycount为总共的书的存量
loanableCount为剩余书的存量

现在已经知道json的数据存放位置,下面开始进行写python脚本


编写Python脚本

我自学的第一门语言是java,其实java也可以,但是由于在学深度学习,现在以后主要学习python,所以这次我尝试使用Python工具来编写脚本

导入需要的库

import requests
import json
import smtplib
import datetime
from email.mime.text import MIMEText
from email.header import Header

这些库都是平常使用的,requests库用来发送get请求,json库来解析json数据,smtplib来进行数据发送。email路用来编写邮件内容

发送get请求

#要查询的数目id
id=["1901457577"]#可以为多个数目,我只想查询一个书
#参数params为字典类型,“bookrecnos”为查询的数目id,想查询多个数目的话,以逗号隔开(这里只想查询一个书)
params={"bookrecnos":id,"return_fmt":"json"}
response=requests.get("http://interlib.sdust.edu.cn/opac/book/holdingPreviews",params=params)

使用requests.get()发送get请求

解析json

使用json.loads()方法返回的是字典,
JSON 解码为 Python 类型转换对应表:
在这里插入图片描述

json=json.loads(response.text)
#previews是字典,里面key为刚才查询参数带的书的id
preview=json["previews"]
#要id为1901457577的数目
book_info=preview[id[0]]
#从book_info列表中挑选含有“青岛校区”的字典
book={}
for i in book_info:
    school=i["curlibName"]
    if school== "青岛校区":
        book=i
        break #如果找到 青岛校区,直接跳出循环
count=book["copycount"]#共有几本书
remainCount=book["loanableCount"]#剩余几本书

smtp发送邮件

我用的163邮箱发送到我的qq邮箱,
你需要在163邮箱中申请一个授权码,获取授权码的方式可以百度一下,这里不做叙述

#如果有书,则发送邮件通知我
if count>0 and remainCount==0:
    message="id为{0}的书,现有{1}本,总共有{2}本,当前时间:{3}".format(id[0],remainCount,count,datetime.datetime.now())
    print(message)
    # 第三方 SMTP 服务
    mail_host="smtp.163.com"  #设置服务器
    mail_user="XXXXXXX@163.com"    #用户名,你想使用什么邮箱发送信息
    mail_pass="XXXXXXXXXXX"   #口令,邮箱授权码     
    sender = 'XXXXXXX@163.com'
    receivers = ['XXXXXXXX@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
    
    mess = MIMEText(message, 'plain', 'utf-8')  
    subject = "图书查询结果"
    mess['Subject'] = Header(subject, 'utf-8')
    mess['From'] = sender
    mess['To'] =receivers[0]
    smtp = smtplib.SMTP_SSL(mail_host, 994)
    try:
        smtp.login(mail_user,mail_pass)
        smtp.sendmail(sender, receivers, mess.as_string())
        print ("邮件发送成功")
    except smtplib.SMTPException as e:
        print ("Error: 无法发送邮件")
        print(e)
    finally :
       smtp.close
else:
    print("没有剩余的书了")
print("程序执行完成...")

注意:

  1. from 和to一定要这么写:

     	mess['From'] = sender
        mess['To'] =receivers[0]
    

    不然会被163判断为垃圾邮件,发不出去。

  2. 使用SMTP_SSL

    smtp = smtplib.SMTP_SSL(mail_host, 994)
    

    其实本来我写的是smtp = smtplib.SMTP(mail_host, 25)
    windows下编写的时候能用,但是我放到服务器运行不能用,可能是服务器端口的问题吧。使用SMTP_SSL()万无一失。



这是我写的脚本文件,可以下载。
bookSearch.py



云服务器运行

将.py文件上传至服务器

设置linux中crontab定时任务

使用crontab -e来编辑定时任务

crontab -e

在这里插入图片描述

*/10 8-22 * * * python3 /data/python_proj/library/bookSearch.py

我设置的是8点至22点,每10分钟发查询一次

crontab的具体使用可以参考这篇文章:Linux crontab命令的使用方法

然后重启crontab服务就可以了

总结

举一反三,可以去查询网络上的其他信息。使用的方法比较简单,但是很实用。对我讲的不清楚的地方可以留言,我一定会回复的。
这应该是目前为止写过的最长最认真的一篇的文章,如果写的还行的,可以点赞支持一下,如果大家觉得写的不好的话可以在评论区的留言,感谢大家的支持。

标签:请求,为例,Python,smtp,查询,json,mail,服务器,id
来源: https://blog.csdn.net/Crayonxin2000/article/details/114477823

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有