引言
最近項(xiàng)目有需求從一個(gè)老的站點(diǎn)抓取信息然后倒入到新的系統(tǒng)中。由于老的系統(tǒng)已經(jīng)沒有人維護(hù),數(shù)據(jù)又比較分散,而要提取的數(shù)據(jù)在網(wǎng)頁上表現(xiàn)的反而更統(tǒng)一,所以計(jì)劃通過網(wǎng)絡(luò)請(qǐng)求然后分析頁面的方式來提取數(shù)據(jù)。而兩年前的這個(gè)時(shí)候,我似乎做過相同的事情——緣分這件事情,真是有趣。
設(shè)想
在采集信息這件事情中,最麻煩的往往是不同的頁面的分解、數(shù)據(jù)的提取——因?yàn)轫撁娴脑O(shè)計(jì)和結(jié)構(gòu)往往千差萬別。同時(shí),對(duì)于有些頁面,通常不得不繞著彎子請(qǐng)求(ajax、iframe等),這導(dǎo)致數(shù)據(jù)提取成了最耗時(shí)也最痛苦的過程——因?yàn)槟阈枰帉懘罅康倪壿嫶a將整個(gè)流程串聯(lián)起來。我隱隱記得15年的7月,也就是兩年前的這個(gè)時(shí)候,我就思考過這個(gè)問題。當(dāng)時(shí)引入了一個(gè)類型CommonExtractor
來解決這個(gè)問題。總體的定義是這樣的:
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;