Python爬蟲獲取基金變動信息
1 前言
前面文章Python爬蟲獲取基金列表、Python爬蟲獲取基金基本信息我們已經(jīng)介紹了怎么獲取基金列表以及怎么獲取基金基本信息,本文我們繼續(xù)前面的內(nèi)容,獲取基金的變動信息。這次獲取信息的方式將組合使用頁面數(shù)據(jù)解析和api接口調(diào)用的方式進(jìn)行。
2 抓取變動信息
我們通過觀察基金基本信息頁面,我們可以發(fā)現(xiàn)有關(guān)基金變動信息的頁面可以包含以下4個部分:
接下來說一下我們抓取數(shù)據(jù)的思路,在第一個圖中我們已經(jīng)得到了基金的基本信息,變動信息和階段漲幅,但是階段漲幅已經(jīng)在第2個圖中得到了展示,所以在這個圖中,我們只需要獲取實(shí)時的漲跌以及前一日的基金凈值即可。
2.1 基金的變動信息獲取
# 基金的變動信息,我們還是從一個簡單的連接開始,其他基金的獲取方式是和這個類似, # 訪問地址換上其他的基金代碼即可。 http://fund.eastmoney.com/005585.html
這里獲取變動分為兩個部分,一部分是實(shí)時獲取基金的變動新,會發(fā)現(xiàn)凈值估算是過一段時間會發(fā)生變化,通過監(jiān)控瀏覽器的訪問請求記錄,抓取到了這樣一個api訪問,瞬間就樂開了花。
// http://fundgz.1234567.com.cn/js/005585.js
{
'fundcode': '005585',
'name': '銀河文體娛樂混合',
'jzrq': '2021-11-16',
'dwjz': '1.6718',
'gsz': '1.6732',
'gszzl': '0.08',
'gztime': '2021-11-17 15:00'
}
基金代碼和基金名稱可以根據(jù)json返回的內(nèi)容可以知道,但是 jzrq,dwjz,gsz,gszzl,gztime
都是什么意思呢,我仔細(xì)研究了很長時間,結(jié)合頁面上展示的內(nèi)容,再加上dfcf編碼中文拼音的首字母的習(xí)慣,我猜這些字段的意思大致是凈值日期、單位凈值、估算值、估算增長率、估算時間
。我都有點(diǎn)兒沾沾自喜了,竟然破解出來了其中的奧義。
第二部分是獲取基金的單位凈值,這個通過分析發(fā)現(xiàn)數(shù)據(jù)是包含在一個<dl class="dataItem02">
的 html 元素中的,我們獲取的方式是通過 bs4的方式解析返回頁面信息來抓取元素解析dom樹來獲取。
總結(jié)一下就是我們通過 api 接口調(diào)用來獲取基金的實(shí)時變動信息,通過解析返回的 html,解析dom樹來獲取基金的單位凈值信息。以下是第一部分抓取信息的代碼。
# 抓取基金實(shí)時變動信息 resp = requests.get("http://fundgz.1234567.com.cn/js/{}.js".format(code)) # 去除js的呢絨方便進(jìn)行數(shù)據(jù)的json轉(zhuǎn)化 data = resp.text.replace("jsonpgz(", "").replace(");", "") body = json.loads(data) # 輸出獲取到的結(jié)果數(shù)據(jù) print("{} {} 估算值 {} 估算漲跌 {} 估算時間 {}".format(body["fundcode"], body["name"], body["gsz"], body["gszzl"], body["gztime"])) # 請求獲取基金頁面的信息 response = requests.get("http://fund.eastmoney.com/{}.html".format(code)) # 打印原始的請求返回報(bào)文編碼方式 # print(response.apparent_encoding) # 設(shè)置請求的返回內(nèi)容編碼方式,避免出現(xiàn)控制臺亂碼的情況 response.encoding = "UTF-8" resp_body = response.text # 進(jìn)行數(shù)據(jù)的轉(zhuǎn)換和解析 soup = BeautifulSoup(resp_body, 'lxml') # 因?yàn)榇_定了只有一個元素,因此可以使用 find 發(fā)放來獲取數(shù)據(jù),這個就是查找 dl標(biāo)簽,class=dataItem02 的元素 dl_con = soup.find("dl", class_="dataItem02") # 獲取基金凈值的更新時間 value_date = dl_con.find("p").get_text() # 只提取基金數(shù)據(jù)的時間即可 value_date = value_date.replace("單位凈值", "").replace("(", "").replace(")", "") # 凈值數(shù)據(jù)和漲跌百分比數(shù)據(jù)是在dd標(biāo)簽下的兩個p標(biāo)簽中 value_con = dl_con.find("dd", class_="dataNums") data_list = value_con.find_all("span") val_data = data_list[0].get_text() per_data = data_list[1].get_text() print("基金凈值日期 {} 凈值數(shù)據(jù) {} 漲跌百分比 {}".format(value_date, val_data, per_data))
最終,我們通過以上的操作,就可以獲取到基金的變動信息。
2.2 基金階段信息的抓取
基金的階段信息抓取也是采用 bs4 解析頁面數(shù)據(jù)的方式進(jìn)行操作,這里分為三個圖,第一個圖展示的是階段的漲跌信息,第二個和第三個是季度和年度的漲跌信息,因?yàn)樽詈笪覀円M(jìn)行格式化的存儲,對于第一個圖我們可以進(jìn)行結(jié)構(gòu)化行模式存儲,可以做到每天的變化展示,但是二和三我們要采用列模式的存儲,作為一種統(tǒng)計(jì)數(shù)據(jù)進(jìn)行查詢。因?yàn)閮煞N方式的解析方式不同,一圖中的表頭字段在數(shù)據(jù)庫中是作為字段存在的,所以我們不需要關(guān)心,二和三需要獲取表格的表頭進(jìn)行存儲,統(tǒng)計(jì)的事件也是我們存儲的數(shù)據(jù)。再有就是我們不僅要得到基金的基本信息,還要獲取到滬深300的相關(guān)信息,以后方便在做篩選時作為一個強(qiáng)度指標(biāo)進(jìn)行基準(zhǔn)判斷,所以滬深300的數(shù)據(jù)也需要進(jìn)行抓取,這一部分的操作難度不大,主要是在于分析獲取的數(shù)據(jù)方式以及后續(xù)進(jìn)行存儲思路。
我這里是直接獲取頁面所有的table 元素,然后進(jìn)行循環(huán)輸出結(jié)果,然后獲取需要抓取的數(shù)據(jù)在那個下標(biāo)。
這里我就直接貼一下代碼進(jìn)行說明:
# 打印表格 def print_table(head, body): tb = PrettyTable() # 生成表格對象 tb.field_names = head # 定義表頭 tb.add_row(body) print(tb) # 查詢季度 年度數(shù)據(jù) def query_year_quarter(data_list, num): stage_list = data_list.find_all("tr")[0].find_all("th") head_list = [] for nd in stage_list: val = nd.get_text().strip() val = val.replace("季度", "").replace("年度", "").replace("年", "-") if val: # print(nd.get_text()) head_list.append(val) body_list = [] stage_list = data_list.find_all("tr")[num].find_all("td") for nd in stage_list: val = nd.get_text() if "階段漲幅" in val or "滬深300" in val: continue body_list.append(val.replace("%", "")) # 打印表格 print_table(head_list, body_list) # 獲取基金基本信息這里只是貼了部分代碼,需要把獲取凈值部分的信息進(jìn)行組合才能夠運(yùn)行 def query_fund_basic(code="005585", hsFlag=False): # 階段漲幅表頭 stage_head_list = ["stage_week", "stage_month", "stage_month3", "stage_month6", "stage_year", "stage_year1","stage_year2", "stage_year3", ] stage_list = body_list[11].find_all("tr") # 獲取第2個是基金情況 獲取第4個是hs300情況 num = 1 if hsFlag: num = 3 tmp_list = [] for nd in stage_list[num].find_all("td"): val = nd.get_text() if "階段漲幅" in val or "滬深300" in val: continue tmp_list.append(val.replace("%", "")) # 打印階段幅度表格 print("\t------階段漲跌------") print_table(stage_head_list, tmp_list) print("\t------季度漲跌------") query_year_quarter(body_list[12], num) print("\t------年度漲跌------") query_year_quarter(body_list[13], num)
3 最終結(jié)果展現(xiàn)
由于篇幅有限,本次代碼就不在文內(nèi)進(jìn)行展示,后續(xù)我會把內(nèi)容維護(hù)在github上進(jìn)行提供。
到此這篇關(guān)于Python爬蟲獲取基金變動信息的文章就介紹到這了,更多相關(guān)Python獲取信息內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在python2.7中用numpy.reshape 對圖像進(jìn)行切割的方法
今天小編就為大家分享一篇在python2.7中用numpy.reshape 對圖像進(jìn)行切割的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12Python實(shí)現(xiàn)提取或替換PPT中文本與圖片的示例代碼
這篇文章主要為大家詳細(xì)介紹了Python如何實(shí)現(xiàn)提取保存ppt中的圖片和替換ppt模板的文本,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-01-01Python用類實(shí)現(xiàn)撲克牌發(fā)牌的示例代碼
這篇文章主要介紹了Python用類實(shí)現(xiàn)撲克牌發(fā)牌的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06使用Jest?在?Visual?Studio?Code?中進(jìn)行單元測試的流程分析
Jest是一個流行的JavaScript測試框架,它提供了簡潔、靈活和強(qiáng)大的工具來編寫和運(yùn)行單元測試,今天通過本文給大家介紹使用Jest在Visual Studio Code中進(jìn)行單元測試的流程分析,感興趣的朋友跟隨小編一起看看吧2023-07-07python 基于selenium實(shí)現(xiàn)鼠標(biāo)拖拽功能
這篇文章主要介紹了python 基于selenium實(shí)現(xiàn)鼠標(biāo)拖拽功能的方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-12-12詳解Python Pyside6如何準(zhǔn)確嵌入可視化數(shù)據(jù)圖表
Pyside6是一款基于Qt框架的Python GUI開發(fā)庫。它提供了豐富的UI組件和功能,支持多種操作系統(tǒng)。本文主要介紹了Pyside6嵌入可視化數(shù)據(jù)圖表的方法,需要的可以參考一下2023-05-05