999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于Go語言的數據分析技術在金融行業內部審計中的應用

2020-06-21 15:34:16張松唐艷雙李懷宇
中國內部審計 2020年6期
關鍵詞:數據分析

張松 唐艷雙 李懷宇

[摘要]本文通過審計實例介紹運用Go語言開發爬蟲程序,批量獲取某省金融企業監管處罰數據,對被審計單位及所在地域金融企業進行全方位、立體畫像,實現網絡公開數據與行內數據的相互補充印證,準確鎖定審計目標,提升現場審計效率。

[關鍵詞]內部審計? ? Go語言? ? 數據分析? ? 爬蟲程序

隨著信息科技與生產過程的不斷融合,人們越來越感受到科技在工作中的重要性。在企業內部審計中,可利用數據分析語言開發網絡爬蟲程序獲取被審計單位的日常經營及社會活動相關數據。Go語言(又稱Golang語言),是Google公司開發的一種簡潔高效的開源編程語言,具有高并發性和跨平臺開發優勢,非常適合服務器編程。

一、總體思路

首先,開發的爬蟲程序必須善意且自覺遵守Robots協議,開發前要查看網站根目錄下的robots.txt文件,根據Robots協議合理進行爬取數據。其次,將爬取到的監管信息,存儲到CSV文本及本地MySQL數據庫中,并從中篩選出關注單位的處罰信息。

爬蟲程序工作原理是抓取網頁源代碼。源代碼中包含網頁內容信息和網絡鏈接URL地址,可以繼續打開網頁中的URL地址,進一步抓取下一層網頁內容和網絡鏈接URL地址,這樣就可以循環抓取所需網頁公布的數據信息。

Go語言抓取網頁源代碼時,最常用的方法是利用Go語言自帶的net/http包工具與正則表達式相配合,匹配抓取想要的內容信息,也可以利用一些根據網頁節點屬性選擇的CSS選擇器、Colly或Goquery等框架工具提取所需要的數據信息。

二、具體步驟

(一)分析網頁目標地址,封裝地址函數

首先,明確爬取目標網站的URL鏈接地址變化規律,需要爬取的內容是金融機構被監管部門處罰的公開處罰信息;其次,打開具體的行政處罰頁面首頁發現,每頁有18份處罰單的名稱和鏈接地址,打開第二頁、第三頁等多個行政處罰頁面,發現每頁都包含18份處罰單的鏈接,而且前三頁鏈接URL地址是一種類型格式,第四頁往后的網頁是另一種鏈接URL格式。所以將兩種鏈接URL格式定義為一個數組切片并賦值給urls變量,封裝到Get2Urlt函數中,用if語句自動判斷,當頁碼小于4時取第一種URL格式,其他情況則取第二種URL格式,具體語句如下:

func Get2Urlt(idx int) (url string) {

urls :=

[]string{"http://www.****c.**v.cn/cn/st****/data/tocInfo/Selecr********ItemdId/data_itemId=1515,pageIndex=" + strconv.Itoa(idx) + ",pageSize=18.json",

"http://www.****c.**v.cn/dbircweb/tocInfo/Selecr********ItemdId?itemId=1515&pageSize=18&pageIndex=" + strconv.Itoa(idx)}

if idx < 4 {

url = urls[0]

} else {

url = urls[1]

}

return

}

(二)封裝函數,獲取單個網頁信息

選用Go語言程序自帶的net/http包中的Get()方法,根據傳入的URL鏈接地址參數便可發起有效請求,獲取網頁源代碼并賦值給變量resp。因為Http.Get()請求是一種網絡資源,用完后應第一時間將其關閉,用defer指定的Close()函數來關閉網絡請求,語句如下:

