黃孝倫,王 東
(重慶市衛生信息中心,重慶 401120)
醫改監測不僅是了解和評價醫改的重要數據來源,也是科學決策、推進醫改的重要抓手[1]。但如何快速、有效地構建醫改監測平臺是各省市面臨的一個重要問題,這主要是因為各醫院系統存在異構性,而且系統數據與部分監測指標之間不一致,因此產生大量的系統改造和接口開放等費用。網絡爬蟲[2]是一個抓取網頁內容的程序,利用網頁格式特征進行網頁分析[3],可以快速、高效地獲取數據,并且可以實時更新數據,是構建醫改監測平臺指標數據庫的有力工具。文中依托重慶市醫療衛生信息專網,利用網絡爬蟲技術構造了一個采集系統,可從各醫院異構系統[4]中抓取指標數據,并按醫改監測平臺相關要求對數據進行處理,極大地提高了工作效率,降低了指標數據采集成本。
Selenium[5]是一個開源的、便攜式的基于Web應用的測試工具集合,最初是為網站自動化測試而開發的。Selenium直接運行在瀏覽器中,通過一系列命令來模擬用戶操作,如將界面元素定位、窗口跳轉、結果比較等命令轉化成實際的HTTP請求在瀏覽器中運行[6-7]。Selenium本身不帶瀏覽器,不支持瀏覽器的功能,需要與第三方瀏覽器結合使用。Selenium支持多種平臺(Windows,Linux,Solaris)、多種瀏覽器(IE,Firefox,Opera,Safari)和多種語言(Java,Ruby,Python,Perl,PHP,C#)。Chrome[8]是可在Headless模式下運行的瀏覽器。Headless瀏覽器可在Web瀏覽器的環境中提供對網頁的自動控制,但其通過命令行接口或使用網絡通信來執行,即以瀏覽器相同的方式呈現和解釋HTML[9-10]。
ChromeDriver通過Chrome的自動代理框架控制瀏覽器[11]。Selenium+Chrome借助ChromeDriver實現導航到網頁、用戶輸入、JavaScript執行等功能,簡單來說就是用瀏覽器來對目標URL進行解析、CSS渲染、JavaScript執行,通過API模擬用戶行為(鼠標點擊、鍵盤輸入),但不提供用戶界面渲染。
本采集系統主要采用CS模式,構成一個邏輯集中、物理分布的二級數據采集平臺,為實現區域醫療信息監測提供了數據源,如圖1所示。服務器端負責接收數據并交給醫改監測平臺進行存儲和處理;客戶端負責在各醫院信息系統中進行數據采集、清洗和傳輸,其主要采用Selenium+Chrome技術構建網絡爬蟲,根據配置文件定向抓取醫院信息資源。

圖1 系統架構
本采集系統的核心原理是利用網絡爬蟲技術構建指標數據庫。與傳統網絡爬蟲不同的是,本采集系統的客戶端根據指標特點構造網絡爬蟲,在醫院信息系統中抓取數據,大大簡化了網絡爬蟲的流程。由于各個醫院采用的是不同廠商的信息系統,數據所依賴的應用系統、數據庫管理系統或操作系統以及在存儲模式上都存在異構性,因此每個客戶端通過配置方式獲得指標數據在每個頁面中的元素位置,然后抓取相應數據,抓取流程見圖2。在程序運行時,客戶端根據配置文件生成Java源代碼[12-13],然后調用javac來編譯[14]。這種方式可以滿足各醫院自定義配置文件的需求,解決了異構系統帶來的阻礙。

圖2 抓取流程
2.2.1 URL及登錄信息配置
根據指標的數據來源,設置相應的URL鏈接種子庫,遍歷鏈接種子庫中所有的URL即可獲得醫改監測平臺所要求的所有指標數據。為了提高響應速度,本采集系統針對鏈接種子庫中每一條URL生成一個網絡爬蟲,以并行方式分別抓取相應系統中的數據。登錄驗證是網絡爬蟲抓取需要用戶權限的數據的必要模塊。在配置URL的同時,每一條URL對應一對用戶名和密碼,然后根據該憑證進行模擬登錄。配置后,系統根據配置信息生成登陸代碼。
public boolean Logoin(WebDriver driver,String url, String username, String password){
try{driver.get(url);
//根據配置信息獲取用戶名文本框
WebElement usertbox=driver.findElement(By.name("txtUserName"));
Usertbox.sendKeys(username);
//根據配置信息獲取密碼文本框
WebElement pwtbox=driver.findElement(By.name("txtPassword"));
pwtbox.sendKeys(password);
//根據配置信息獲取登陸按鈕
WebElement lgbtn=driver.findElement(By.name("btnLogin"));
Lgbtn.click();
……
}
由于部分系統的session憑證設定了時效,session自動失效時,系統會要求用戶重新登錄。為了解決這個問題,在檢測到異常頁面URL時重新模擬登錄,獲取新的session;同時,當抓取完數據后,自動退出系統。瀏覽器登錄系統抓取數據時采用Headless模式,無需顯示圖形界面,代碼如下:
public static WebDriver getWebDriver(Page page) {
System.setProperty("webdriver.chrome.driver","E:\Web\chromedriver_win32\chromedriver.exe");
ChromeOptions chromeOptions=new ChromeOptions();
//設置為Headless模式
chromeOptions.addArguments("--headless");
WebDriver driver=new ChromeDriver(chromeOptions);
driver.get(page.getUrl());
return driver;
}
}
2.2.2 數據抓取
登入系統后,采用配置方式獲取指標數據在系統頁面中的位置元素。雖然各醫院的業務系統存在異構性,但業務流程大體上是一致的。因此在抓取指標數據時,本采集系統根據不同系統設計了一個基本的流程模版。各醫院在配置時可依據該模版進行調整。以“向基層醫療衛生機構轉診人次數”指標為例,其所在的系統截圖如圖3所示。在配置該指標的位置標簽時,需先點擊“雙向轉診”按鈕展開菜單,然后在菜單中點擊“下轉管理”按鈕,最后點擊“查詢”按鈕,在該頁面抓取總條數即獲得該醫院向基層醫療衛生機構轉診的人次數。該過程對應的配置文件及對應的關鍵代碼如下。元素“el-menu”用于存儲菜單名(元素“el-button”用于按鈕名),元素“value”存儲對應元素在頁面中的位置屬性。

圖3 轉診表列表圖
public void ZZTarget(WebDriver driver){
……
//跳轉到leftFrame
driver.switchTo().frame("leftFrame");
//點擊雙選轉診按鈕
WebElement path1=driver.findElement(By.xpath("http://*[@id='form1']/bt[5]"));
path1.click();
//點擊下轉管理菜單
WebElement path2=driver.findElement(By.xpath("http://*[@id='href']/h3/a"));
path2.click();
//跳轉到rightFrame
driver.switchTo().frame("rightFrame");
//點擊查詢按鈕
WebElement path3=driver.findElement(By.xpath("http://*[@id='xzcontent']"));
path3.click();
//獲取向基層醫療機構轉診人次數
WebElement zztarget=driver.findElement(By.xpath("http://*[@id='totalcount']/h1"));
Stringxzcount= zztarget.getText();
……
}
2.2.3 數據存儲及清洗
由于網絡爬蟲抓取的大都是醫院的業務系統,不斷抓取數據時可能會影響醫院業務工作的正常進行,因此本采集系統在客戶端將網絡爬蟲抓取的原始頁面文件進行緩存,減少網絡爬蟲對醫院業務系統造成的負擔。在出現問題時,通過讀取緩存頁面獲取數據,不必重新進行抓取。
由于抓取的數據來自不同醫院的多個系統,在格式、內容方面都需要進行相應的清洗處理[15],主要包含以下幾個方面:
(1)指標匯總處理。
由于各醫院信息系統建設時依照的是原有相關標準,如系統按2004版收費項目設定了“掛號費”及“診查費”。但是,醫改監測平臺是按新的相關標準開發的,如按新修訂的《重慶市醫療服務項目價格表》增加了“診察費收入”,其與“掛號費”及“診查費”對應。這導致醫院系統與醫改監測平臺存在指標數據不完全一致的問題。因此,抓取的數據以二維表(見表1)的形式存儲在客戶端,該表中的指標數據與醫院系統一一對應,便于跟蹤分析。同時,按照醫改監測平臺的指標要求抓取醫院信息系統中“掛號費”及“診查費”,然后進行匯總處理。

表1 指標二維表
(2)數據描述一致性處理。
各醫院是根據自身特點建設的系統,在某些描述方面可能存在不一致性,如“患者情況”這個指標中,有的醫院將患者情況采用“1=感受較好,2=感受一般,3=感受較差,4=無感受”,而有的醫藥可能采用其他方式進行描述。因此,在客戶端抓取到數據后要按醫改監測平臺要求,對數據描述進行一致性處理。最后,將清洗好的標準數據上傳至醫改監測平臺。
2.2.4 數據質量控制
醫改監測平臺對數據的準確性要求比較高,同時對響應速度也有一定要求。為了更科學嚴謹地完成數據抓取過程,本采集系統通過以下3個方面進行改進。
(1)將指標集根據系統進行分類,如財務系統類指標、HIS系統類指標、RIS系統類指標等。每一類指標對于一個URL,即對應一個網絡爬蟲。這樣即可保證指標數據的準確性,還可以通過并發方式提高響應速度。
(2)部分醫療指標數據具有階段性,如“門診人次數”可能因秋季感冒發病率高而劇增,因此采用分階段統計法對抓取的數據進行準確性驗證。如果抓取的數據與統計值存在較大差異時,發出系統警報,采用人工方式對數據進行確認或重新抓取。
(3)根據醫改監測指標定義及審核條件對抓取數據進行審核,如病床使用率定義為實際占用總床日數/實際開放總床日數×100%,且要求小于150%。抓取數據時按該定義進行復核,如果病床使用率大于150%,則警報提示至人工核對處理。
自2017年啟動重慶市公立醫院綜合改革以來,本中心針對226家參加改革的公立醫院設置了預約量、門急診量、醫務人員數量、醫生排班、醫生坐診日志、病床使用情況等116個基礎監測指標及醫療服務效率、質量、病人醫藥費用等40余項分析監測指標,并將156個監測指標再次細分為多個細項數據。
經測試,本采集系統可采集到涉及收入支出、醫療服務量、醫保報銷、分級診療、床位使用、醫師出診、重點人群服務及公立醫院改革情況等內容的部分指標(圖4為全市次均門診費用指標的明細列表),基本上可以滿足醫改監測平臺要求。

圖4 全市次均門診費用圖
其優勢如下:
(1)開發成本低,各醫院不需承擔接口開放、升級等費用,簡單安裝即可上線使用;
(2)配置靈活,各醫院可根據自己的系統特點按醫改監測平臺的指標要求進行配置即可,無需進行系統改造,且不需考慮異構系統帶來的問題;
(3)可滿足動態調整指標體系的需求。
本采集系統的不足之處在于初始化配置時,工作量較大,且抓取的數據量較大時對HIS系統業務有一定影響(加大硬件性能可以解決或在業務較少期間進行抓取)。
醫療大數據往往存在數量龐大、系統異構等問題,如何快速獲取數據并解決系統異構性是目前醫療衛生信息化研究亟待解決的問題。文中采用網絡爬蟲技術在各異構系統間進行抓取,將全市各醫院的異構系統構成一個松散耦合結構,保證了數據的完整性、準確性,提高了數據質量和利用效率。所構建的醫改監測指標數據庫,在醫療大數據的提取、分析方面具有一定實用價值。