python把網易財經的股票資訊 財務報表入庫(MySQL)
還是跟著@Jack-Cui老哥教程跟著編的爬蟲,稍微改動了下,主要是mysql的插入方式,我使用了lazyspider的方法,不需要手動擼sql語句,還用的progressbar模組,可以顯示進度條(不過不能再cmd用!!)
原網址:https://blog.csdn.net/c406495762/article/details/77801899
要點:1.eval()可以把字串符變為 變數
2.利用迴圈生成建立表格的sql語句
3.lazystore的使用
4.progressbar模組生成進度條
程式碼如下
#-*- coding:UTF-8 -*-
import sys
import requests
from bs4 import BeautifulSoup
import re
from lazyspider.lazystore import LazyMysql
import time
from progressbar import *
class FinancialData():
def __init__(self):
# 伺服器域名
self.server = 'http://quotes.money.163.com/'
self.cwnb = 'http://quotes.money.163.com/hkstock/cwsj_'
# 主要財務指標
self.cwzb_dict = {'EPS': '基本每股收益', 'EPS_DILUTED': '攤薄每股收益', 'GROSS_MARGIN': '毛利率',
'CAPITAL_ADEQUACY': '資本充足率', 'LOANS_DEPOSITS': '貸款回報率', 'ROTA': '總資產收益率',
'ROEQUITY': '淨資產收益率', 'CURRENT_RATIO': '流動比率', 'QUICK_RATIO': '速動比率',
'ROLOANS': '存貸比', 'INVENTORY_TURNOVER': '存貨週轉率', 'GENERAL_ADMIN_RATIO': '管理費用比率',
'TOTAL_ASSET2TURNOVER': '資產週轉率', 'FINCOSTS_GROSSPROFIT': '財務費用比率', 'TURNOVER_CASH': '銷售現金比率',
'YEAREND_DATE': '報表日期'}
# 利潤表
self.lrb_dict = {'TURNOVER': '總營收', 'OPER_PROFIT': '經營利潤', 'PBT': '除稅前利潤',
'NET_PROF': '淨利潤', 'EPS': '每股基本盈利', 'DPS': '每股派息',
'INCOME_INTEREST': '利息收益', 'INCOME_NETTRADING': '交易收益', 'INCOME_NETFEE': '費用收益',
'YEAREND_DATE': '報表日期'}
# 資產負債表
self.fzb_dict = {
'FIX_ASS': '固定資產', 'CURR_ASS': '流動資產', 'CURR_LIAB': '流動負債',
'INVENTORY': '存款', 'CASH': '現金及銀行存結', 'OTHER_ASS': '其他資產',
'TOTAL_ASS': '總資產', 'TOTAL_LIAB': '總負債', 'EQUITY': '股東權益',
'CASH_SHORTTERMFUND': '庫存現金及短期資金', 'DEPOSITS_FROM_CUSTOMER': '客戶存款',
'FINANCIALASSET_SALE': '可供出售之證券', 'LOAN_TO_BANK': '銀行同業存款及貸款',
'DERIVATIVES_LIABILITIES': '金融負債', 'DERIVATIVES_ASSET': '金融資產', 'YEAREND_DATE': '報表日期'}
# 現金流表
self.llb_dict = {
'CF_NCF_OPERACT': '經營活動產生的現金流', 'CF_DIV_REC': '已收利息', 'CF_INT_PAID': '已付利息',
'CF_INT_REC': '已收股息', 'CF_DIV_PAID': '已派股息', 'CF_INV': '投資活動產生現金流',
'CF_FIN_ACT': '融資活動產生現金流', 'CF_BEG': '期初現金及現金等價物', 'CF_CHANGE_CSH': '現金及現金等價物淨增加額',
'CF_END': '期末現金及現金等價物', 'CF_EXCH': '匯率變動影響', 'YEAREND_DATE': '報表日期'}
# 請求頭
self.headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.8',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 Safari/537.36'}
#總表
self.table_name={'cwzb': '主要財務指標', 'lrb': '利潤表', 'fzb': '資產負債表', 'llb': '現金流量表'}
def get_name(self,code):
'''輸入股票編號,返回名字,報表時間'''
code=str(code)
target_url = self.cwnb+code+'.html'
req = requests.get(url=target_url, headers=self.headers)
req.encoding = 'utf-8'
html = req.text
page_bf = BeautifulSoup(html, 'lxml')
# 股票名稱
name = page_bf.find_all('span', class_='name')[0].string
#報表初始時間———結束時間
time=page_bf.find_all('select',id='cwzb1')[0].select('option')
endtime=time[0].text
starttime=time[-1].text
return name,starttime,endtime
def get_informations(self,code):
'''返回名字,彙總字典{報表:對應list,,,}'''
# 整個彙總字典結構如下{'cwzb':[{'TURNOVER':33,'股票名':tx,···}、{}],'lrb':[{},{}],····}
name, starttime, endtime=self.get_name(code)
table_dict={} #總字典
for table in self.table_name.keys():#每個表的資料輪流單獨處理
url=self.server+'hk/service/cwsj_service.php?symbol={}&start={}&end={}&type={}&unit=yuan'\
.format(code,starttime,endtime,table)
#開啟每個資料型別對應的網頁,把該表格的資料彙總,每個年度的字典組成的list
table_text=requests.get(url=url,headers=self.headers).json()
#得到對應的中英文轉換表,self.cwzb_dict
dicts=eval('self.'+table+'_dict')
list=[]
for one in table_text: #英文名的表頭全部換為中文,再把每個年度的字典放進list裡,然後再把這個list放進總字典
c={dicts[zhong]:one[ying] for zhong in dicts.keys() for ying in one.keys() if ying==zhong}
c['股票名']=name
c['股票程式碼']=code
list.append(c) #c就是每一年度的具體報表,list就是該報表的每個年度的彙總,table_dict就是4個報表的彙總
table_dict[table]=list#每個報表:list
return name,table_dict
def insert_tables(self,table_dict):
'''先建立table(現金流表、、),然後把每一年的資料插入'''
for table in table_dict.keys():#迴圈總字典
table_name=self.table_name[table] #總字典key是英文(cwzb、、),先轉換為中文
#迴圈資料(dict)把每一列的列名新增到建立table的sql語句中
sql="CREATE TABLE IF NOT EXISTS %s (報表日期 char(30)"% table_name
for key in table_dict[table][0].keys():#總字典→報表→第一個字典的keys
if key!='報表日期':
sql+=','+key+' char(30)'
sql=sql+")ENGINE=InnoDB DEFAULT CHARSET='utf8'"
#運用lazymysql,登入mysql然後執行
TEST_DB = {
'host': 'localhost',
'user': 使用者名稱,
'password': 密碼,
'db': 'test'
}
store = LazyMysql(TEST_DB)
store.query(sql) #直接操作sql語句,建立表格table
bar = ProgressBar(widgets=[ #使用progress模組,顯示進度條
' [正在下載 ',
Percentage(),
Bar() , '] ',table_name,
])
#把list的每一年的資料(dict)插入到對應的表格裡
for item in bar(table_dict[table]):#迴圈報表的list
time.sleep(0.1)
store.save_one_data(item,table_name) #插入到mysql----表名,字典
if __name__ == '__main__':
print('*' * 100)
print('\t\t\t\t\t財務資料下載助手\n')
print('*' * 100)
fd = FinancialData()
# 上市股票地址
code = input('請輸入股票程式碼:')
name,table_dict=fd.get_informations(code)
print('\n %s:(%s)財務資料下載中!\n' % (name, code))
fd.insert_tables(table_dict)
print('\n %s:(%s)財務資料下載完成!' % (name, code))
其中建立table的語句我用迴圈自動生成了,不需要自己手擼這麼痛苦!!!
CREATE TABLE IF NOT EXISTS 利潤表 (報表日期 char(30),每股派息 char(30),總營收 char(30),股票程式碼 char(30),經營利潤 char(30),除稅前利潤 char(30),交易收益 char(30),淨利潤 char(30),利息收益 char(30),股票名 char(30),每股基本盈利 char(30),費用收益 char(30))ENGINE=InnoDB DEFAULT CHARSET='utf8'
效果圖:
插入圖:
相關文章
- 網易公開課之財務報表分析
- 財務報表分析
- Excel財務會計報表Excel
- 財務報表分析是在分析什麼?如何選擇財務報表分析工具
- 經濟財務-投資理財知識
- 鳳凰財經:中國人財富財調查–資料資訊圖
- 如何用baostock庫查詢某隻股票的財務狀況能力?
- Smartbi:財務人的福音,原來企業財務報表分析還能這樣做!
- ERP財務報表快消失了?用它做財務系統根本不夠用
- 財務分析經典圖表及製作方法
- OCR識別技術—財務報表識別
- 把財務分析明白的BI軟體有哪些?
- 網易財經:2014年中國信用卡產業分析報告產業
- OCR識別技術—財務報表識別(2)
- 筆記.財務報表分析.第1-2章筆記
- 輕鬆透視財務資料:免費工具助力公司打造財務報表視覺化看板視覺化
- 提供財務等核心業務報表的BI軟體有哪些?
- 財務報表分析真不難,你只差了一個Smartbi
- 財務分析報表分享|現金流量表視覺化視覺化
- 財務分析
- 智慧電子表格,為你輕鬆製作財務報表
- 企業財務報表分析有什麼用,方法有哪些
- 財務RPA,賦能企業財務實現財務數字化轉型
- 推薦一款自動生成財務報表分析的軟體
- 財務管理:租金攤銷計劃表
- 財務流程(ZT)
- Oracle前財務經理起訴Oracle為哪般?Oracle
- Web3.0時代,財務RPA如何實現財務賦能,驅動財務數字化?Web
- 資料視覺化報表分享||立竿見影的財務資料分析模板視覺化
- 財務系統憑證輸入設計
- 財務RPA:你的發票已經處理好了
- 用友財務軟體資料庫恢復資料庫
- 達觀智慧財務RPA自動納稅申報,加速企業財務數字化程式
- 寶鯤財經——竭誠為您提供國際一流的專業資訊服務
- 歐尚ERP建設注重庫存 女CIO財務、IT一把抓薦
- 阻礙財務共享助力財務轉型的三個坑,要繞行!
- 想學會財務分析:先看懂三大表
- 財務分析的基本要求