func HttpGet(url string) (result []string, err error) {

resp, err1 := http.Get(url)

if err1 != nil {

err = err1

return

}

defer resp.Body.Close()

data1, err2 := ioutil.ReadAll(resp.Body)

b := UserJsonObj{}

json.Unmarshal([]byte(data1), &b)

if err2 != nil {

err = err2

return

}

urlls := make([]string, 0)

for i := 0; i <= 17; i++ {

urllist :=

"http://www.****c.**v.cn/branch/*******I/view/pages/tcommon/Item****t.html?docId=" + strconv.Itoa(int(b.Data.Rows[i].DocId)) + "&itemId=1515"

urlls = append(urlls, urllist)

}

result = urlls

return

}

(三)創建結構體,存儲網絡Json數據

創建UserJsonObj結構體,用來存儲網頁的Json數據并賦值給變量b,用json.Unmarshal工具將json字符串解碼到相應的結構體中。創建HttpGet()函數獲取每頁所有罰單的URL鏈接地址,循環讀出每份處罰單的鏈接URL地址,將所有罰單的鏈接URL地址賦值給變量urllist,并追加到數組切片urlls中,再將切片urlls賦值給result并返回GetOnePage()函數,語句如下:

type UserJsonObj struct {

RptCode float64 `json:"rptCode"`

Msg? ? ?string? `json:"msg"`

Data? ? Data? ? `json:"data"`

}

type Data struct {

Total float64? ?`json:"total"`

Rows? []Brand `json:"rows"`

}

type Brand struct {

DocId? ? ? float64 `json:"tocId"`

DocSubtitle string `json:"tocSubtitle"`

PublishDate string `json:"publishDate"`

DocSummarystring`json:"tocSummary"`

DocFileUrl? string `json:"tocFileUrl"`

Generaltype string `json:"generaltype"`

PdfFileUrl? string `json:"pdfFileUrl"`

ItemName? string `json:"itemName"`

SolicitFlag string `json:"tolicitFlag"`

DocTitle? ? string `json:"docTitle"`

Datafrom? ?string `json:"datafrom"`

DocUuid? ? string `json:"docUuit"`

Builddate? ?string `json:"builddate"`

}

func GetOnePage(idx int, page chan int) {

url := Get2Urlt(idx)

authors, err := HttpGet(url)

if err != nil {

fmt.Println("HttpGet err:", err)

return

}

mc := make([]string, 0)

dw := make([]string, 0)

xm := make([]string, 0)

yy := make([]string, 0)

tk := make([]string, 0)

fk? := make([]string, 0)

rq? := make([]string, 0)

for _, jokeURL := range authors {

conUrl := GetUrlt(jokeURL)

contentUrl :=

"http://www.****c.****v.cn/cn/****ic/data/tocInfo/SelecR****t/data_docId=" + conUrl + ".json"

mc1, dw1, xm1, yy1, tk1, fk1, rq1, err := GetTwoPage(contentUrl)

if err != nil {

fmt.Println("Spider2Page err:", err)

continue

}

mc = append(mc, mc1)

dw = append(dw, dw1)

xm = append(xm, xm1)

yy = append(yy, yy1)

tk? = append(tk, tk1)

fk? = append(fk, fk1)

rq? = append(rq, rq1)

}

SpiderWrPage(idx, mc, dw, xm, yy, tk, fk, rq)

page <- idx

}

(四)封裝函數,進一步獲取罰單信息

創建GetTwoPage(contentUrl)函數獲取第二層中每份罰單的關鍵信息。傳入參數是加工后的contentUrl罰單鏈接地址,GetTwoPage函數也是使用net/http包中的Get()方法來獲取每張罰單的源代碼數據,再用Goquery工具的doc.Find()方法對每張罰單文本中的表格數據進行過濾提取,分別提取出罰單中的名稱、被處罰單位、被處罰人姓名、被處罰原因、違反條款、處罰信息和處罰日期等關鍵信息,將提取到的信息分別返回GetOnePage()函數,語句如下:

