首先從標(biāo)題說起,為啥說抓取網(wǎng)站數(shù)據(jù)不再難(其實(shí)抓取網(wǎng)站數(shù)據(jù)有一定難度),SO EASY!??!使用Fizzler全搞定,我相信大多數(shù)人或公司應(yīng)該都有抓取別人網(wǎng)站數(shù)據(jù)的經(jīng)歷,比如說我們博客園每次發(fā)表完文章都會被其他網(wǎng)站給抓取去了,不信你們看看就知道了。還有人抓取別人網(wǎng)站上的郵箱、電話號碼、QQ等等有用信息,這些信息抓取下來肯定可以賣錢或者干其他事情,我們每天都會時不時接到垃圾短信或郵件,可能就這么回事了,有同感吧,O(∩_∩)O哈哈~。
本人前段時間了寫了兩個程序,一個程序是抓取某彩票網(wǎng)站的數(shù)據(jù)(雙色球),一個是抓取求職網(wǎng)站(獵聘、前程無憂、智聯(lián)招聘等等)的數(shù)據(jù),當(dāng)時在寫這兩個程序的時候顯示尤為棘手,看到一堆的HTML標(biāo)簽真的是想死。首先來回顧一下之前我是如何解析HTML的,非常常規(guī)的做法,通過WebRequest拿到HTML內(nèi)容,再通過HTML標(biāo)簽一步一步截取你想要的內(nèi)容,以下代碼就是截取雙色球的紅球和籃球的代碼。一旦網(wǎng)站的標(biāo)簽發(fā)生一點(diǎn)變化可能面臨的就是要重新改程序了,使用起來非常不方便。
下面是我在解析雙色球的紅球和籃球的代碼,做得最多的是截?。ㄕ齽t表達(dá)式)標(biāo)簽相應(yīng)的內(nèi)容,也許這段代碼顯得還不是很復(fù)雜,因?yàn)檫@個截取的數(shù)據(jù)有限,而且非常有規(guī)律所以顯得比較簡單。
1 #region * 在一個TR中,解析TD,獲取一期的號碼 2 /// <summary> 3 /// 在一個TR中,解析TD,獲取一期的號碼 4 /// </summary> 5 /// <param name="wn"></param> 6 /// <param name="trContent"></param> 7 PRivate void ResolveTd(ref WinNo wn, string trContent) 8 { 9 List<int> redBoxList = null;10 //匹配期號的表達(dá)式11 string patternQiHao = "<td align=/"center/" title=/"開獎日期";12 Regex regex = new Regex(patternQiHao);13 Match qhMatch = regex.Match(trContent);14 wn.QiHao = trContent.Substring(qhMatch.Index + 17 + patternQiHao.Length, 7);15 //匹配藍(lán)球的表達(dá)式16 string patternChartBall02 = "<td class=/"chartBall02/">";17 regex = new Regex(patternChartBall02);18 Match bMatch = regex.Match(trContent);19 wn.B = Convert.ToInt32(trContent.Substring(bMatch.Index + patternChartBall02.Length, 2));20 //存放匹配出來的紅球號碼21 redBoxList = new List<int>();22 //匹配紅球的表達(dá)式23 string patternChartBall01 = "<td class=/"chartBall01/">";24 regex = new Regex(patternChartBall01);25 MatchCollection rMatches = regex.Matches(trContent);26 foreach (Match r in rMatches)27 {28 redBoxList.Add(Convert.ToInt32(trContent.Substring(r.Index + patternChartBall01.Length, 2)));29 }30 //匹配紅球的表達(dá)式31 string patternChartBall07 = "<td class=/"chartBall07/">";32 regex = new Regex(patternChartBall07);33 rMatches = regex.Matches(trContent);34 foreach (Match r in rMatches)35 {36 redBoxList.Add(Convert.ToInt32(trContent.Substring(r.Index + patternChartBall07.Length, 2)));37 }38 //排序紅球號碼39 redBoxList.Sort();40 //第一個紅球號碼41 wn.R1 = redBoxList[0];42 //第二個紅球號碼43 wn.R2 = redBoxList[1];44 wn.R3 = redBoxList[2];45 wn.R4 = redBoxList[3];46 wn.R5 = redBoxList[4];47 wn.R6 = redBoxList[5];48 }
下面這塊的代碼是某招聘網(wǎng)站的截取數(shù)據(jù),就是一串的截取HTML標(biāo)簽的內(nèi)容,哈哈,當(dāng)時在寫這個時候相當(dāng)?shù)念^痛,不知有做個這方法工作的人是不是有同感,當(dāng)你解析比較多網(wǎng)站的數(shù)據(jù)就更加了(我寫了抓取前程無憂、獵聘網(wǎng)、前程無憂和拉勾網(wǎng)的數(shù)據(jù)),O(∩_∩)O哈哈~想死呀,使用正則表達(dá)是去截取數(shù)據(jù),再去提取相應(yīng)信息的工作。
// 正則表達(dá)式過濾:正則表達(dá)式,要替換成的文本        private static readonly string[][] Filters =        {            new[] { @"(?is)<scr
新聞熱點(diǎn)
疑難解答