• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    基于Python的圖書館業(yè)務(wù)報(bào)表自動(dòng)生成研究

    2016-12-15 18:45:18辛海濱
    電腦知識與技術(shù) 2016年27期
    關(guān)鍵詞:圖書館

    辛海濱

    摘要:針對圖書館日常工作中需要定期總結(jié)、匯報(bào)業(yè)務(wù)數(shù)據(jù)的問題,該文利用Python實(shí)現(xiàn)了業(yè)務(wù)報(bào)表的自動(dòng)生成。Python豐富的標(biāo)準(zhǔn)庫提供了強(qiáng)大的網(wǎng)絡(luò)處理和文本分析功能。該文通過分析報(bào)表生成的基本工作原理,利用Python實(shí)現(xiàn)模擬登陸、獲取HTML文件、提取數(shù)據(jù),最終匯總形成報(bào)表。

    關(guān)鍵詞:圖書館;業(yè)務(wù)統(tǒng)計(jì);Python;自動(dòng)生成

    中圖分類號:TP315 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2016)27-0072-03

    信息技術(shù)快速發(fā)展的今天,國內(nèi)大部分圖書館都已經(jīng)配備了計(jì)算機(jī)系統(tǒng),使圖書館基本業(yè)務(wù)實(shí)現(xiàn)了自動(dòng)化,給圖書館工作帶來了極大的便利。但除這些基本業(yè)務(wù)活動(dòng)外,各個(gè)業(yè)務(wù)部門在日常工作中還要定期總結(jié)、匯報(bào)業(yè)務(wù)數(shù)據(jù)(如周報(bào)、月報(bào)等),使管理層能夠及時(shí)掌握業(yè)務(wù)部門的運(yùn)行情況。以報(bào)刊借閱室為例,業(yè)務(wù)數(shù)據(jù)包括閱覽人次、流通人數(shù)、期刊外借冊次以及新刊記到種數(shù)、冊數(shù)等。這些數(shù)據(jù)存在于圖書館業(yè)務(wù)管理系統(tǒng)的不同功能模塊下。當(dāng)獲取某一項(xiàng)業(yè)務(wù)數(shù)據(jù)時(shí),我們需要逐層展開系統(tǒng)功能模塊,找到相應(yīng)業(yè)務(wù)統(tǒng)計(jì)功能,選擇各項(xiàng)查詢條件,如開始日期、結(jié)束日期和部門代碼等,等待系統(tǒng)輸出統(tǒng)計(jì)數(shù)據(jù),并將之記錄下來。其他業(yè)務(wù)數(shù)據(jù)的統(tǒng)計(jì)也遵循同樣的流程。最后我們將獲取的所有業(yè)務(wù)數(shù)據(jù)匯總到一個(gè)文件中,行成業(yè)務(wù)報(bào)表。這些工作具有重復(fù)、繁瑣的特點(diǎn),消耗了工作人員相當(dāng)大的精力去細(xì)心、耐心對待。Python是一種解釋型編程語言,提供了功能強(qiáng)大的用于網(wǎng)絡(luò)處理的標(biāo)準(zhǔn)庫。可以利用Python提供的這些庫登陸系統(tǒng)、獲取數(shù)據(jù),實(shí)現(xiàn)業(yè)務(wù)報(bào)表的自動(dòng)生成。這可以減少人為失誤,提升業(yè)務(wù)數(shù)據(jù)統(tǒng)計(jì)的準(zhǔn)確度、提高工作人員的工作效率。

    1 基本工作原理

    當(dāng)前存在多種圖書館業(yè)務(wù)管理系統(tǒng)被不同圖書館應(yīng)用,Interlib采用基于web和Internet的B/S模式,實(shí)現(xiàn)了圖書館業(yè)務(wù)在線管理,具有代表性,因此本文選取Interlib進(jìn)行操作。生成業(yè)務(wù)報(bào)表的基本工作原理如圖1所示。我們首先通過瀏覽器進(jìn)行系統(tǒng)登錄,登錄成功后,找到相應(yīng)業(yè)務(wù)統(tǒng)計(jì)功能,獲得存儲(chǔ)數(shù)據(jù)的頁面,利用正則表達(dá)式提取數(shù)據(jù)并匯總形成報(bào)表。

    登錄時(shí),在瀏覽器中打開interlib系統(tǒng)登錄頁面,工作人員輸入用戶名、密碼等登錄信息,提交給服務(wù)器。服務(wù)器響應(yīng),返回包含數(shù)據(jù)的網(wǎng)頁。從瀏覽器層面看,瀏覽器提交包含URL、cookies和post表單等必要信息的請求,服務(wù)器響應(yīng),返回包含數(shù)據(jù)的HTML文件。其中URL(Uniform Resource Locator)是統(tǒng)一資源定位符,是資源在互聯(lián)網(wǎng)上位置和訪問方法的一種簡潔表示;cookies是存儲(chǔ)在本地的文本文件,用于辨識用戶和進(jìn)行會(huì)話跟蹤;post表單是調(diào)用POST方法時(shí)提交的用戶請求表單等信息。登錄后,從系統(tǒng)獲取閱覽人數(shù)、外借人數(shù)、外借冊次等統(tǒng)計(jì)信息時(shí),瀏覽器發(fā)出包含各種查詢條件的請求,服務(wù)器響應(yīng),返回包含統(tǒng)計(jì)數(shù)據(jù)的HTML文件。HTML文件是一種由標(biāo)簽和內(nèi)容組成的文本文件,瀏覽器通過標(biāo)簽來顯示文件中的內(nèi)容。我們利用正則表達(dá)式從返回的HTML文件中獲取需要的數(shù)據(jù)。最后,將各項(xiàng)業(yè)務(wù)統(tǒng)計(jì)數(shù)據(jù)匯總成報(bào)表。

    本文利用fiddler抓取網(wǎng)頁進(jìn)行分析,獲取URL和需要提交的post表單等信息。Interlib系統(tǒng)服務(wù)器的IP地址假定為“192.168.0.1”。工作人員用戶名和密碼分別以“myusername”和“mypassword”來表示。

    2 模擬登錄

    首先導(dǎo)入開發(fā)過程中所使用的庫:

    import datetime

    import urllib.request

    import http.cookiejar

    import re

    datetime模塊提供了處理日期和時(shí)間的類,用于處理程序中的日期、時(shí)間數(shù)據(jù);re模塊是Python用于實(shí)現(xiàn)正則表達(dá)式的庫,我們可以通過re模塊提供的功能來提取HTML文件中的特定內(nèi)容。http.cookiejar模塊定義了自動(dòng)處理HTTP cookies的類。Http.request模塊定義了一系列通過復(fù)雜方式打開URL的類和方法。我們創(chuàng)建CookieJar對象來存儲(chǔ)http cookies,綁定http處理器。代碼如下:

    cj=http.cookiejar.CookieJar()

    pro=urllib.request.HTTPCookieProcessor(cj)

    opener=urllib.request.build_opener(pro)

    工作人員輸入用戶名和密碼登錄Interlib系統(tǒng),如圖2a所示。我們將登錄過程通過fiddler抓包進(jìn)行分析,如圖2b所示。從用線圈出的部分可以看出登錄URL為http://192.168.0.1/interlib/common/Login。post表單數(shù)據(jù)編碼成字節(jié)字符串后為:bcmdACT=opLOGIN&furl=maxMain.jsp&passwd=34819d7beeabb9260a5c854bc85b3e44&competno=999libcodeadmin&loginid=myusername&passwd_in=mypassword。我們定義函數(shù)login()進(jìn)行系統(tǒng)登錄,通過提供URL和post表單打開網(wǎng)頁。主要代碼如下:

    def login():

    url_login=http://192.168.0.1/interlib/common/Login

    postDict_login=bcmdACT=opLOGIN&furl=maxMain.jsp&passwd=34819d7beeabb9260a5c854bc85b3e44&competno=999libcodeadmin&loginid=myusername&passwd_in=mypassword

    data_login=opener.open(url_login,postData_login)

    通過cookies處理器構(gòu)建的opener能夠自動(dòng)管理cookies,不必關(guān)心其實(shí)現(xiàn)細(xì)節(jié)。

    3 報(bào)表實(shí)現(xiàn)

    我們調(diào)用login函數(shù)成功登錄系統(tǒng)后,打開系統(tǒng)相應(yīng)業(yè)務(wù)數(shù)據(jù)統(tǒng)計(jì)功能,通過查詢條件獲取存儲(chǔ)統(tǒng)計(jì)數(shù)據(jù)的HTML文件。分析HTML文件結(jié)構(gòu),利用正則表達(dá)式提取我們需要的數(shù)據(jù)。

    3.1 獲取HTML文件

    我們通過fiddler進(jìn)行抓包,分析發(fā)現(xiàn),系統(tǒng)存儲(chǔ)各種統(tǒng)計(jì)數(shù)據(jù)的地址相同,即URL為http://192.168.0.1/interlib/report/StatisServlet。各業(yè)務(wù)統(tǒng)計(jì)功能提交的Post表單包含相同的5個(gè)數(shù)據(jù)項(xiàng),分別為cmdACT、mod、xsl、whereSQL和statisId,其中三個(gè)數(shù)據(jù)項(xiàng)cmdACT、mod和xsl的內(nèi)容針對各種業(yè)務(wù)統(tǒng)計(jì)沒有發(fā)生變化,數(shù)據(jù)項(xiàng)whereSQL表示查詢條件,數(shù)據(jù)項(xiàng)statisId用于標(biāo)識業(yè)務(wù)統(tǒng)計(jì)項(xiàng)目。如此,我們就可以通過提供查詢條件和統(tǒng)計(jì)項(xiàng)目來獲取存儲(chǔ)數(shù)據(jù)的HTML文件,主要代碼如下:

    def getData(whereSQL=,statisId=):

    url_getData=http://172.16.31.7/interlib/report/StatisServlet

    postDict_getData={

    cmdACT:doStatis,

    mod:oneXSL,

    xsl:,

    whereSQL:whereSQL,

    statisId:statisId}

    postData_getData=urllib.parse.urlencode(postDict_getData).encode()

    data_getData=opener.open(url_getData,postData_getData).read().decode()

    return data_getData

    其中postData_getData=urllib.parse.urlencode(postDict_getData).encode()是應(yīng)用urllib.parse模塊的urlencode函數(shù)將post表單數(shù)據(jù)進(jìn)行編碼。將它同URL傳遞給opener返回一個(gè)HTTPResponse對象,調(diào)用read方法進(jìn)行讀取并解碼,得到我們需要的HTML文件,如圖3b所示。本文以文獻(xiàn)借還冊次統(tǒng)計(jì)中統(tǒng)計(jì)文獻(xiàn)借閱情況進(jìn)行說明,圖3a為文獻(xiàn)借還冊次統(tǒng)計(jì)結(jié)果頁面,圖3b為其相應(yīng)的HTML源文件。

    3.2 提取統(tǒng)計(jì)數(shù)據(jù)

    通過分析圖3a、3b發(fā)現(xiàn),HTML源代碼中不含合計(jì)數(shù)據(jù),只包含各大類的文獻(xiàn)借閱冊次數(shù)據(jù)。這就要求我們提取出各大類的數(shù)據(jù),并將之加和得到需要的數(shù)據(jù)。在各種業(yè)務(wù)統(tǒng)計(jì)中,數(shù)據(jù)都存儲(chǔ)在這種類型的格式中,一般VAL1存儲(chǔ)人數(shù)、冊數(shù)等類型數(shù)據(jù),VAL2存儲(chǔ)人次、冊次等類型的數(shù)據(jù)。圖3b所示的文獻(xiàn)借還冊次統(tǒng)計(jì)中只包含VAL2標(biāo)簽,即該HTML文件中只包含文獻(xiàn)借閱冊次數(shù)據(jù)。我們定義函數(shù)getvalue,利用re模塊提供的正則表達(dá)式首先將上述兩種字符串從HTML文件中提取出來,然后從得到的字符串中提取出數(shù)據(jù)。代碼如下:

    def getvalue(data=):

    return_ls=[]

    zs_re=r

    zs_exp=re.compile(zs_re)

    zs_list=zs_exp.findall(data)

    cs_re=r

    cs_exp=re.compile(cs_re)

    cs_list=cs_exp.findall(data)

    sum_zs=0

    sum_cs=0

    for row1 in zs_list:

    num1=re.sub(r,,row1)

    sum_zs+=int(num1)

    for row2 in cs_list:

    num2=re.sub(r,,row2)

    sum_cs+=int(num2)

    return_ls.append(sum_zs)

    return_ls.append(sum_cs)

    return return_ls

    在此功能中,我們定義列表return_ls存儲(chǔ)加總的統(tǒng)計(jì)數(shù)據(jù),第一項(xiàng)存儲(chǔ)人數(shù)、冊數(shù)等類型數(shù)據(jù),第二項(xiàng)存儲(chǔ)人次、冊次等類型數(shù)據(jù)。代碼中,列表zs_list存儲(chǔ)HTML文件中所有的字符串,cs_list存儲(chǔ)字符串。

    3.3 匯總統(tǒng)計(jì)數(shù)據(jù)

    在生成業(yè)務(wù)報(bào)表過程中,需要將各項(xiàng)業(yè)務(wù)數(shù)據(jù)逐一提取出來,最后匯總到一個(gè)文件中。獲取某項(xiàng)統(tǒng)計(jì)數(shù)據(jù)時(shí),輸入開始時(shí)間和結(jié)束時(shí)間并通過給statisId賦值確定業(yè)務(wù)統(tǒng)計(jì)項(xiàng)目,即可獲取該數(shù)據(jù)。文獻(xiàn)借閱數(shù)據(jù)統(tǒng)計(jì)的主要代碼如下:

    def jhcctj(s_date,e_date):

    whereSQL="(log_cir.regtime between TO_DATE("+s_date+",YYYY-MM-DD) and (TO_DATE("+e_date+",YYYY-MM-DD)+1)) and log_cir.data2 in (select rdid from reader where rdlib =分館代碼) and holding.orglocal=部門代碼 and log_cir.libcode =分館代碼 and log_cir.userid in(部門工作人員) and (log_cir.logtype=30001 or log_cir.logtype=30003 or log_cir.logtype=30007 or log_cir.logtype=30009 or log_cir.logtype=30050 or log_cir.logtype=30051 )"

    statisId=bookLoanBookTimesSta

    data_jhcctj=getData(whereSQL,statisId)

    ls_jhcctj=getvalue(data_jhcctj)

    其中s_date和e_date兩個(gè)參數(shù)分別為開始日期和結(jié)束日期,將之傳入whereSQL,形成查詢條件。statisId=bookLoanBookTimesSta表示要進(jìn)行的業(yè)務(wù)統(tǒng)計(jì)項(xiàng)目是文獻(xiàn)借還冊次統(tǒng)計(jì)。調(diào)用getData函數(shù)獲取對應(yīng)的HTML文件,再對該HTML文件調(diào)用getvalue函數(shù)獲取數(shù)據(jù)。我們從圖2b中看出,該HTML文件中只包含VAL2標(biāo)簽,即該統(tǒng)計(jì)中只有文獻(xiàn)借閱冊次而沒有借閱冊數(shù)數(shù)據(jù)。我們統(tǒng)計(jì)2016年3月2日至3日的文獻(xiàn)借閱冊次數(shù)據(jù),運(yùn)行程序,得到列表ls_jhcctj的值為[0,107],即2016年3月2日至3日文獻(xiàn)借閱冊次為107冊次。

    本文應(yīng)用tkinter設(shè)計(jì)了一個(gè)簡單的界面,將部門各項(xiàng)統(tǒng)計(jì)數(shù)據(jù)提取、匯總,如圖4所示。

    4 結(jié)束語

    本文利用Python提供的豐富的網(wǎng)絡(luò)處理和文本分析標(biāo)準(zhǔn)庫,實(shí)現(xiàn)了業(yè)務(wù)數(shù)據(jù)自動(dòng)的提取并形成報(bào)表。這使工作人員擺脫了重復(fù)繁瑣的數(shù)據(jù)提取工作,能夠把更多的精力投入到業(yè)務(wù)工作中。Python簡單易學(xué)、功能強(qiáng)大,工作人員在具體工作中可對代碼進(jìn)行修改以適應(yīng)自身需求,如提取某個(gè)工作人員的業(yè)務(wù)數(shù)據(jù)。本文不足之處在于該業(yè)務(wù)報(bào)表只是針對采用B/S模式的圖書館業(yè)務(wù)管理系統(tǒng)實(shí)現(xiàn)。在后續(xù)工作中,我們將對采用其他模式的圖書館業(yè)務(wù)管理系統(tǒng)進(jìn)行研究。

    參考文獻(xiàn):

    [1] 劉艷平, 俞海英, 戎沁. Python模擬登錄網(wǎng)站并抓取網(wǎng)頁的方法[J]. 微電腦應(yīng)用. 2015(1): 58-60.

    [2] 李東來, 宛玲, 金武剛. 公共圖書館信息技術(shù)應(yīng)用[M]. 北京: 北京師范大學(xué)出版社, 2013(1).

    [3] 梁勇. Python語言程序設(shè)計(jì)(英文版)[M]. 北京: 機(jī)械工業(yè)出版社, 2013.

    猜你喜歡
    圖書館
    圖書館
    文苑(2019年20期)2019-11-16 08:52:12
    時(shí)間重疊的圖書館
    文苑(2018年17期)2018-11-09 01:29:40
    圖書館
    飛躍圖書館
    去圖書館
    兰溪市| 嘉荫县| 丰宁| 石景山区| 星座| 衡水市| 淳安县| 榆树市| 亳州市| 揭阳市| 锦屏县| 玉林市| 广西| 自治县| 潼南县| 泰宁县| 嘉祥县| 西安市| 蒙自县| 盈江县| 绵阳市| 昭苏县| 云阳县| 普安县| 玛曲县| 玉山县| 南江县| 金沙县| 汨罗市| 乐山市| 陇南市| 天峻县| 四会市| 罗山县| 寿宁县| 个旧市| 禄劝| 聂拉木县| 保靖县| 松阳县| 杭州市|