func GetTwoPage(contentUrl string) (mc1, dw1, xm1, yy1, tk1, fk1, rq1 string, error) {

resp, err1 := http.Get(contentUrl)

if err1 != nil {

err = err1

return

}

fileContent := make([]string, 0)

fileContent0 := make([]string, 0)

doc,err := goquery.NewDocumentFromResponse(resp)

if err == nil {

doc.Find("td").Each(func(i int, s *goquery.Selection) {

str1 := s.Text()

str1 = strings.Replace(str1, " ", "", -1)

str1 = strings.Replace(str1, "_", "", -1)

str1 = strings.Replace(str1, "\\r\\n", "", -1)

str1 = strings.Replace(str1, "\r|\n", "", -1)

str1 = strings.Replace(str1, " ", "", -1)

fileContent = append(fileContent, str1)

})

} else {

fmt.Println("err--->", err)

}

if len(fileContent) < 2 {

doc.Find("span").Each(func(i int, s *goquery.Selection) {

str1 := s.Text()

str1 = strings.Replace(str1, " ", "", -1)

str1 = strings.Replace(str1, "_", "", -1)

str1 = strings.Replace(str1, "\n", "", -1)

str1 = strings.Replace(str1, "\r", "", -1)

str1 = strings.Replace(str1, "\\r\\n", "", -1)

str1 = strings.Replace(str1, "\r\n", "", -1)

str1 = strings.Replace(str1, " ", "", -1)

fileContent0 = append(fileContent0, str1)

})

}

hz1 := make([]string, 0)

hz0 := make([]string, 0)

for i := 0; i < len(fileContent); i++ {

fileContent[i] = strings.Replace(fileContent[i], " ", "", -1)

fileContent[i] = strings.Replace(fileContent[i], "\n", "", -1)

fileContent[i] = strings.Replace(fileContent[i], "\t", "", -1)

fileContent[i] = strings.Replace(fileContent[i], " ", "", -1)

Hz := fileContent[i]

hz1 = append(hz1, Hz)

}

for i := 0; i < len(fileContent0); i++ {

fileContent0[i] = strings.Replace(fileContent0[i], " ", "", -1)

fileContent0[i] = strings.Replace(fileContent0[i], "\n", "", -1)

fileContent0[i] = strings.Replace(fileContent0[i], "\t", "", -1)

fileContent0[i] = strings.Replace(fileContent0[i], " ", "", -1)

Hz0 := fileContent0[i]

hz0 = append(hz0, Hz0)

}

if len(hz1) >= 21 {

mc1 = hz1[1]

dw1 = hz1[10]

xm1 = hz1[12]

yy1 = hz1[14]

tk1 = hz1[16] + hz1[18]

fk1 = hz1[20]

rq1 = hz1[len(hz1)-1]

} else {

}

if len(hz0) >= 30 {

mc1 = hz0[1]

dw1 = hz0[13]

xm1 = hz0[10]

yy1 = hz0[19] + hz0[20] + hz0[21] + hz0[22] + hz0[23] + hz0[24] + hz0[25]

tk1? = hz0[28]

fk1? =? hz0[28] + hz0[29] +hz0[30]

rq1 = hz0[len(hz0)-9] + hz0[len

(hz0)-8] + hz0[len(hz0)-7] + hz0[len(hz0)-6] + hz0[len(hz0)-5] + hz0[len(hz0)-4] + hz0[len(hz0)-3]

} else {

}

return

}

(五)封裝函數,將數據寫入文本

GetOnePage()函數接收到GetTwoPage()函數采集到的罰單關鍵數據后,分別將每個字段的數據信息追加到提前設置好的數組切片中,將收到的切片數據傳給創建的SpiderWrPage()函數,將采集到的每頁數據逐條寫入文本中,多傳入一個idx參數記錄采集到第幾頁的數據,用strconv.Itoa(idx)方法將整型數字轉換成字符串,配合目錄地址創建對應的目錄文本文件,語句如下:

