引言

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

設(shè)想

在采集信息這件事情中,最麻煩的往往是不同的頁(yè)面的分解、數(shù)據(jù)的提取——因?yàn)轫?yè)面的設(shè)計(jì)和結(jié)構(gòu)往往千差萬(wàn)別。同時(shí),對(duì)于有些頁(yè)面,通常不得不繞著彎子請(qǐng)求(ajax、iframe等),這導(dǎo)致數(shù)據(jù)提取成了最耗時(shí)也最痛苦的過(guò)程——因?yàn)槟阈枰帉懘罅康倪壿嫶a將整個(gè)流程串聯(lián)起來(lái)。我隱隱記得15年的7月,也就是兩年前的這個(gè)時(shí)候,我就思考過(guò)這個(gè)問(wèn)題。當(dāng)時(shí)引入了一個(gè)類型CommonExtractor來(lái)解決這個(gè)問(wèn)題??傮w的定義是這樣的:

    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;