爬取晨星所有基金评级

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条,拿到数据就可以去挑选自己喜欢的基金啦~
在这里插入图片描述

如有问题可以关注博主公众号"国韭计算器"

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41832414/article/details/83587950
今日推荐