func SpiderWrPage(idx int, mc, dw, xm, yy, tk, fk, rq []string) {

//path := "D:/go/src/crawler/第1" + strconv.Itoa(idx) + "頁.txt"

path := "D:/go/src/go_tintjj.go/data1/第" + strconv.Itoa(idx) + "頁.txt"

f, err := os.Create(path)

if err != nil {

fmt.Println("os.Create err:", err)

return

}

defer f.Close()

n := len(mc)

for i := 0; i < n; i++ {

f.WriteString(strconv.Itoa(i+1) + "," + mc[i] + "," + dw[i] + "," + xm[i] + "," + yy[i] + "," + tk[i] + "," + fk[i] + "," + rq[i] + "\n")

}

MySql(idx)

}

(六)封裝函數,將文本數據寫入本地MySQL數據庫

創建MySql()函數,將寫入文本的罰單數據插入本地MySql數據庫中,運行流程為:首先用sqlx.Open()函數打開本地MySql數據庫,用db.Exec()方法加create table語句創建對應的數據表;其次用Go語言自帶os包中的os.Open()方法打開數據文本,用for循環語句里嵌套reader.ReadLine()方法逐行讀取數據,直到io.EOF文件結束時停止;最后用db.Exec()方法加insert into語句將讀取到的數據逐條插入對應數據表中,語句如下:

func MySql(idx int) {

db,err := sqlx.Open("mysql", "root:a123@tcp(127.0.0.1:3306)/test")

HandleError(err, "sql.Open")

defer db.Close()

_, err = db.Exec("create table if not exists data_ybjh(idx int(8),mc varchar(260),dw varchar(424),xm varchar(224),yy varchar(824),tk varchar(424),fk varchar(424),rq varchar(264));")

HandleError(err, "db.Exec create table")

fpath := GetFpath(idx)

file, e := os.Open(fpath)

HandleError(e, "os.Open")

defer file.Close()

reader := bufio.NewReader(file)

for {

lineBytes, _, err := reader.ReadLine()

HandleError(err, "reader.ReadLine")

if err == io.EOF {

break

}

lineStr := string(lineBytes)

fields := strings.Split(lineStr, ",")

idx, mc, dw, xm, yy, tk, fk, rq := fields[0], fields[1], fields[2], fields[3], fields[4], fields[5], fields[6], fields[7]

result, err := db.Exec("insert into data_tbjh(idx,mc,dw,xm,yy,tk,fk,rq) values(?,?,?,?,?,?,?,?);", idx, mc, dw, xm, yy, tk, fk, rq)

HandleError(err, "db.Exec insert")

if n, e := result.RowsAffected(); e == nil && n > 0 {

fmt.Printf("插入%s 數據成功?。。躰", mc)

if _, e := result.RowsAffected(); e != nil && e == io.EOF {

break

}

}

}

}

(七)數據入庫成功

程序運行完畢后,打開本地MySQL數據庫查詢發現,采集的金融單位處罰數據信息,包括名稱、被處罰單位、被處罰人姓名、被處罰原因、違反條款、處罰信息和處罰日期等關鍵信息,已分字段插入本地數據庫對應表中,達到預期程序設計要求,為審計項目的開展增加一條數據獲取渠道。

三、數據初步分析

通過SQL語句對MySQL數據庫中提取的處罰信息進行匯總分析,發現被審計單位的主要監管處罰原因主要集中于貸款資金被挪用、違規發放貸款、集團客戶授信超比例及貸款五級分類不準確等方面。

本次利用Go語言技術獲取監管處罰信息過程中,在網頁文本數據篩選獲取時用到了Goquery框架工具的doc.Find方法。Goquery框架工具功能強大、使用靈活方便,在對文本數據篩選提取時也可使用regexp包中的MustCompile和FindAllStringSubmatch方法以達到同樣效果。

上述方法可以一次性獲取某個省份特定單位的監管處罰信息,對被審計單位及所在地域金融企業的經營情況有更加全面的了解,開闊審計人員的思路,豐富審計手段,提升現場審計效率。

(作者單位:中國郵政儲蓄銀行股份有限公司審計局沈陽分局,郵政編碼:110013,電子郵箱:cdzhangs@163.com)

猜你喜歡
數據分析
電子物證檢驗的數據分析與信息應用研究
基于matlab曲線擬合的數據預測分析
商情(2016年40期)2016-11-28 11:28:07
分眾媒體趨勢下場景營銷的商業前景
商(2016年32期)2016-11-24 17:39:41
佛山某給水管線控制測量探討
科技資訊(2016年18期)2016-11-15 18:05:53
SPSS在環境地球化學中的應用
考試周刊(2016年84期)2016-11-11 23:57:34
大數據時代高校數據管理的思考
科技視界(2016年18期)2016-11-03 22:51:40
我校如何利用體育大課間活動解決男生引體向上這個薄弱環節
體育時空(2016年8期)2016-10-25 18:02:39
Excel電子表格在財務日常工作中的應用
淺析大數據時代背景下的市場營銷策略
新常態下集團公司內部審計工作研究
中國市場(2016年36期)2016-10-19 04:31:23
主站蜘蛛池模板: yjizz视频最新网站在线| 亚洲va在线观看| 67194亚洲无码| 国产91久久久久久| 久久人搡人人玩人妻精品| 亚洲女同欧美在线| 91成人试看福利体验区| 国产在线91在线电影| 欧美一区福利| 久久毛片免费基地| 午夜高清国产拍精品| 韩国自拍偷自拍亚洲精品| 日韩精品久久久久久久电影蜜臀| 日韩成人午夜| 九色视频最新网址 | 亚洲欧美不卡中文字幕| 人妻精品全国免费视频| 亚洲日本一本dvd高清| 婷婷色在线视频| 真实国产精品vr专区| 久久五月视频| 日韩精品亚洲精品第一页| 国产成人三级在线观看视频| 精品1区2区3区| 最新国产午夜精品视频成人| 1级黄色毛片| 国产情侣一区二区三区| 国产精品刺激对白在线| 国产欧美又粗又猛又爽老| 欧美成人一区午夜福利在线| 久久女人网| 91娇喘视频| 狠狠躁天天躁夜夜躁婷婷| yjizz视频最新网站在线| 国产一区二区三区日韩精品| 亚洲精品少妇熟女| 亚洲无码高清视频在线观看| 国产精品无码作爱| 久久久久久尹人网香蕉 | 91亚洲视频下载| 91国内视频在线观看| 日韩a级片视频| 国产在线自揄拍揄视频网站| 中文字幕色在线| 亚洲人精品亚洲人成在线| av午夜福利一片免费看| 天堂岛国av无码免费无禁网站| 一级成人欧美一区在线观看 | 国产亚洲欧美另类一区二区| 日韩一区精品视频一区二区| 色妞永久免费视频| 国产主播一区二区三区| 国产拍揄自揄精品视频网站| 日本高清在线看免费观看| 美女内射视频WWW网站午夜 | 国产成人做受免费视频| 欧美日韩91| 97国产在线观看| 久久这里只有精品国产99| 国内毛片视频| 国产成人AV综合久久| 国产福利免费视频| 国产极品粉嫩小泬免费看| 午夜国产大片免费观看| 亚洲毛片一级带毛片基地| 91人人妻人人做人人爽男同| 国产成人精品三级| 国产成人综合日韩精品无码不卡| 在线观看网站国产| 久久福利片| 亚洲欧美日韩精品专区| 精品第一国产综合精品Aⅴ| 日本福利视频网站| 9丨情侣偷在线精品国产| 国产高清不卡| 怡红院美国分院一区二区| 国产三级视频网站| 亚洲精品国产自在现线最新| 国内黄色精品| 午夜性刺激在线观看免费| 99久久99这里只有免费的精品| 狠狠v日韩v欧美v|