欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python爬蟲獲取基金變動信息

 更新時間:2022年05月05日 16:57:44   作者:??斜月????  
這篇文章主要介紹了Python爬蟲獲取基金變動信息,問基于上一篇文章得內(nèi)容介紹圍繞python的相關(guān)資料展開全文,需要的小伙伴可以參考一下

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)文章

最新評論