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)
有问题欢迎留言哦!~
^_^