爬取網(wǎng)站:http://fund.eastmoney.com/data/fundranking.html
爬取目標(biāo):采集近1年全部開放基金的排行數(shù)據(jù)。包括“基金代碼”,“基金簡稱”,“日期”,“單位凈值”,“累計(jì)凈值”,“日增長率”,“近1周”,“近1月”,“近3月”,“近6月”,“近1年”,“近2年”,“近3年”,“今年來”,“成立來”,“手續(xù)費(fèi)”,并存儲(chǔ)在CSV文件中。
目標(biāo)地址:
反爬策略:防盜鏈
爬取代碼:
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'.\開放基金排行數(shù)據(jù).csv', mode='w+', newline='', encoding='utf-8') as f:
csv_writer = csv.writer(f)
csv_writer.writerow(["基金代碼", "基金簡稱", "日期", "單位凈值", "累計(jì)凈值", "日增長率",
"近1周", "近1月", "近3月", "近6月", "近1年", "近2年", "近3年",
"今年來", "成立來", "手續(xù)費(fèi)"])
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] # 累計(jì)凈值
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] # 手續(xù)費(fèi)
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開頭的數(shù)字字符串問題。
e0 = lst[0].rjust(6, '0') + '\t' # 基金代碼
最后結(jié)果: