回顧一下:
第一課 我是怎樣三天學(xué)會(huì)Python編程,從一無(wú)所知到掌握爬取和訊網(wǎng)上市公司財(cái)務(wù)報(bào)表做分析的----介紹了如何構(gòu)建一個(gè)Python爬蟲環(huán)境,Python+MySQL安裝;
第二課、開心的爬蟲之旅----具體分析目標(biāo)數(shù)據(jù)表的構(gòu)成,介紹了分析網(wǎng)頁(yè)的必要工具;
今天這課是細(xì)化實(shí)現(xiàn)第二課的內(nèi)容,實(shí)現(xiàn)建立目標(biāo)數(shù)據(jù)的存放地點(diǎn),即上市公司財(cái)報(bào)表格的建立。
已經(jīng)為大家講解了Python軟件和MySQL的安裝、基本的數(shù)據(jù)庫(kù)操作和抓取網(wǎng)頁(yè)的工具,另外分析了目標(biāo)網(wǎng)站的數(shù)據(jù)結(jié)構(gòu)。
數(shù)據(jù)來(lái)源,網(wǎng)站鏈接都已經(jīng)很清楚了。
我們今天就動(dòng)手實(shí)現(xiàn)完成上市公司三表的數(shù)據(jù)表的建立。
下面我一步步給你演示,同時(shí)請(qǐng)你也跟隨我一步一步完成這些操作。
這些操作另一種做法就是寫成程序,可以一次性完成它。
我這里只是為了方便為你解說(shuō)加入相關(guān)內(nèi)容,而采用了命令行的方式。
1、首先確保MySQL打開(ctrl+alt+del 啟動(dòng)任務(wù)管理器->查看服務(wù) 是否有mysql57正在運(yùn)行)或者用下面語(yǔ)句直接做連接測(cè)試。
>>> import pymysql ?###導(dǎo)入MySQL鏈接函數(shù)庫(kù)
>>> connect = pymysql.Connect( ###用Taylor007er用戶連接MySQL
host='localhost',
port=3306,
user='Taylor007er',
passwd='007123',
charset='utf8')
>>> ? ? ? ? ? ? ###這里沒有收到如何錯(cuò)誤提示,說(shuō)明已經(jīng)連上了。
2、建立一個(gè)實(shí)例名稱是`hexun_mj`的數(shù)據(jù)庫(kù)。
你把他們當(dāng)成是一個(gè)EXCEL文件建好了,或者理 解成考勤表的木架子,一排排整整齊齊的,可以裝很多考勤表,很多人會(huì)拿到自己的考勤表簽到?,F(xiàn)在是訂做木架的工作。你可以建很多的架子,提供給不同的公司。
>>> sql ='CREATE SCHEMA `hexun_mj` DEFAULT CHARACTER SET gb2312 ;' ###這句話我以前是不懂的,需要的命令格式,打開MySQL Workbench,左邊導(dǎo)航欄下面SCHEMAS點(diǎn)右鍵 ?Create Schemas...進(jìn)去就可以,系統(tǒng)給出一下窗口,可以看到建立一個(gè)數(shù)據(jù)庫(kù)的命令。我們就依樣畫葫蘆。
>>> cursor = connect.cursor()
>>> cursor.execute(sql)
>>> ? ? ? ? ? ###這里沒有收到如何錯(cuò)誤提示,說(shuō)明數(shù)據(jù)庫(kù)已經(jīng)建好了。
>>>
上面這三句命令的格式應(yīng)該記住,操作數(shù)據(jù)庫(kù)會(huì)不斷的使用這個(gè)組合。
3、打開這個(gè)新建的數(shù)據(jù)庫(kù),我們要往里添加三個(gè)表,用于存放上市公司財(cái)務(wù)三表。你可以把他們看成是EXCEL里的sheels,或者 理解成考勤表,很多人在上面簽到?,F(xiàn)在是打格子的工作 。你可以隨時(shí)加空白考勤表進(jìn)去。這是比喻,方便你能形象理解。在計(jì)算機(jī)里是一樣的。
不同的是計(jì)算機(jī)里的考勤表可以考核的內(nèi)容不局限于時(shí)間,還可以是日期、時(shí)間、數(shù)據(jù)、文 本、圖片等等。
先建立一個(gè)利潤(rùn)表的空表。我們回看一下上次課總結(jié)的數(shù)據(jù)欄目是29項(xiàng),這個(gè)最少。但我們不能蠻干,打29行不是人干的事,重復(fù)的工作交給機(jī)器完成它。
還是先看看別人是怎么建的表。還是用MySQL Workbench。我選了數(shù)據(jù)庫(kù)world里的countrylanguage表,鼠標(biāo)放在表名上有個(gè)黑色的感嘆號(hào)。點(diǎn)開,看到中間出現(xiàn)countrylanguage表的info,我選到DDL,里面有建 立表格用的命令??梢越梃b。
看到這樣的語(yǔ)句
CREATE TABLE `countrylanguage` (
? ? `CountryCode` char(3) NOT NULL DEFAULT '',
`Language` char(30) NOT NULL DEFAULT '',
`IsOfficial` enum('T','F') NOT NULL DEFAULT 'F',
`Percentage` float(4,1) NOT NULL DEFAULT '0.0',
? ? PRIMARY KEY (`CountryCode`,`Language`),
? ? ?KEY `CountryCode` (`CountryCode`),
? ? ?CONSTRAINT `countryLanguage_ibfk_1`
? ? ?FOREIGN KEY (`CountryCode`)
? ? ?REFERENCES `country` (`Code`)
)
? ? ENGINE=InnoDB DEFAULT
? ? CHARSET=latin1
我們抄它有用的部分。
組合成對(duì)利潤(rùn)表有幫助的。
表名是hexun_lrb我用了拼音第一個(gè)字母。
為了批量增加字段名,我參照了網(wǎng)頁(yè)https://www.2cto.com/database/20140的例子
sql = "CREATE TABLE `hexun_mj`.`hexun_lrb` (
`hexun_gpdm` VARCHAR(6) NOT NULL,
`hexun_lrb_n1` VARCHAR(10));"
try: ?###try ... except一個(gè)容錯(cuò)機(jī)制,意思是試著做一些事如果有問(wèn)題,就做例外的事情。
cursor.execute(sql)
except:
print('The table addfields exists!')
# add the fileds 批量增加字段
try:
? ? for i in range(28):
? ? ? ? sql = "ALTER TABLE `hexun_mj`.`hexun_lrb` ADD COLUMN `hexun_lrb_n%s` FLOAT NULL;" %(i+2)
? ? ? ? print (sql)
? ? ? ? cursor.execute(sql)
except Exception:
? ? print ('error')
類似的我們把資產(chǎn)負(fù)債表、現(xiàn)金流量表、財(cái)務(wù)比率表和MJ數(shù)字力分析都建起來(lái)
###資產(chǎn)負(fù)債表
sql = "CREATE TABLE `hexun_mj`.`hexun_zcfzb` (
`hexun_gpdm` VARCHAR(6) NOT NULL,
`hexun_zcfzb_n1` VARCHAR(10));"
try: ?###try ... except一個(gè)容錯(cuò)機(jī)制,意思是試著做一些事如果有問(wèn)題,就做例外的事情。
cursor.execute(sql)
except:
print('The table add fields exists!')
# add the fileds 批量增加字段,這次是68個(gè)
try:
? ? for i in range(68):
? ? ? ? sql = "ALTER TABLE `hexun_mj`.`hexun_zcfzb` ADD COLUMN `hexun_zcfzb_n%s` FLOAT NULL;" %(i+2)
? ? ? ? print (sql)
? ? ? ? cursor.execute(sql)
except Exception:
? ? print ('error')
###現(xiàn)金流量表
sql = "CREATE TABLE `hexun_mj`.`hexun_xjllb` (
`hexun_gpdm` VARCHAR(6) NOT NULL,
`hexun_xjllb_n1` VARCHAR(10));"
try: ?###try ... except一個(gè)容錯(cuò)機(jī)制,意思是試著做一些事如果有問(wèn)題,就做例外的事情。
cursor.execute(sql)
except:
print('The table add fields exists!')
# add the fileds 批量增加字段,這次是69個(gè)
try:
? ? for i in range(69):
? ? ? ? sql = "ALTER TABLE `hexun_mj`.`hexun_xjllb` ADD COLUMN `hexun_xjllb_n%s` FLOAT NULL;" %(i+2)
? ? ? ? print (sql)
? ? ? ? cursor.execute(sql)
except Exception:
? ? print ('error')
###財(cái)務(wù)比率
sql = "CREATE TABLE `hexun_mj`.`hexun_cwbl` (
`hexun_gpdm` VARCHAR(6) NOT NULL,
`hexun_cwbl_n1` VARCHAR(10));"
try: ?###try ... except一個(gè)容錯(cuò)機(jī)制,意思是試著做一些事如果有問(wèn)題,就做例外的事情。
? ?cursor.execute(sql)
except:
? ? print('The table add fields exists!')
# add the fileds 批量增加字段,這次是88個(gè)字段
try:
? ? for i in range(88):
? ? ? ? sql = "ALTER TABLE `hexun_mj`.`hexun_cwbl` ADD COLUMN `hexun_cwbl_n%s` FLOAT NULL;" %(i+2)
? ? ? ? print (sql)
? ? ? ? cursor.execute(sql)
except Exception:
? ? print ('error')
###MJ數(shù)字力分析
sql = "CREATE TABLE `hexun_mj`.`hexun_mjszlfx` (
`hexun_gpdm` VARCHAR(6) NOT NULL,
`hexun_mjszlfx_n1` VARCHAR(10));"
try: ?###try ... except一個(gè)容錯(cuò)機(jī)制,意思是試著做一些事如果有問(wèn)題,就做例外的事情。
? ?cursor.execute(sql)
except:
print('The table add fields exists!')
# add the fileds 批量增加字段,這次是45個(gè)
try:
? ? for i in range(45):
? ? ? ? sql = "ALTER TABLE `hexun_mj`.`hexun_mjszlfx` ADD COLUMN `hexun_mjszlfx_n%s` FLOAT NULL;" %(i+2)
? ? ? ? print (sql)
? ? ? ? cursor.execute(sql)
except Exception:
? ? print ('error')
#做正式的提交
connect.commit()
以上補(bǔ)充建立了上節(jié)課提到的五張報(bào)表的數(shù)據(jù)表。
請(qǐng)同學(xué)們對(duì)著下面的圖看是不是已經(jīng)在自己的電腦上成功建立了這5張表。
這兩次課會(huì)比較細(xì)節(jié),為了達(dá)成具體的實(shí)現(xiàn),請(qǐng)保持耐心。