?本文介绍基于Python语言,自动、定时监测某体检预约网站中指定日期的体检余额,并在有体检余额时自动给自己发送邮件提醒的方法。
??来到春招末期,很多单位进入了体检流程。其中,银行(尤其是四大行)喜欢“海检”,即差额体检——收到体检不代表录取的那种;而正巧我春招主要报名的就是银行、国企等,所以单是这周就有4家单位发了体检通知。
??其中,有的单位需要自费体检。在这周4家单位中,交通银行就需自费(我报的还是总行呢)。贫穷的我自然想到了直接用我们研究所发的免费体检来充当单位体检了——所里每年上半年会提供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 2024
@author: fkxxgis
"""
import smtplib
import requests
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
def send_email(subject, body, email_to):
smtp_server="smtp.qq.com"
smtp_port=465
email_from="你的发件邮箱"
password="你的邮箱的授权码(不是邮箱密码)"
msg=MIMEMultipart()
msg["From"]=email_from
msg["To"]=email_to
msg["Subject"]=subject
msg.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;q=0.9,zh-CN;q=0.8,zh;q=0.7",
"content-type": "application/json;charset=UTF-8",
"cookie": "这里cookie太长了,我就删除了,大家理解即可",
"origin": "https://hosp.etong-online.com",
"priority": "u=1, 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(f"Date {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(f"Date {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 2024
@author: fkxxgis
"""
import time
import datetime
import schedule
import subprocess
count_num=0
def run_script():
global count_num
count_num +=1
current_time=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(f"At {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次体检余量了。
??如果查询过程中,发现指定日期出现了体检名额,首先,会在Python的编译器中打印指定信息,如下图所示。
??其次,和本文前述内容提到的一样,程序会自动给我们发邮件,提醒我们可以预约了;如下图所示。
??这里大家可以结合自己的使用场景与个人需求,修改每次查询的间隔时间;但是建议不要间隔的时间太短,否则可能会被网站的服务器屏蔽。此外,需要注意这个程序是会持续运行的;如果大家已经成功预约到了,或者说不希望继续监测余量了,那么需要将Python程序关闭。
??当然,还是那句话,本文这里的代码只能自动监控余量并加以邮件提醒,而没有实现发现余量后自动预约。如果大家感兴趣,可以进一步实现自动预约的需求。
??至此,大功告成。
欢迎关注:疯狂学习GIS
每晚20:16,雪球君给您离真相更近的剖析
这些查数据的网址大家都该知道!
......基础版......
1. 融资融券余额:指融资买入股票额与偿还融资额的差额。 两融余额多,代表与更多的杠杆资金流在场内。 余额若增加时,表示投资者心态偏向买方,市场人气旺盛,属强势市场;反之则属于弱势市场。 http://value500.com/rzrj.asp
2. 新增开户数、活跃交易数
毫无疑问,新增开户数,活跃交易数都可以反映出市场活跃的程度。新增开户数增速加快,活跃交易数多,说明市场活跃。 http://value500.com/account.html
3. 证券市场交易结算资金余额及变动情况
同2,直接附网址
http://value500.com/zjye.asp
......进阶版......
4. 股指期货升贴水价格
这个数据可以反映出市场情绪,和大家对未来的预期 https://www.jisilu.cn/data/index_future/
5. 全球行情
国内市场虽然总是特立独行的,但全球行情是需要关注的,随着越来越全球化,资金的轮动效应会越来越明显。 http://finance.sina.com.cn/money/globalindex/
......进阶plus......
6. 大宗交易信息披露
直指大资金入场?可能是吧。 http://www.sse.com.cn/disclosure/diclosure/bl…
7. 龙虎榜,机构买入,证券营业部(大户)成交
更多的是供短线高手来发现庄,跟庄。 http://data.eastmoney.com/soft/stock/lhb.html
本文还待补全,大家有什么好的数据来源欢迎分享! 本文会在球友“翔叔”的首页会长期置顶,不定时添加有用数据,大家可以不定时点去看看。
翔叔是个不错的投资者,雪球君一哥们儿~
PS:
点击“阅读原文”就可以跳转到原文。
文中的所有网址都是可以直接点进去的。
数基金投资对于大家来说并不陌生,尤其对于普通的上班族来说,只要遵循一定的原则,无需太操心也能获得不错的回报。
不过在投资过程中,还是经常需要寻找分析各种数据。下面整理了 16 个适合普通投资者的工具,可以透过数据,更清晰的了解基金估值、资金流动性,以及感受市场的情绪。
先来个全家福:
目前国内指数的研究和制定,主要是由中证指数公司、深圳证券交易所指数机构和上海证券交易所完成的。想要得到最全面的指数信息,可以分别到以下两个官网进行查询。
1.1 中证指数
网址:http://www.csindex.com.cn/
网站里可以查到近 4000 条指数,大家常听到的沪深 300、中证 500、上证 50 等都在这里,这也是国内规模最大、种类最多、市场影响力最大,也是最权威的指数网站之一。
通过网站可以免费查询到指数的多维度信息,以沪深 300 指数为例:包括指数编制方案、行业分布、指数估值、指数成份股、该指数的相关基金等等。
在首页—>下载中心—>每日板块中可以查看到 11 个主流的板块估值信息。
关于指数成份调整的公告也会第一时间在这里公布,能让投资者了解到指数的一手信息。有什么不确定的指数基金调整新闻,上这个网站查查准没错。
1.2 深证、国证指数
网址:http://www.cnindex.com.cn/
这是深圳证券交易指数机构的官网,收录了超过 900 条指数。同样能够提供指数历年走势、成分权重、年化收益率以及与指数有关的基金产品列表等数据。
有部分指数,如央视指数、国证指数等,在中证指数公司查不到,那么多数情况下会在这里。
通过这两个官网,几乎能找到市场上超过 99%的指数基础信息,基本上能够满足大部分指数投资者的需求。
做投资就离不开对于估值的研究,低估买入,高估卖出是最简单的交易逻辑。目前有很多平台都有指数估值的工具。
上面两个网站虽然能查到,但是体验不是那么友好,所以可以根据自己的喜好选择一个其他平台来查询。
2.1 且慢估值
通过且慢的公众号和小程序都可以找到这个工具,也可以通过下面的链接直接访问。
https://qieman.com/idx-eval?utm_source=qmwx
指数估值高、中、低用红、黄、绿三个颜色来表示,比较清晰明了。
2.2 蛋卷基金 APP
https://danjuanfunds.com/djmodule/value-center
蛋卷是雪球旗下的基金投资平台,首页直接就能看到有“估值”这个栏目,直接点击进去就能看到详细的估值信息。
2.3 理杏仁
https://www.lixinger.com/analytics/company/dashboard/mutual-market/ha
相比上面两个工具,理杏仁提供的数据更加全面,个股、行业、指数的历史市盈率、市净率、市销率、股息率、PEG 等多种估值模型指标,而且数据平台的可视化图形界面非常直观,不过只提供 7 天的免费试用,之后需要付费(价格也还亲民),适合更高阶的投资者。
2.4 集思录
https://www.jisilu.cn/data/etf/#index
集思录最逆天的功能就是其数据功能,共包含:可转债、债券、分级基金、A 股/港股打新、指数 ETF、封基(比如兴全合宜)、REITS、股息率、各种套利等各个板块。
这里需要说明一下,同样的产品各个软件给出的估值不一样。估值,没有绝对的正确与否,更多是一种模糊的正确。还需结合个人的风险偏好来判断最后的决策。
3.1 北向资金流向
http://data.eastmoney.com/hsgt/index.html
北向资金指的是:沪港通和深港通买入资金之和,就是通过香港交易所买入内地的股票的资金。(因为中国的外汇和资本市场都是管制的,外国的资金并不能直接投资 A 股)
那么为什么要看北向资金呢?那是因为北向资金一直以来都被看作聪明的资金,北向资金的构成主要是以香港和国外的投资者为主,其中也不乏国内资金的马甲。
显然这些投资者的经验更丰富,他们买得早,跑得也快,几乎每次都会领先一步。那么跟随有经验的人,自然是比较正确的道路。
另外,这个数据也可以通过东方财富 APP->行情->沪深港通来查看。
长期投资看的是估值,而短期市场的走势更取决于流动性和情绪,下面的一些工具,可以探测市场的投资情绪。
4.1 两融余额查询
http://data.eastmoney.com/rzrq/total.html
两融余额即融资融券余额(具体概念可以关注后回复“融资融券”了解),这是一个非常有意思的量化情绪指标,主要是看还有多少杠杆资金在场内。15 年顶点是 2 万亿左右,而最近已经频繁突破 1 万亿了。
也可以通过东方财富 APP->行情->融资融券查看
4.2 A 股最新开户账号数据
http://data.eastmoney.com/cjsj/gpkhsj.html
可以很直观的量化市场情绪,当市场情绪特别高涨的时候,往往会有许多人争先恐后的来开户,想借此机会赚上一笔。
不过这个数据不是实时的,目前是 7 月,只能看截止到 5 月数据。
4.3 全国股票交易
http://data.eastmoney.com/cjsj/gpjytj.html
可以看到 A 股全部交易量,缺点也是不实时,前是 7 月,只能看截止到 6 月数据。
除了这两个,还有交易户数、持仓户数、换手率、银证结算资金进出数等,这种属于市场交易的最真实数据,能最直观判断市场风向,普通投资者却很难免费查到。
4.4 搜索指数
除上面的数据外,通过相关热词的搜索指数,也能推测大致的趋势。
微信指数
在微信中搜索“微信指数”,输入想查找的关键词,就可以知道这个词的热度。
百度指数
http://index.baidu.com/v2/index.html
可以添加多个对比词,网页版更方便。
5.1 A50 指数期货
http://cn.investing.com/indices/china-a50
A50 期货(具体概念可以关注后回复“A50”了解)的主要投资者是国际投资者,加上 A50 指数期货的交易时间原因,能及时反映国际投资者对重要消息的反应,甚至提前抢跑。
A 股投资者也可以把 A50 期货作为市场的重要参考,灵活地安排自己的资金及操作计划。
5.2 全球指数行情
http://finance.sina.com.cn/money/globalindex
重点关注欧洲和北美的数据,很长一段时间我大 A 基本上都跟随隔夜美股走势。
5.3 宏观经济数据网站
https://zh.tradingeconomics.com/
可以查到世界各国的经济数据,包括美国、欧洲、东南亚、非洲兄弟,还可以查到当前各种货币的汇率。
6.1 免费个股研报
https://marketing.eastmoney.com/channel/m/research_report/index.html
查询个股最新研报,投资指数基金的,可以偶尔看看新进的成分股。
也可以访问下面的链接,将 600030 换成你想查询的个股代码。
http://data.eastmoney.com/report/600030.html
6.2 萝卜投研
https://robo.datayes.com/
既有 APP 又有网页版,免费、并且体验非常友好,除了看研报、还可以看数据、做投资分析,主要是免费的,双手点赞。
工具虽好,但也要用好。
提高认知,知行合一,让我们一起慢慢变富!
*请认真填写需求信息,我们会在24小时内与您取得联系。