Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
?本文介紹基于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小時內與您取得聯系。