一. 思路
最近想要自己做個爬取股票信息然後分析的工具。
主要思路是,通過調用東方財富網的接口,獲取所有股票的代碼列表。
然後通過網易財經的股票信息的下載接口獲取股票信息。
數據分析以後再說。
二. 代碼實現
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. 執行後的結果: