Python爬蟲獲取基金基本信息
1 前言
上篇文章Python爬蟲獲取基金列表我們已經(jīng)講述了如何從基金網(wǎng)站上獲取基金的列表信息。這一騙我們延續(xù)上一篇,繼續(xù)分享如何抓取基金的基本信息做展示。展示的內(nèi)容包括基金的基本信息,諸如基金公司,基金經(jīng)理,創(chuàng)建時(shí)間以及追蹤標(biāo)、持倉明細(xì)等信息。
2 如何抓取基本信息
# 在這里我就直接貼地址了,這個(gè)地址的獲取是從基金列表跳轉(zhuǎn),然后點(diǎn)基金概況就可以獲取到了。 http://fundf10.eastmoney.com/jbgk_005585.html
基金的詳情頁面和基金的基本信息頁面:


現(xiàn)在我們需要做的事情就是怎么把基金的基本概況數(shù)據(jù)抓取下來,很遺憾,這個(gè)工作不像上次那樣可以直接通過接口調(diào)用的方式獲取結(jié)果,而是需要我們解析頁面html,通過獲取元素來解析我們所需要的信息。這時(shí)我們就需要使用xpath來獲取所需要的元素。
3 xpath 獲取數(shù)據(jù)
解析html 數(shù)據(jù),我們通常使用 xpath 來獲取頁面的數(shù)據(jù),在這里我們也首選這個(gè) xpath,那么怎么使用呢?首先需要安裝相關(guān)的類庫。
# 安裝 lxml pip install lxml
使用瀏覽器打開,然后點(diǎn)擊[檢查]使用選擇基金基本信息,然后如圖所示選擇[copy XPath],可以獲取到數(shù)據(jù)所在的表格位置

from lxml import etree
# ...
# 將返回的數(shù)據(jù)結(jié)果進(jìn)行解析,形成 html 文檔
html = etree.HTML(resp_body)
result = etree.tostring(html, pretty_print=True)
# 打印獲取到的結(jié)果
print(result)
# 抓取數(shù)據(jù)的位置,這個(gè)地方的數(shù)據(jù)是通過瀏覽器的 xpath 定位來確定的
table_body = html.xpath('//*[@id="bodydiv"]/div[8]/div[3]/div[2]/div[3]/div/div[1]/table/tbody')
# 打印數(shù)據(jù)結(jié)果
print(table_body)按照常理來說,這里應(yīng)該可以獲取到基金基本新的結(jié)果,但是萬萬沒想到呀,竟然失算了,獲取到的結(jié)果竟然為空,百思不得其解。我還以為是api使用的不夠熟練,不能正確的獲取,直到我仔細(xì)研究了返回的頁面信息,才看到根本沒有 tbody 這個(gè)元素,可能是瀏覽器渲染后導(dǎo)致的結(jié)果,也就是說通過 xpath 來定位元素位置來獲取數(shù)據(jù)這條路可能不行。事實(shí)上也確實(shí)是如此,基金基本信息的數(shù)據(jù)是放在頁面的 scripts 標(biāo)簽里面的,所以這個(gè)條真的就行不通了??赡芡ㄟ^xpath是配合Selenium一起使用做頁面自動(dòng)化測試的,這個(gè)有機(jī)會(huì)再去研究吧。
4 bs4 獲取數(shù)據(jù)
既然直接獲取頁面元素的方式行不通,那么就只有解析返回頁面來獲取數(shù)據(jù)了,java 語言的話可以使用 joup來解析獲取數(shù)據(jù),但是python又如何來操作呢?這就需要使用 bs4 來解決了。安裝方式如下:
# 簡稱bs4,python解析html非常好用的第三方類庫 pip install beautifulsoup4
其主要使用的解析方法如下圖所示,接下來我們使用lxml來解析html數(shù)據(jù),如何使用html5lib的話,需要先進(jìn)行安裝才能使用 pip install html5lib。

解析數(shù)據(jù)的思路是這樣的,我們看到瀏覽器返回的結(jié)果是包含 table>tr>td 這樣的結(jié)構(gòu),我們先獲取到基金對(duì)應(yīng)信息的table,然后獲取到table中的 td,因?yàn)檫@個(gè)表格展示內(nèi)容是固定的,我們選取對(duì)應(yīng)的數(shù)據(jù)下標(biāo)即可獲取對(duì)應(yīng)的數(shù)據(jù)。
# 解析返回的報(bào)文
soup = BeautifulSoup(resp_body, 'lxml')
# 獲取數(shù)據(jù)的table標(biāo)簽所有數(shù)據(jù)
body_list = soup.find_all("table")
# 基金信息對(duì)應(yīng)的是第二個(gè)
basic_info = body_list[1]
# 打印結(jié)果并循環(huán)輸出td的內(nèi)容
print(basic_info)
td_list = basic_info.find_all("td")
for node in td_list:
? print(node.get_text())這里涉及兩個(gè)方法find_all和get_text,第一個(gè)是元素選擇器,可以根據(jù)標(biāo)簽class進(jìn)行搜索,第二個(gè)是獲取元素中的內(nèi)容。

