一. 思路
最近想要自己做个爬取股票信息然后分析的工具。
主要思路是,通过调用东方财富网的接口,获取所有股票的代码列表。
然后通过网易财经的股票信息的下载接口获取股票信息。
数据分析以后再说。
二. 代码实现
1. 代码结构如下:
2. clsDir.py(创建目录)
def mkdir(path):
# 引入模块
import os
# 去除首位空格
path = path.strip()
# 去除尾部 \ 符号
path = path.rstrip("\\")
# 判断路径是否存在
# 存在 True
# 不存在 False
isExists = os.path.exists(path)
# 判断结果
if not isExists:
# 如果不存在则创建目录
# 创建目录操作函数
os.makedirs(path)
print
path + ' 创建成功'
return True
else:
# 如果目录存在则不创建,并提示目录已存在
print
path + ' 目录已存在'
return False
3. stockList.py(获取股票对应代码)
import requests
from fake_useragent import UserAgent
import re
import csv
import clsDir
def getHtml(url):
r = requests.get(url, headers={
'User-Agent': UserAgent().random,
})
r.encoding = r.apparent_encoding
return r.text
stockUrl = 'http://86.push2.eastmoney.com/api/qt/clist/get?cb=jQuery1124064028201763104_1562133297741&pn=1&pz=100000&po=0&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&fid=f12&fs=m:0+t:6,m:0+t:13,m:0+t:80,m:1+t:2&fields=f12,f14&_=1562133297790'
PATTERN_STOCK = "},{"
if __name__ == '__main__':
# 创建目录
mkpath = "D:\\Stock"
# 调用函数
clsDir.mkdir(mkpath)
html = getHtml(stockUrl)
reslist = re.split(PATTERN_STOCK, html.replace("\"", "").replace("}]}});",""))
# 数据清洗:去掉非个股,个股以6(沪市),0(深市),3(创业板)开头
datalist = reslist[:]
for res in reslist:
if not res.startswith('f12'):
datalist.remove(res)
continue
res = res.replace("f12:", "").replace("f14:", "")
if not (str(res[1]).startswith('6') or str(res[1]).startswith('3') or str(res[1]).startswith('0')):
datalist.remove(res)
f = open('D:/Stock/stock.csv', 'w+', encoding='utf-8', newline="")
writer = csv.writer(f)
writer.writerow(('名称', '代码'))
for data in datalist:
stock = data.replace("f12:", "").replace("f14:", "").split(",")
writer.writerow((stock[1].replace("*",""), stock[0]))
f.close()
4.stockInfo.py(通过股票代码,下载股票信息)
import csv
import urllib.request as r
import threading
import clsDir
# 读取之前获取的个股csv丢入到一个列表中
def getStockList():
stockList = []
f = open('D:/Stock/stock.csv', 'r', encoding='utf-8')
f.seek(0)
reader = csv.reader(f)
for item in reader:
stockList.append(item)
f.close()
return stockList
def downloadFile(url, filepath):
try:
r.urlretrieve(url, filepath)
except Exception as e:
print(e)
print(filepath, "is downloaded")
pass
# 设置信号量,控制线程并发数
sem = threading.Semaphore(100)
def downloadFileSem(url, filepath):
with sem:
downloadFile(url, filepath)
urlStart = 'http://quotes.money.163.com/service/chddata.html?code='
urlEnd = '&end=20190701&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;VOTURNOVER;VATURNOVER'
if __name__ == '__main__':
# 创建目录
mkpath = "D:\\Stock\\StocksInfo"
# 调用函数
clsDir.mkdir(mkpath)
stockList = getStockList()
stockList.pop(0)
for s in stockList:
scode = str(s[1])
# 0:沪市;1:深市
url = urlStart + ("0" if scode.startswith('6') else "1") + scode + urlEnd
filepath = 'D:/Stock/StocksInfo/' + (scode + '_' + str(s[0])) + '.csv'
threading.Thread(target=downloadFileSem, args=(url, filepath)).start()
三. 测试执行
1. 生成EXE
1.1. 安装pyinstaller
执行:
pip install pyinstaller
1.2. 打包生成exe
基本语法:
pyinstaller options myscript.py
常用的可选参数如下:
--onefile 将结果打包成一个可执行文件
--onedir 将所有结果打包到一个文件夹中,该文件夹包括一个可执行文件和可执行文件执行时需要的依赖文件(默认)
--paths=DIR 设置导入路径
--distpath=DIR 设置将打包的结果文件放置的路径
--specpath=DIR 设置将spec文件放置的路径
--windowed 使用windows子系统执行,不会打开命令行(只对windows有效)
--nowindowed 使用控制台子系统执行(默认)(只对windows有效)
--icon=<FILE.ICO> 将file.ico添加为可执行文件的资源(只对windows有效)
如pyinstaller --paths="D:\Queena" guess_exe.py
将stockList和stockInfo分别打包:
(venv) D:\workspace-python\stock\sun>pyinstaller -F stockList.py
(venv) D:\workspace-python\stock\sun>pyinstaller -F stockInfo.py
2. 执行后的结果: