本帖最后由 akia1412 于 2020-8-17 16:47 编辑
一、背景
1、我刚开始学python + 我刚开始学做股票 = 练手项目!
2、爬取网站:Eastmoney
每个交易日日更新上一交易日北向资金信息及三日、五日、月度、季度、年度统计信息
浏览网址:http://data.eastmoney.com/hsgtcg/list.html
二、动手
1、首先通过浏览器F12找到接口,由于发现接口中有token值,因此尝试比对找到源头。
结果在data.eastmoney.com页面源码中找到别的token,尝试后发现也可以接入。
于是第一步就是获取token,代入请求,得到数据response。(请求中的参数已经过多次调试,现在是一次按500条数据分页)
# coding=<encoding name> : # coding=utf-8
import json
import requests
import re
import time
import pandas as pd
from pathlib import Path
from requests.adapters import HTTPAdapter
#模拟请求headers
s = requests.Session()
s.headers = {
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 Edg/84.0.522.40'
}
s.mount('http://', HTTPAdapter(max_retries=3))
s.mount('https://', HTTPAdapter(max_retries=3))
#获取token
tokenurl=s.get('http://data.eastmoney.com/')
s1=re.search("token=.*?&",tokenurl.text,flags=0)
token=s1.group(0).replace("token=","").replace("&","")
#发送请求获取数据
lst = []
page = 0
data = ['1']
while data:
page += 1
url = 'http://dcfm.eastmoney.com/EM_MutiSvcExpandInterface/api/js/get?type=HSGT20_GGTJ_SUM&token='+token+'&st=ShareSZ&sr=-1&ps=500&p='+ str(page)
req = s.get(url,timeout=5)
data = req.json()
lst = lst + data
2、然后就是存数据,我还没学sql,先用pandas处理数据存为csv文件了。
由于数据每天更新,所以每天定时爬取的话,先备份一个文件,再存入新的数据。
#备份源数据,更新加入新数据
df_new = pd.DataFrame(lst)
date = time.strftime("%Y%m%d")
name1 = '北向资金数据备份'+ date + '.csv'
my_file1 = Path('./'+ name1)
name2 = '北向资金数据.csv'
my_file2 = Path('./'+ name2)
if my_file1.is_file():
df_old = pd.read_csv(name1, index_col = 0)
df = pd.concat([df_new, df_old])
elif my_file2.is_file():
df_old = pd.read_csv(name2, index_col = 0)
df_old.to_csv(name1, encoding = 'utf-8-sig')
df = pd.concat([df_new, df_old])
else:
df = df_new
df = df.reset_index(drop =True)
df.to_csv(name2, encoding = 'utf-8-sig')
#改表头、调格式,调完存为新文件
df_ren = df.rename({
'DateType': 'n日数据',
'HdDate': '数据日期',
'SCode': '股票代码',
'SName': '股票名称',
'HYName': '所属行业板块',
'HYCode': '行业板块代码',
'DQName': '所属地区板块',
'DQCode': '地区板块代码',
'NewPrice': '当日收盘价(元)',
'Zdf': '当日涨跌幅(%)',
'Market': '沪市/深市(1or3)',
'ShareHold': '当日持股数(股)',
'ShareSZ': '当日持股市值(元)',
'LTZB': '当日持股流通股占比',
'ZZB': '当日持股总占比',
'LTSZ': '当日流通市值(元)',
'ZSZ': '当日总市值(元)',
'ShareHold_Chg_One':'当期增持股数(股)',
'ShareSZ_Chg_One':'当期增持市值(元)',
'ShareSZ_Chg_Rate_One':'当期市值增减幅',
'LTZB_One':'当期流通股占比变动',
'ZZB_One':'当期总占比变动',
}, axis='columns')
scode = "00000" + df_ren['股票代码'].astype(str)
df_ren['股票代码'] = "'" + scode.str[-6:]
df_ren.to_csv('北向资金数据R.csv', encoding = 'utf-8-sig')
三、结果
大概截了个图,就是这样:
大部分需要看的信息都在右边没有截到,可以看上述最后一段代码看表头内容。
缺陷就很明显,尝试过找历史数据,但是没有找到,这个接口只能每天获取前一交易日的数据,局限性就比较大。
初学者,可能有些地方代码写的绕来绕去可渣,请海涵。
最后,好评支持一下吧,谢谢^_^
|