办公自动化25-爬取天天基金网站基金的基本信息并格式化输出
import pandas as pd
import requests
from bs4 import BeautifulSoup
import urllib.request
from selenium import webdriver
import re
import time

# 1--从excel获取基金名称列表

key_word_lst = []
#如果多张表需要汇总
# df = pd.read_excel(r"C:\Users\17360\Desktop\基金业绩对比.xlsx",sheet_name= None)
# sheet = list(df.keys())
# for i in range(len(sheet)):
#     key_word_lst = key_word_lst+list(df[sheet[i]].iloc[:,])

#如果单张表
os.getcwd()
df = pd.read_excel('混合型-top基金经理数据 .xlsx ')
key_word_lst = df['基金名称'].to_list()
#为了做示例,我们就少爬一点
key_word_lst = key_word_lst[:3]
key_word_lst

# 2--从网页爬取基金代码(因为要用基金代码作为爬取网站的地址的一部分)

url = 'http://fund.eastmoney.com/data/'
# js_bottom = "var q=document.documentElement.scrollTop=10000"
# result = pd.DataFrame()
code_lst = []
#定义函数
def get_code(key_word_lst):
    browser = webdriver.Chrome()
    browser.get(url)
    time.sleep(3)
    for i in range(len(key_word_lst)):
        browser.find_element_by_xpath('//*[@id="search-input"]').clear()
        browser.find_element_by_xpath('//*[@id="search-input"]').send_keys(key_word_lst[i])#输入框输入关键词
        time.sleep(5)

        # browser.find_element_by_xpath("/html/body/div[3]/div/div/div[1]/div[1]/div/form/div[3]/button").click()
        temp_for_code = browser.find_elements_by_class_name('seaCol1')
        if len(temp_for_code)>=2:
            code_lst.append(temp_for_code[1].text) 
        else:
            code_lst.append(key_word_lst[i])
    return code_lst


#爬取
code_lst = get_code(key_word_lst)
code_lst

# 3--利用code_lst从网站爬取需要的信息

#定义提取函数
def ex_info(ii):    
    url = 'http://fund.eastmoney.com/'+ code_lst[ii]+".html"
    r = requests.get(url)
    time.sleep(10)
    r.encoding = r.apparent_encoding
    html = r.text
    soup = BeautifulSoup(html,'html.parser')

    name = soup.find(name = "div",style="float: left").text[:-7]#基金名称
    mc = soup.find(name = "div",attrs = {"class":"infoOfFund"})#
    gm = mc.find_all("td")[1].text[5:][:-14]#规模
    clr = mc.find_all("td")[3].text[6:]#成立日


    # ulst = []
    for m in mc.children:
        if len(m)!= 0:
            lx = m("a")[0].text#类型 
            jjjl = m("a")[2].text#基金经理
            glr = m("a")[3].text#管理人

    attr = ["dataItem01","dataItem02","dataItem03"]
    #涨跌幅
    lst = [0 for index in range(6)] 
    for i in range(len(attr)):
        info = soup.find(name='dl',attrs={"class":attr[i]})
        lst[i] = info('dd')[1].text[4:]#近1月、6月、3年
        lst[i+3] = info('dd')[2].text[4:]#近3月、1年、成立以来
    final = [code_lst[ii],name,gm,clr,glr,jjjl,lx]+lst
    return final

result = pd.DataFrame(columns=('idx','基金名称','2020-6-30规模(亿元)',"成立日","管理人",
                               "基金经理","类型","近1月","近3月","近6月","近1年","近3年","成立以来"))

for ii in range(len(code_lst)):
    result.loc[ii] = ex_info(ii)
#     print(code_lst[ii])
result

# 4--数据保存

result.to_excel("基金业绩对比汇总.xlsx",index = False)

有问题欢迎留言哦!~

^_^

posted on 2020-10-12 10:05  栗子听雪  阅读(396)  评论(0编辑  收藏  举报