陳帆把手機塞回褲兜,沒回短信,也沒再看第二眼。他轉身走進街角的公用電話亭,投幣撥通了市科委實驗室的線路。電話響了四聲,自動答錄機啟動,他聽見自己三天前錄下的測試語音:“服務器運行正常,數據采集器待命。”他掛了電話,抬腳往老城區方向走。
天快黑了,風從巷口斜穿過來,吹得他衣角貼在腿上。他走得不快,腦子裡還在過剛才那條短信的措辭。不是深圳那邊問你——是“**深圳那邊問你**”。七個字,沒稱呼,沒落款,卻像一道指令落下來。他沒去想背後是誰,隻清楚一件事:係統現在必須更快、更獨立,不能再依賴任何人的接口,也不能再卡在人工錄入的瓶頸上。
三輪車停在教學樓後門,他把背包和一台二手掃描儀搬下來,鎖好車,直奔三樓307教室。
門一推開,灰塵在斜照進來的路燈下浮著。他沒開大燈,隻擰亮桌邊的台燈,屏幕映出他剛進門時的臉。服務器風扇轉著,綠色指示燈穩定閃爍,數據庫日誌顯示最後一次更新在二十分鐘前,是他離開證券公司前設定的自動同步任務。他插上U盤,把今天帶出的核心參數導入本地環境,然後打開一個命名為“DataCapture”的文件夾。
裡麵是過去三個月他親手抄錄的《中國證券報》剪報電子版,共八十七張表格,每一行數字都來自淩晨四點的逐字核對。他盯著這些數據看了一會兒,雙擊運行新寫的OCR識彆程序。
界麵彈出來,灰底黑字,沒有圖形按鈕,隻有一行提示:“加載模板庫中……”
幾秒後,彈出進度條。第一張報紙掃描圖被載入,係統開始逐行掃描表格區域。邊緣增強算法啟動,圖像變清晰了些。識彆進程跳到30%時,程序卡住,內存溢出提示跳出。他關掉窗口,調低分辨率,重新運行。
第三次嘗試,識彆完成。結果對比顯示,印刷體數字準確率92.1%,但手寫批注區錯誤頻發,尤其是“—”和“0”混淆,“6”被認成“8”。他記下錯誤類型,打開代碼編輯器,手動添加規則:當字符高度低於閾值且筆畫閉合不全時,優先匹配負號;連續兩個相似誤判則觸發人工複核標記。
他保存更新版本,重命名程序為“DataHarvesterv0.2”,然後放進後台定時任務,每小時自動處理一張新掃描圖。屏幕右下角時間跳到晚上八點二十三分,第一輪測試結束,六張報紙數據成功轉入Access數據庫,僅三處需人工乾預。
他正準備記錄日誌,門外傳來腳步聲。
林悅推門進來,手裡提著飯盒,發梢沾了點雨氣。她把飯放在桌上,沒說話,先看了眼顯示器。“又通宵?”
“還沒開始。”他說,順手點了點鼠標喚醒屏幕,進度條正跳向第七張。
她走近看:“這東西真能認字?”
“現在能認九成。”他靠在椅背上,聲音有點啞,“剩下的,得人來補。”
“哪九成?”她問。
“印的。手寫的不行。”
她拉開椅子坐下,接過鼠標:“那我就補手寫的。”
他沒攔她。她打開另一台終端,調出原始掃描圖與識彆結果對照界麵,一邊核對一邊標注修正項。兩人沒再說話,隻有鍵盤敲擊聲和偶爾的提示音。窗外天色徹底暗下來,遠處高架橋上的車燈拉出細長的光帶。
到夜裡十一點,三十二張報紙數據完成遷移。林悅揉了揉眼睛,指著其中一條記錄:“這個‘漲幅’後麵的手寫數字,你看是‘5.3’還是‘6.3’?”
他湊過去看,放大圖像。紙麵有折痕,墨跡暈開了一角。他拖動對比工具,調出同一位置的前日報紙字體樣本,比對筆鋒走向。
“是5。”他說,“收筆沒有上挑。”
她點頭,輸入修正值,提交入庫。
靜了幾秒,她忽然說:“你說機器是為了省時間,不是替人。可你現在做的,是不是讓機器慢慢學會替你做決定?”
他搖頭:“它隻是讀字。怎麼用這些字,還是人在定。”
她沒再問,合上筆記本,起身收拾飯盒。走到門口時,她停下,從包裡抽出一張便簽紙,寫下一行字,貼在顯示器邊框上:“彆忘了睡覺。係統重要,人更重要。”
門關上後,教室隻剩他一個人。
他盯著那張便簽看了兩秒,轉頭看向服務器狀態麵板。網絡連接正常,硬盤讀寫頻率穩定。他打開另一個項目目錄,雙擊進入“WebCrawlerTest”文件夾。
這是他昨天就開始寫的網頁抓取腳本。基於VBScript,調用WinInetAPI模擬HTTP請求,目標是“新浪財經”首頁的早盤快訊欄。他知道1998年的網站大多不用動態加載,內容直接嵌在HTML裡,隻要找到規律,就能批量提取。
他啟動程序。
命令行窗口閃出幾行返回碼,接著輸出一段HTML源碼。標題抓到了,發布時間也解析出來,但正文鏈接全部為空。他檢查網頁結構,發現部分條目用了JavaScript跳轉,而他的腳本無法執行腳本代碼。
他改用最笨的辦法:手動分析URL規則。發現某些欄目頁麵的路徑遵循“year/mont”格式。他根據當天日期生成一組預測鏈接,逐個發起請求。
第四個鏈接成功返回內容。是一條關於央行票據發行的消息,共三百二十七字。他讓程序將文本清洗後存入數據庫,並標記來源和時間戳。
效率很低。每請求一次,撥號網絡要等待十五到四十秒,斷線兩次後自動重撥。他設定循環間隔為六分鐘,預計每小時最多抓取十條有效信息。
淩晨一點十七分,爬蟲完成首輪二十四小時周期測試。共獲取八十三條新聞記錄,其中完整正文五十九條。他導出數據,與當日《中國證券報》進行交叉比對,重複率64%,新增信息源來自地方股評欄目和交易所公告摘要。
他靠在椅背上,閉眼三分鐘,腦子卻還在跑流程。OCR識彆已經半自動化,每天能消化三十張報紙;網絡爬蟲雖然慢,但隻要不斷線,就能持續填充數據庫。這兩條數據流一旦並行運轉,係統的更新頻率就能從“每日手動推送”變成“準實時滾動”。
他睜開眼,打開數據庫管理界麵,新建一個名為“DataSourceMerge”的視圖,將OCR錄入表與爬蟲抓取表按時間戳合並。刷新後,屏幕上出現一條連續的時間軸,最早是早上六點零三分,一條關於外彙牌價調整的簡訊,來自網頁抓取;最新一條是七點四十八分,某鋼鐵廠產能擴張的報道,來自昨日報紙掃描。
中間沒有斷層。
他手指停在回車鍵上,又按了一次刷新。數據流緩緩推進,像一條開始流動的河。
他打開記事本,寫下一行部署計劃:
明早八點,掃描剩餘報紙;
上午優化OCR誤判規則;
下午重構爬蟲邏輯,加入斷點續傳和失敗重試機製;
晚上測試雙源數據自動校驗功能。
寫完,他插入一張空白CDR,將整個“DataHarvesterv0.2”項目打包刻錄。光驅讀寫完畢,他取出光盤,在標簽上寫下日期和版本號,放進抽屜。
抬頭看牆上的掛鐘,指針指向兩點零五分。
他沒動,也沒起身關機。服務器風扇依舊低鳴,屏幕上的數據流仍在緩慢更新。他盯著最新一條入庫記錄的發布時間,輕聲說:“開始了。”
就在這時,電話響了。