爬取网站:http://fund.eastmoney.com/data/fundranking.html

爬取目标:采集近1年全部开放基金的排行数据。包括“基金代码”,“基金简称”,“日期”,“单位净值”,“累计净值”,“日增长率”,“近1周”,“近1月”,“近3月”,“近6月”,“近1年”,“近2年”,“近3年”,“今年来”,“成立来”,“手续费”,并存储在CSV文件中。
目标地址:



反爬策略:防盗链
爬取代码:
import requests
import csv
import time
url = 'http://fund.eastmoney.com/data/rankhandler.aspx'
para = {
'op': 'ph',
'dt': 'kf',
'ft': 'all',
'rs': '',
'gs': 0,
'sc': '1nzf',
'st': 'desc',
'sd': '2021-12-29',
'ed': '2022-12-29',
'qdii': '',
'tabSubtype': ',,,,,',
'pi': 1,
'pn': 1000,
'dx': 1,
'v': 0.39490818136479855
}
head = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36',
'Referer': 'http://fund.eastmoney.com/data/fundranking.html'
}
with open(r'.\开放基金排行数据.csv', mode='w+', newline='', encoding='utf-8') as f:
csv_writer = csv.writer(f)
csv_writer.writerow(["基金代码", "基金简称", "日期", "单位净值", "累计净值", "日增长率",
"近1周", "近1月", "近3月", "近6月", "近1年", "近2年", "近3年",
"今年来", "成立来", "手续费"])
for i in range(1, 14):
para['pi'] = i
time.sleep(1)
response = requests.get(url=url, params=para, headers=head)
j = response.text.index('[')
k = response.text.index("]")
s = eval(response.text[j:k + 1])
for r in s:
lst = r.split(',')
e0 = lst[0].rjust(6, '0') + '\t' # 基金代码
e1 = lst[1] # 基金简称
e2 = lst[3] # 日期
e3 = lst[4] # 单位净值
e4 = lst[5] # 累计净值
e5 = lst[6] + "%" if lst[6] != '' else "---" # 日增长率
e6 = lst[7] + "%" if lst[7] != '' else "---" # 近1周
e7 = lst[8] + "%" if lst[8] != '' else "---" # 近1月
e8 = lst[9] + "%" if lst[9] != '' else "---" # 近3月
e9 = lst[10] + "%" if lst[10] != '' else "---" # 近6月
e10 = lst[11] + "%" if lst[11] != '' else "---" # 近1年
e11 = lst[12] + "%" if lst[12] != '' else "---" # 近2年
e12 = lst[13] + "%" if lst[13] != '' else "---" # 近3年
e13 = lst[14] + "%" if lst[14] != '' else "---" # 今年来
e14 = lst[15] + "%" if lst[15] != '' else "---" # 成立来
e15 = lst[19] # 手续费
t = [e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15]
print(t)
csv_writer.writerow(t)
注意:加'\t'是为了解决往.csv文件中保存以0开头的数字字符串问题。
e0 = lst[0].rjust(6, '0') + '\t' # 基金代码
最后结果:
