做網(wǎng)站宣傳圖片google全球推廣
1. 對東方財富官網(wǎng)的分析
步驟:
- 通過刷新網(wǎng)頁,點擊等操作,我們發(fā)現(xiàn)https://datacenter-web.eastmoney.com/api/data/v1/get?請求后面帶著一些參數(shù)即可以獲取到相應(yīng)數(shù)據(jù)。
- 我們使用python來模擬這個請求即可。
我們以如下選擇的頁面為切入點,以此獲取當(dāng)前所有A股的一些基本數(shù)據(jù)。
通過F12調(diào)出瀏覽器調(diào)試框,對該網(wǎng)站的數(shù)據(jù)拉取協(xié)議為參考,然后通過python模擬此類請求,進(jìn)行獲取數(shù)據(jù),如下圖所示:
主要代碼如下:
import pandas as pd
from typing import List
import requests, jsonclass CustomedSession(requests.Session):def request(self, *args, **kwargs):kwargs.setdefault('timeout', 60)return super(CustomedSession, self).request(*args, **kwargs)MAX_CONNECTIONS = 50
session = CustomedSession()
adapter = requests.adapters.HTTPAdapter(pool_connections = MAX_CONNECTIONS,pool_maxsize = MAX_CONNECTIONS,max_retries = 5)
session.mount('http://', adapter)
session.mount('https://', adapter)# 請求地址
QEURY_URL = 'http://datacenter-web.eastmoney.com/api/data/v1/get'# HTTP 請求頭
EASTMONEY_REQUEST_HEADERS = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko','Accept': '*/*','Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',# 'Referer': 'http://quote.eastmoney.com/center/gridlist.html',
}# 請求返回值過濾
RESULT_FIELDS = {'SECURITY_CODE': '股票代碼','SECURITY_NAME_ABBR': '股票名稱','END_DATE': '本次股東戶數(shù)統(tǒng)計截止日','PRE_END_DATE': '上次股東戶數(shù)統(tǒng)計截止日','INTERVAL_CHRATE': '區(qū)間漲跌幅','AVG_MARKET_CAP': '戶均持股市值','AVG_HOLD_NUM': '戶均持股數(shù)量','TOTAL_MARKET_CAP': '總市值','TOTAL_A_SHARES': '總股本','HOLD_NOTICE_DATE': '公告日期','HOLDER_NUM': '本次股東戶數(shù)','PRE_HOLDER_NUM': '上次股東戶數(shù)','HOLDER_NUM_CHANGE': '股東戶數(shù)增減','HOLDER_NUM_RATIO': '股東戶數(shù)較上期變化百分比', 'f2': '最新價','f3': '漲跌幅百分比',
}# 請求頁碼
QEURY_PAGE = 1
# 請求參數(shù)
QUERY_PARAM = [('sortColumns', 'HOLD_NOTICE_DATE,SECURITY_CODE'),('sortTypes', '-1,-1'),('pageSize', 500),('pageNumber', QEURY_PAGE),('columns', 'SECURITY_CODE,SECURITY_NAME_ABBR,END_DATE,INTERVAL_CHRATE,AVG_MARKET_CAP,AVG_HOLD_NUM,TOTAL_MARKET_CAP,TOTAL_A_SHARES,HOLD_NOTICE_DATE,HOLDER_NUM,PRE_HOLDER_NUM,HOLDER_NUM_CHANGE,HOLDER_NUM_RATIO,END_DATE,PRE_END_DATE',),('quoteColumns', 'f2,f3'),('source', 'WEB'),('client', 'WEB'),('reportName', 'RPT_HOLDERNUMLATEST'),
]"""
獲取滬深A(yù)股市場最新公開的股東數(shù)目變化情況: 當(dāng)作獲取所有股票
ParametersNoneReturnsDataFrame
"""
def get_latest_holder_number() -> pd.DataFrame:global QEURY_PAGEQEURY_PAGE = 1PAGE_COUNT = 100dfs: List[pd.DataFrame] = []while 1:if QEURY_PAGE > PAGE_COUNT:breakparams = tuple(QUERY_PARAM)response = session.get(QEURY_URL, headers=EASTMONEY_REQUEST_HEADERS, params=params)resultJson = response.json()PAGE_COUNT = resultJson.get('result').get('pages')if PAGE_COUNT is None:breakdata = resultJson.get('result').get('data')if data is None:breakdf = pd.DataFrame(data)df = df.rename(columns=RESULT_FIELDS)[RESULT_FIELDS.values()]dfs.append(df)QEURY_PAGE += 1if len(dfs) == 0:df = pd.DataFrame(columns=RESULT_FIELDS.values())return dfdf = pd.concat(dfs, ignore_index=True)return dfif __name__ == "__main__":data = get_latest_holder_number()print(data)
調(diào)用如上函數(shù)即可:
更多內(nèi)容:【爬蟲】爬取A股數(shù)據(jù)系列