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)
有问题欢迎留言哦!~
^_^
浙公网安备 33010602011771号