百度竞价网站谁做,网站建设专业性的评估,wordpress 自定义登录页面,网络推广方案本文介绍基于Python语言#xff0c;自动、定时监测某体检预约网站中指定日期的体检余额#xff0c;并在有体检余额时自动给自己发送邮件提醒的方法。 来到春招末期#xff0c;很多单位进入了体检流程。其中#xff0c;银行#xff08;尤其是四大行#xff09;喜欢“海检”… 本文介绍基于Python语言自动、定时监测某体检预约网站中指定日期的体检余额并在有体检余额时自动给自己发送邮件提醒的方法。 来到春招末期很多单位进入了体检流程。其中银行尤其是四大行喜欢“海检”即差额体检——收到体检不代表录取的那种而正巧我春招主要报名的就是银行、国企等所以单是这周就有4家单位发了体检通知。 其中有的单位需要自费体检。在这周4家单位中交通银行就需自费我报的还是总行呢——关于银行的体检大家可以参考文章建信金融科技软开工程师24届Offer面经https://blog.csdn.net/zhebushibiaoshifu/article/details/135352867。贫穷的我自然想到了直接用我们研究所发的免费体检来充当单位体检了——所里每年上半年会提供1次免费体检的机会往年我都是第一时间就去体检但今年就是想着可以将其充当入职体检所以迟迟没有去。因此这次看到交行的自费体检就想着预约所里给的这个免费体检——等的就是这一天能省则省。但是当我打开所里体检的预约网页后发现我1个堂堂男学生竟然最近几天已经没有体检名额了如下图所示。 但是交行给出的体检报告提交截止时间也比较近所以必须要预约到上图中最近几天的体检因此选择用Python监控这几天的体检名额且若发现最近几天有名额就给我自己发邮件。当然更好、更完整的操作是只要发现最近几天有名额就直接由程序自动实现预约——但一方面这个需求若想实现还得进一步研究后续提交预约时的HTTP请求信息我太菜了这个对我而言可能比较麻烦另一方面在准备开始写脚本时正好收到了中国星网的体检他们是无需自费且提供体检报告的那种体检所以可以直接把星网的体检报告发给交行相当于暂时又用不到所里的体检了。所以我后来也就没再继续探究上述这个更进一步的需求的实现方法——当然后面如果有机会可以再进一步研究一下。 知道了需求即可开始尝试实现。首先虽然所里体检的预约流程主要是在手机上进行的但它也还是一个普通的网页而非小程序较之小程序网页实现起来或许会更容易一些——当然我也没做过小程序的爬虫也并不知道小程序的话到底是会更复杂还是更容易但网页的话至少流程、思路方面还是比较清晰的。 我们先查看上图中所示网页的HTML也就是能显示哪一天是否可预约体检的那个网页的HTML如下图所示。可以看到这个网页的HTML下图并不含有每一天的预约余额信息上图也就是说这些预约余额信息应该是JavaScript动态加载的。 接下来我们按下F12键进入浏览器的开发者工具并选择“Network”随后重新刷新当前网页并观察出现的每一个元素如下图所示。 通过观察找到了具有每天体检余额信息的那1个元素如下图所示。 随后查看这个元素的信息如下图所示。可以看到这是1个POST请求具体的请求Headers也是比较常规的。 这里提一句我一开始看到这个POST请求的Headers具有伪头部也就是上图中右下角紫色框内排在前4个的、Key前带有冒号:的头部说明其是HTTP/2的请求所以当时还以为不能用Python的requests库了然后hyper库又不维护了所以已经准备用HTTPX库来实现需求了。但是后来发现requests库还是可以正常发送请求并获取回复所以最后还是选择用更为方便的requests库了。这里我也不太清楚requests库不支持HTTP/2这句话是如何界定的。 接下来我们首先撰写Python访问网页并获取体检名额余额的代码这一部分代码具体如下。
# -*- coding: utf-8 -*-Created on Thu May 31 22:08:26 2024author: fkxxgis
import smtplib
import requests
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipartdef send_email(subject, body, email_to):smtp_server smtp.qq.comsmtp_port 465email_from 你的发件邮箱password 你的邮箱的授权码不是邮箱密码msg MIMEMultipart()msg[From] email_frommsg[To] email_tomsg[Subject] subjectmsg.attach(MIMEText(body, plain))try:server smtplib.SMTP_SSL(smtp_server, smtp_port)server.login(email_from, password)server.sendmail(email_from, email_to, msg.as_string())server.quit()print(Email sent successfully!)except Exception as e:print(Email sent failed!)url POST请求的链接
url_in 直达预约界面的链接设置这个是为了方便从邮件中直达预约网页
date_need [2024-06-03, 2024-06-04, 2024-06-05]headers {accept: application/json, text/plain, */*,accept-language: en-US,en;q0.9,zh-CN;q0.8,zh;q0.7,content-type: application/json;charsetUTF-8,cookie: 这里cookie太长了我就删除了大家理解即可,origin: https://hosp.etong-online.com,priority: u1, i,referer: https://hosp.etong-online.com/,sec-ch-ua: \Google Chrome\;v\125\, \Chromium\;v\125\, \Not.A/Brand\;v\24\,sec-ch-ua-mobile: ?0,sec-ch-ua-platform: \Windows\,sec-fetch-dest: empty,sec-fetch-mode: cors,sec-fetch-site: same-origin,user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36
}data {batchCode: 3797,unitCode: 0521,institutionCode: 04010802,token: xDMxsuTNeHhY8MbYqKEa9A
}response requests.post(url, headers headers, json data)if response.status_code ! 200:print (Access error!)
else:response_json response.json()for date in date_need:for item in response_json[data]:if item[scheduleDate] date:if item[stockQuantity] ! 0:print(fDate {date} has stock quantity: {item[stockQuantity]})subject f在{date}这天体检有名额了body f目前{date}的体检有{item[stockQuantity]}个名额可以看看要不要预约若需预约请点击{url_in} 。email_to 你的收件邮箱send_email(subject, body, email_to)else:print(fDate {date} has no stock quantity.)break其中代码的大致流程也比较清晰。首先定义send_email()函数用于给自己发送电子邮件该函数需要提供邮件主题、正文和收件人邮箱地址。随后的部分就是发送那个可以返回体检名额余额的POST请求其中的headers部分大家就复制前述浏览器开发者工具中这个请求的Request Headers就好data部分则复制Request Payload就好。 随后遍历指定日期检查每个日期是否有剩余预约名额如果某日期有剩余的预约名额则打印1条消息并通过电子邮件发送通知——邮件中包括具有体检余额的日期、名额数量与预约链接等。这里需要注意如果这个提醒邮件是发给我们个人就需要自己有2个邮箱QQ邮箱1个人可以注册多个域名不同域名的邮箱之间就可以互发邮件——其中一个作为发件地址另一个作为收件地址。 我们如果此时执行上述代码即可看到指定日期内体检名额的剩余情况。其中如下图所示某次执行后发现06月03日这一天有体检的名额了原本写代码时06月03日还是没有名额的这说明有1位同学预约了这一天但是现在取消了。 那么邮箱中就会收到如下图所示的提醒邮件。如果大家开启了类似微信的邮件实时提醒或手机端邮箱APP的应用消息通知那么相当于就是实时接收体检余额的提醒了。 为了方便我们也将体检预约的网页链接放在了邮件中如下图所示点击后即可进入预约。 进入预约网页内发现果然06月03日这一天当前是可以预约的。如果有需要的话此时就可以手动预约了。 当然上述我们是单次执行程序。如果希望可以在后台定时对体检余额加以检测例如我想每隔30分钟就自动查询1次则可以通过如下代码来实现。
# -*- coding: utf-8 -*-Created on Sat Jun 1 16:04:04 2024author: fkxxgis
import time
import datetime
import schedule
import subprocesscount_num 0def run_script():global count_numcount_num 1current_time datetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S)print(fAt {current_time}, the script has been run {count_num} time(s).)result subprocess.run([python, check.py], capture_output True, text True)print(result.stdout)if result.stderr:print(result.stderr)schedule.every(30).minutes.do(run_script)
run_script()while True:schedule.run_pending()time.sleep(1)上述代码通过schedule库使得我们可以每30分钟运行1次run_script()函数而这个函数就是用来执行本文前述的那一段监测余量、发送邮件的代码——也就是上述代码中的check.py文件这里因为我将2个Python代码文件放在同一路径下了所以就用了相对路径。 随后通过手动调用1次run_script()函数使得程序开始时先执行1次查询然后再每隔30分钟查询1次。代码最后进入1个无限循环并在循环中调用schedule.run_pending()函数确保按预定计划运行run_script()函数同时在每1次循环中脚本会休眠1秒钟避免占用太多CPU资源。 完成上述代码后执行这一文件即可看到已经按照要求每隔30分钟查询1次体检余量了。 如果查询过程中发现指定日期出现了体检名额那么和本文前述内容一样程序会自动给我们发邮件提醒我们可以预约了。这里大家可以结合自己的使用场景与个人需求修改每次查询的间隔时间但是建议不要间隔的时间太短否则可能会被网站的服务器屏蔽。 当然还是那句话本文这里的代码只能自动监控余量并加以邮件提醒而没有实现发现余量后自动预约。如果大家感兴趣可以进一步实现自动预约的需求。 至此大功告成。
欢迎关注疯狂学习GIS