本人股坛菜鸡,15年股灾全身而退,是不可能的,亲身上场体验1.0,2.0,3.0版本股灾。终身难忘。
优秀的我最近又兴起了畅游股海的念头,但是为了避免又一次卖血下海的后果,这次打算运用一点python小知识做行情分析,以做波段为主,决不轻易割肉。
一. 数据来源准备
想爬取收集目前A股所有股票的每日行情做分析,首先要找到很全的上市公司股票代码信息,然后通过市面上已有的免费的股票数据api接口获取,接着将获取到的数据进行存储,最后数据存储到一定量后,就可以对数据进行分析。
1. 股票代码
http://www.szse.cn/market/companys/company/index.html
以上交易所网站可以获取到目前A股上所有上市公司股票代码信息。
2. api接口
我所知的接口有新浪、和讯、东方财富网,本文中使用的是东方财富网提供的接口,挺好用的,数据也很全。
测试一下(浏览器输入):
http://nuff.eastmoney.com/EM_Finance2015TradeInterface/JS.ashx?id=6000001
会得到返回结果:
二. 主要模块
这次主要涉及到的模块有requests、pymysql、json这3个。
requests库是一个常用的用于http请求的模块,可以方便的对网页进行爬取,是学习python爬虫的较好的http请求模块。
pymysql是在Python3.x版本中用于连接MySQL服务器的一个库。
Json模块则是提供了把内存中的对象序列化的方法。例如:loads()、dumps()
三. 实现
1. get请求获取数据
import requests
import json
##get方法发送http请求
response = requests.get(url='http://nuff.eastmoney.com/EM_Finance2015TradeInterface/JS.ashx?id=6000001')
##得到response返回信息
shares = response.text
share = json.loads(shares[9:-1])
print(type(share)) ## <class 'dict'>
print(share)
json.loads(shares[9:-1]):由于返回的是string字符类型数据callback(...),所以通过切片将里面的看起来像是字典样式的数据截取出来,再通过json.loads方法转化为dict类型数据。
执行结果:
2. 数据库操作
import pymysql
dbconf = {'host':'127.0.0.1',
'port':3306,
'user':'root',
'password':'root',
'db':'shares', ##库名
'charset':'utf8mb4',
'cursorclass':pymysql.cursors.DictCursor}
def execsql(sql, databaseconf):
'''connect mysql return result'''
try:
conn = pymysql.connect(**databaseconf)
with conn.cursor() as cursor:
try:
cursor.execute(sql)
##执行增删改操作后需要commit
conn.commit()
except Exception as e:
print(e)
cursor.close()
conn.close()
except Exception as e:
print(e)
- conn.cursor()游标
- 需要提前将数据库以及表结构,提前创建好。
执行insert语句即可将数据插入到数据库中:
sql = 'insert into share(name,code) values("浦发银行","600000")'
execsql(sql,dbconf)
3. 其他操作
1) 读取所有股票代码
预先将交易所网上的股票代码下载下来汇总到一个文件中
def share_code():
with open('sh_info.txt', 'rU') as file:
for code in file.readlines():
code_list.append(code.strip())
print(code_list)
2) 处理接口url
由于这个接口分为沪市与深市,区别就在接口url的最后一个字符,1表示沪市、2表示深市。所以需要判断代码前2个字符,为60则是沪市,使用1,其余均使用2。
http://nuff.eastmoney.com/.../JS.ashx?id=6000001
http://nuff.eastmoney.com/.../JS.ashx?id=0000022
if code[:2] == '60':
sh_url = 'http://nuff.eastmoney.com/EM_Finance2015TradeInterface/JS.ashx?id={code}1'.format(code=code)
else:
sz_url = 'http://nuff.eastmoney.com/EM_Finance2015TradeInterface/JS.ashx?id={code}2'.format(code=code)
四. 完成
##所有代码
import requests
import json
import pymysql
code_list = []
dbconf = {'host':'127.0.0.1',
'port':3306,
'user':'root',
'password':'root',
'db':'shares',
'charset':'utf8mb4',
'cursorclass':pymysql.cursors.DictCursor}
def execsql(sql, databaseconf):
'''connect mysql return result'''
try:
conn = pymysql.connect(**databaseconf)
with conn.cursor() as cursor:
try:
cursor.execute(sql)
conn.commit()
except Exception as e:
print(e)
cursor.close()
conn.close()
except Exception as e:
print(e)
def share_code():
with open('sh_info.txt', 'rU') as file:
for code in file.readlines():
code_list.append(code.strip())
print(code_list)
def insert_db(url):
response = requests.get(url)
shares = response.text
share = json.loads(shares[9:-1])
data = share["Value"]
date = data[49][:-9]
sql = 'insert into share(name,code,now,rise,changehands,amplitude,priceearnings,marketrate,date) values("{name}","{code}","{now}","{rise}","{changehands}","{amplitude}","{priceearnings}","{marketrate}","{date}")'.format(name=data[2],code=data[1],now=data[25],rise=data[29],changehands=data[37],amplitude=data[50],priceearnings=data[38],marketrate=data[43],date=date)
execsql(sql,dbconf)
print(sql)
def main():
share_code()
for code in code_list:
if code[:2] == '60':
sh_url = 'http://nuff.eastmoney.com/EM_Finance2015TradeInterface/JS.ashx?id={code}1'.format(code=code)
try:
insert_db(sh_url)
except Exception as e:
print(e)
else:
sz_url = 'http://nuff.eastmoney.com/EM_Finance2015TradeInterface/JS.ashx?id={code}2'.format(code=code)
try:
insert_db(sz_url)
except Exception as e:
print(e)
if __name__=="__main__":
main()
美化封装以上代码,每日下午3点收盘后执行一遍,就可以得到以下结果:
经过一段时间的抓取后,就可以根据喜好分析数据了。
其实这个接口是获取实时数据的,所以,有兴趣的同学可以将获取股票代码的步骤完善一下,直接从交易所网站爬取再处理,达到一键式存储数据,之后再使用numpy、pandas等数据分析模块进行趋势分析。完美。