zoukankan      html  css  js  c++  java
  • 办公自动化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:Users17360Desktop基金业绩对比.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)
    

    有问题欢迎留言哦!~

    ^_^

  • 相关阅读:
    手机缺失sqlite3时操作数据库的多种解决方案 ----adb命令科普
    adb root错误信息adbd cannot run as root in production builds问题解决
    Android Studio中导入v4,v7和recyclerview-v7包的方法
    AndroidStudio项目提交到github最详细步骤
    Android微信开放平台,申请移动应用的 应用签名 如何获取
    利用Intent.ACTION_SEND进行分享
    51nod 1737配对
    UTR#2 T1
    bzoj4571: [Scoi2016]美味
    bzoj2006: [NOI2010]超级钢琴
  • 原文地址:https://www.cnblogs.com/lizitingxue/p/13801155.html
Copyright © 2011-2022 走看看