akia1412 发表于 2020-8-17 16:14

【爬虫】获取上一交易日沪深股票北向资金信息

本帖最后由 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()
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()
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')
```

三、结果
大概截了个图,就是这样:

大部分需要看的信息都在右边没有截到,可以看上述最后一段代码看表头内容。
缺陷就很明显,尝试过找历史数据,但是没有找到,这个接口只能每天获取前一交易日的数据,局限性就比较大。
初学者,可能有些地方代码写的绕来绕去可渣,请海涵。
最后,好评支持一下吧,谢谢^_^

Jormungand911 发表于 2021-6-20 14:26

突然想到个问题,看过好多爬虫都是爬的天天基金网、东方财富网的数据,很少看到爬富途牛牛数据的,这是富途牛牛数据不好爬么

华爷 发表于 2020-8-18 17:45

{:1_921:}l厉害厉害,准备学习!

wp1402247027 发表于 2020-8-18 20:04

谢谢分享哦~很不错刚好需要。

wanzhenman 发表于 2020-10-2 20:57

楼主@Jack_007 可以获取当天的开盘金额吗??

nicelife729 发表于 2020-10-21 21:15

谢谢分享思路

iomo 发表于 2020-10-22 12:33

l厉害厉害,准备学习!

1427249470 发表于 2020-10-22 15:01

感谢分享,牛皮

朝菌 发表于 2020-10-23 08:43

厉害厉害啊。

feizi2008 发表于 2020-10-23 11:31


谢谢分享哦~很不错刚好需要。

52yxrj 发表于 2020-11-25 05:25

啦咯啦咯啦咯
页: [1] 2 3 4
查看完整版本: 【爬虫】获取上一交易日沪深股票北向资金信息