5 最終結(jié)果展現(xiàn)
經(jīng)常不斷的嘗試,最終的最簡版代碼如下所示:
from lxml import etree
import requests
from prettytable import PrettyTable
import datetime
# 使用BeautifulSoup解析網(wǎng)頁
from bs4 import BeautifulSoup
# 獲取基金基本信息
def query_fund_basic(code):
? ?# http://fundf10.eastmoney.com/jbgk_005585.html
? ?response = requests.get("http://fundf10.eastmoney.com/jbgk_{}.html".format(code))
? ?resp_body = response.text
? ?soup = BeautifulSoup(resp_body, 'lxml')
? ?body_list = soup.find_all("table")
? ?basic_info = body_list[1]
? ?# print(basic_info)
? ?tr_list = basic_info.find_all("td")
? ?# 暫存一下列表
? ?tmp_list = []
? ?tmp_list.append(tr_list[2].get_text().replace("(前端)", ""))
? ?tmp_list.append(tr_list[1].get_text())
? ?tmp_list.append(tr_list[8].get_text())
? ?tmp_list.append(tr_list[10].get_text())
? ?tmp_list.append(tr_list[5].get_text().split("/")[0].strip())
? ?tmp_list.append(tr_list[5].get_text().split("/")[1].strip().replace("億份", ""))
? ?tmp_list.append(tr_list[3].get_text())
? ?tmp_list.append(tr_list[18].get_text())
? ?tmp_list.append(tr_list[19].get_text())
? ?return tmp_list
if __name__ == '__main__':
? ?print("start analyze !")
? ?code_list = ["005585", "000362"]
? ?# 需要關(guān)注的基本信息如右所示 基金代碼 基金名稱 基金公司 基金經(jīng)理 創(chuàng)建時(shí)間
? ?# 基金份額 基金類型 業(yè)績基準(zhǔn) 跟蹤標(biāo)的
? ?head_list = ["code", "name", "company", "manager", "create_time",
? ?"fund_share", "fund_type", "comp_basic", "idx_target"]
? ? # 生成表格對(duì)象
? ?tb = PrettyTable()
? ?tb.field_names = head_list ?# 定義表頭
? ?for node in code_list:
? ? ? tb.add_row(query_fund_basic(node))
? ?# 輸出表格
? ?print(tb)
? ?reslt = str(tb).replace("+", "|")
? ?print(reslt)最終打印的結(jié)果如下所示,感覺很期待:

接來下我們會(huì)利用數(shù)據(jù)庫進(jìn)行存儲(chǔ)基金的基本信息,然后基于此才能抓取基金的變動(dòng)信息進(jìn)行分析,距離激動(dòng)人心的時(shí)刻已經(jīng)很近了。
到此這篇關(guān)于Python爬蟲獲取基金基本信息的文章就介紹到這了,更多相關(guān)Python獲取信息內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pandas的排序、分組groupby及cumsum累計(jì)求和方式
這篇文章主要介紹了pandas的排序、分組groupby及cumsum累計(jì)求和方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
Django自帶的用戶驗(yàn)證系統(tǒng)實(shí)現(xiàn)
這篇文章主要介紹了Django自帶的用戶驗(yàn)證系統(tǒng)實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
python3中利用filter函數(shù)輸出小于某個(gè)數(shù)的所有回文數(shù)實(shí)例
今天小編就為大家分享一篇 python3中利用filter函數(shù)輸出小于某個(gè)數(shù)的所有回文數(shù)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-11-11
python和flask中返回JSON數(shù)據(jù)的方法
下面小編就為大家整理了一篇python和flask中返回JSON數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-03-03
Python實(shí)現(xiàn)孤立隨機(jī)森林算法的示例代碼
孤立森林(isolation?Forest)是一種高效的異常檢測算法,它和隨機(jī)森林類似,但每次選擇劃分屬性和劃分點(diǎn)(值)時(shí)都是隨機(jī)的,而不是根據(jù)信息增益或基尼指數(shù)來選擇。本文將用Python實(shí)現(xiàn)這一算法,需要的可以參考一下2022-03-03
Python猴子補(bǔ)丁知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家分享的是關(guān)于Python猴子補(bǔ)丁知識(shí)點(diǎn)總結(jié),需要的朋友們學(xué)習(xí)下。2020-01-01

