前幾天自己負責的網站出現了不能訪問的問題,系統監控程式通過警示將這一資訊告訴了管理員。管理員找到了我,告訴我網站不能正常訪問。後來問題查明,是負載平衡器出了問題。自己在檢查網站的時候,發現有些圖片不能正確顯示,原因是圖片連結無效。
後來我就在總結這次故障,監控程式只能檢測幾個配置的連結,不可能對整個網站所有連結進行檢測,不然設定檔要寫一大堆。如果是配置外的連結不能訪問,那不是就沒有辦法告知管理員了嗎,況且現在的監控程式也不能檢查頁面圖片能否正常顯示。如果每次都要人工去檢查,那是相當不現實的,那我能不能寫個小程式去實現自動檢查,並把檢查結果已郵件的形式發送給相關人員呢?於是我想到了,可以使用網路爬蟲幹這件事情,當然這個爬蟲是定製版的,只爬當前網站。
首先建立一個控制台程式(其他類型的工程也可以),命名為WebResourceInspector。
建立三個檔案:Inspector.cs,EmailHelper.cs,config.xml。結果如下:
其中Inspector.cs是監控類,裡面利用HttpWebRequest實現資料爬取,分析。EmailHelper.cs是郵件協助類,發送郵件。config.xml是爬取網站的設定檔。還有很多配置資訊是寫在app.config裡面的。
工程裡面用到兩個dll,一個是log4net,這個是記錄日誌的,不多說了,大家可以去網上找到很多相關文章。另一個是HtmlAgilityPack,他用來解析你爬取的html資料,相當的強大,你可以把整個html作為dom來操作,使用xpath擷取link和img的資訊。
程式實現原理:
通過HttpWebRequest,HttpWebResponse擷取首頁的html資訊,通過HtmlAgilityPack結合xpath擷取到所有的a標籤和圖片。把所有的連結和圖片地址放到待檢查隊列unVisitedPageUrlList中。放入之前要檢查當前連結是否已經檢查過。只有已當前網站網域名稱開頭的連結才做頁面html的進一步爬取,擷取下面頁面的連結資訊並放入待檢查隊列。以此類推,直到網站內所有連結都檢查完畢。非本站網域名稱開頭連結只做可訪問性判斷。程式裡我使用了多線程,以提高運行效率。線程數在設定檔裡配置。把所有的錯誤記錄日誌,最後發送郵件,通知管理員。
代碼我貼出來了,有興趣的人可以下載後查看原始碼。:WebResourceInspector.zip