1. 程式人生 > >爬取晨星所有基金評級

爬取晨星所有基金評級

Python爬取晨星基金評級

晨星評級介紹

晨星把每隻具備3年以上業績資料的基金歸類,在同類基金中,基金按照“晨星風險調整後收益”指標(Morningstar Risk-Adjusted Return)由大到小進行排序:前10%被評為5星;接下來22.5%被評為4星;中間35%被評為3星;隨後22.5%被評為2星;最後10%被評為1星。
在這裡插入圖片描述

目標網站介紹

基金評級網址:http://cn.morningstar.com/fundselect/default.aspx
指定頁面的功能區比較多,本文只爬取程式碼、基金名稱、基金分類、晨星評級(三年)、晨星評級(五年)、今年以來彙報(%)。
在這裡插入圖片描述

網站原始碼分析

該網站每頁預設顯示25行,只是會影響爬取效率,暫時不關注。
點選頁碼發現網址並沒有發生變化,檢查原始碼後發現每頁的資訊都儲存在原始碼裡面,所有資訊都在兩個類裡面[‘gridItem’, ‘gridAlternateItem’],所以用selenium模擬翻頁,然後用BeautifulSoup把目標資訊爬下來即可。

安裝並匯入python包

import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.common.by import By
import time
import re
import pandas as pd
import pymysql

selenium 安裝比較複雜
1、pip install selenium
2、安裝對應的瀏覽器驅動,我安裝的是chromedriver.exe
3、試用開啟網站

html = 'http://cn.morningstar.com/fundselect/default.aspx'
browser = webdriver.Chrome('C:/Users/user/Anaconda3/driver/chromedriver.exe')
browser.get(html)

爬取資訊


#定義起始頁碼
page_num = 1

#連線資料庫
connect  = pymysql.connect(host = '127.0.0.1', user = 'root', password = 'admin', db = 'stock', charset = 'utf8')
cursor = connect.cursor()

#爬取共306頁
while page_num <= 306:
    #列表用於存放爬取的資料
    code_list = []	#基金程式碼
    name_list = []	#基金名稱
    fund_cat = []	#基金分類
    fund_eval_3 = []	#晨星評級(三年)
    fund_eval_5 = []	#晨星評級(五年)
    return_curr_y = []	#今年以來彙報(%)
    #獲取每頁的原始碼
    data = browser.page_source
    #如果網頁沒載入完成,則再等待60秒
    if data == None:
        time.sleep(60)
        data = browser.page_source
    #利用BeautifulSoup解析網頁原始碼
    bs = BeautifulSoup(data, 'lxml')
    class_list = ['gridItem', 'gridAlternateItem']      #資料在這兩個類下面
    
    #取出所有類的資訊,並儲存到對應的列表裡
    for i in range(len(class_list)):
        for tr in bs.find_all('tr', {'class': class_list[i]}):

            tds_text = tr.find_all('td', {'class': "msDataText"})
            tds_nume = tr.find_all('td', {'class': "msDataNumeric"})
            code_list.append(tds_text[0].find_all('a')[0].string)
            name_list.append(tds_text[1].find_all('a')[0].string)
            fund_cat.append(tds_text[2].string)
            fund_eval_3.append(re.search('\d', tds_text[3].find_all('img')[0]['src']).group())
            fund_eval_5.append(re.search('\d', tds_text[4].find_all('img')[0]['src']).group())
            return_curr_y.append(tds_nume[3].string)
    
    #插入資料到資料庫
    fund_df = pd.DataFrame({'fund_code': code_list, 'fund_name': name_list, 'fund_cat': fund_cat, 'fund_lvl_3':fund_eval_3, 'fund_lvl_5': fund_eval_5, 'return_y_pct': return_curr_y})
    sql_insert = "insert into fund_morningstar_lvl(`fund_code`, `fund_name`, `fund_cat`, `fund_lvl_3`, `fund_lvl_5`, `return_y_pct`) values(%s, %s, %s, %s, %s, %s)"
    fund_list = fund_df.values.tolist()
    cursor.executemany(sql_insert, fund_list)
    connect.commit()

    ##找到換頁按鈕然後點選
    next_page = browser.find_element_by_link_text('>')
    next_page.click()
    page_num += 1
    time.sleep(5)
    
connect.close()

爬取結果

共爬取結果7627條,拿到資料就可以去挑選自己喜歡的基金啦~
在這裡插入圖片描述

如有問題可以關注博主公眾號"國韭計算器"

在這裡插入圖片描述