引言

最近項目有需求從一個老的站點抓取信息然后倒入到新的系統(tǒng)中。由于老的系統(tǒng)已經(jīng)沒有人維護,數(shù)據(jù)又比較分散,而要提取的數(shù)據(jù)在網(wǎng)頁上表現(xiàn)的反而更統(tǒng)一,所以計劃通過網(wǎng)絡(luò)請求然后分析頁面的方式來提取數(shù)據(jù)。而兩年前的這個時候,我似乎做過相同的事情——緣分這件事情,真是有趣。

設(shè)想

在采集信息這件事情中,最麻煩的往往是不同的頁面的分解、數(shù)據(jù)的提取——因為頁面的設(shè)計和結(jié)構(gòu)往往千差萬別。同時,對于有些頁面,通常不得不繞著彎子請求(ajax、iframe等),這導(dǎo)致數(shù)據(jù)提取成了最耗時也最痛苦的過程——因為你需要編寫大量的邏輯代碼將整個流程串聯(lián)起來。我隱隱記得15年的7月,也就是兩年前的這個時候,我就思考過這個問題。當時引入了一個類型CommonExtractor來解決這個問題。總體的定義是這樣的:

    public class CommonExtractor
    {        public CommonExtractor(PageProcessConfig config)        {
            PageProcessConfig = config;
        }        protected PageProcessConfig PageProcessConfig;        public virtual void Extract(CrawledHtmlDocument document)        {            if (!PageProcessConfig.IncludedUrlPattern.Any(i => Regex.IsMatch(document.FromUrl.ToString(), i)))                return;