a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁(yè) > 編程 > Regex > 正文

利用正則表達(dá)式抓取博客園列表數(shù)據(jù)

2020-03-16 21:04:08
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

這篇文章主要介紹了利用正則表達(dá)式抓取博客園列表數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下

鑒于我在要完成的asp.net MVC 3 仿照博客園企業(yè)系統(tǒng)要用到測(cè)試數(shù)據(jù),我自己輸入太累,所以我就抓取了博客園的部分列表數(shù)據(jù),還請(qǐng)dudu不要見(jiàn)怪。

在抓取博客園數(shù)據(jù)的時(shí)候采用了正則表達(dá)式,所以有不熟悉正則表達(dá)式的朋友可以參考相關(guān)資料,其實(shí)很容易掌握,就是在具體的實(shí)例中會(huì)花些時(shí)間。

現(xiàn)在我就來(lái)把我抓取博客園數(shù)據(jù)的過(guò)程敘述一下,如果有朋友有更好的意見(jiàn),歡迎提出來(lái)。

要使用正則表達(dá)式抓取數(shù)據(jù),首先就要?jiǎng)?chuàng)建一個(gè)正則表達(dá)式進(jìn)行匹配,我推薦使用regulator,這個(gè)正則表達(dá)式工具,我們可以先使用這個(gè)工具把我們要使用的正則表達(dá)式拼接出來(lái),然后在程序中使用。

我發(fā)現(xiàn)博客園的首頁(yè)列表可以通過(guò)http://www.cnblogs.com/p1,p2...這種方式來(lái)直接訪(fǎng)問(wèn),這樣我們就可以直接通過(guò)url獲取數(shù)據(jù),而不用模擬數(shù)據(jù)點(diǎn)擊事件來(lái)虛擬的點(diǎn)擊下一頁(yè)的那個(gè)按鈕獲取數(shù)據(jù),更加方便。因?yàn)槲业哪康木褪亲ト∫恍?shù)據(jù),所以就簡(jiǎn)單點(diǎn)。

1.首先就是要寫(xiě)對(duì)應(yīng)的sql Helper類(lèi),相信這是很多程序員都會(huì)掌握的,無(wú)非就是增刪改查的操作。在創(chuàng)建好了sqlhelper類(lèi)之后,我們就可以開(kāi)始進(jìn)行抓取數(shù)據(jù)的邏輯處理。

2.創(chuàng)建BlogRegexController

 

 
  1. public class BlogRegexController : Controller 
  2. public void ExecuteRegex() 
  3. string strBaseUrl = "http://www.cnblogs.com/p"; //定義博客園可以訪(fǎng)問(wèn)的列表數(shù)據(jù)的基地址 
  4. for (int i = ; i <= ; i++)//因?yàn)椴┛蛨@首頁(yè)列表最大只有頁(yè),所以我們這個(gè)循環(huán)就執(zhí)行次 
  5. string strUrl = strBaseUrl + i.ToString(); 
  6. BlogRege blogRegex = new BlogRege(); //定義的具體的Regex類(lèi) 抓取博客園地址 
  7. string result = blogRegex.SendUrl(strUrl); 
  8. blogRegex.AnalysisHtml(result); 
  9.  
  10. Response.Write("獲取成功"); 
  11.  
  12. // 
  13. // GET: /BlogRegex/ 
  14.  
  15. public ActionResult Index() 
  16. ExecuteRegex(); 
  17. return View(); 
  18.  

在controller中的ExecuteRegex()方法就是執(zhí)行抓取博客園列表數(shù)據(jù)的功臣。

3.首先就是其中定義的BlogRege類(lèi),他負(fù)責(zé)抓取博客園列表數(shù)據(jù)并將其插入到數(shù)據(jù)庫(kù)中

 

  1. public class BlogRege 
  2. //負(fù)責(zé)把數(shù)據(jù)插入到數(shù)據(jù)庫(kù)中 使用到的是sqlhelper類(lèi) 
  3. public void Insert(string title, string content,string linkurl, int categoryID = ) 
  4. SqlHelper helper = new SqlHelper(); 
  5. helper.Insert(title, content, categoryID,linkurl); 
  6. /// <summary> 
  7. /// 通過(guò)Url地址獲取具體網(wǎng)頁(yè)內(nèi)容 發(fā)起一個(gè)請(qǐng)求獲得html內(nèi)容 
  8. /// </summary> 
  9. /// <param name="strUrl"></param> 
  10. /// <returns></returns> 
  11. public string SendUrl(string strUrl) 
  12. try 
  13. WebRequest webRequest = WebRequest.Create(strUrl); 
  14. WebResponse webResponse = webRequest.GetResponse(); 
  15. StreamReader reader = new StreamReader(webResponse.GetResponseStream()); 
  16. string result = reader.ReadToEnd(); 
  17. return result; 
  18. catch (Exception ex) 
  19. throw ex; 
  20. /// <summary> 
  21. /// 分析Html 解析出里面具體的數(shù)據(jù) 
  22. /// </summary> 
  23. /// <param name="htmlContent"></param> 
  24. public void AnalysisHtml(string htmlContent) 
  25. {//這個(gè)就是我在regulator正則表達(dá)式工具中拼接獲取到的正則表達(dá)式 還有一點(diǎn)請(qǐng)注意就是轉(zhuǎn)義字符的問(wèn)題 
  26. string strPattern = "<div//s*class=/"post_item/">//s*.*//s*.*//s*.*//s*.*//s*.*//s*.*//s*.*//s*<div//s*class=/"post_item_body/">//s*<h><a//s*class=/"titlelnk/"//s*href=/"(?<href>.*)/"//s*target=/"_blank/">(?<title>.*)</a>.*//s*<p//s*class=/"post_item_summary/">//s*(?<content>.*)//s*</p>"
  27. Regex regex = new Regex(strPattern, RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.CultureInvariant); 
  28. if (regex.IsMatch(htmlContent)) 
  29. MatchCollection matchCollection = regex.Matches(htmlContent); 
  30. foreach (Match match in matchCollection) 
  31. string title = match.Groups[].Value;//獲取到的是列表數(shù)據(jù)的標(biāo)題 
  32. string content = match.Groups[].Value;//獲取到的是內(nèi)容 
  33. string linkurl=match.Groups[].Value;//獲取到的是鏈接到的地址 
  34. Insert(title, content,linkurl);//執(zhí)行插入到數(shù)據(jù)庫(kù)的操作 

4.通過(guò)上面的代碼我們可以很輕松的從博客園中獲取我們用來(lái)測(cè)試的數(shù)據(jù),方便快捷,而且真實(shí),比我們手動(dòng)輸入的速度要快很多。

正則表達(dá)式其實(shí)不應(yīng)該算是一種語(yǔ)言,只能算是一種語(yǔ)法,因?yàn)槿魏蔚恼Z(yǔ)言包括C#,javascript等語(yǔ)言都對(duì)正則表達(dá)式有很好的支持,只是他們的使用語(yǔ)法稍有不同,其實(shí)只要我們可以正確的拼接出正則表達(dá)式,那么我們抓取任何網(wǎng)站的內(nèi)容都可以很輕松的做到。前一段我試著抓取了淘寶的數(shù)據(jù),一共抓取了有幾百萬(wàn)條,我想應(yīng)該還有很多沒(méi)有抓取到,不得不佩服淘寶,數(shù)據(jù)量太大。

回到我們使用的C#語(yǔ)言上,其實(shí)對(duì)正則表達(dá)式也有著非常好的支持,Regex就是用來(lái)對(duì)正則表達(dá)式進(jìn)行操作的類(lèi),所有的對(duì)正則表達(dá)式的操作都在這個(gè)類(lèi)中。

如果你對(duì)正則表達(dá)式還不是太熟悉,網(wǎng)上有一篇正則表達(dá)式30分鐘入門(mén)教程,大家可以參考一下,寫(xiě)的很不錯(cuò)。再加上使用一個(gè)正則表達(dá)式工具,相信可以抓取到任何你想的內(nèi)容。

在拼接正則表達(dá)式的時(shí)候,可能會(huì)花費(fèi)很長(zhǎng)時(shí)間,畢竟要分析html結(jié)構(gòu),從中抓取內(nèi)容。希望大家可以沉住氣,因?yàn)橹灰齽t表達(dá)式拼接正確,那么一定可以抓取正確的內(nèi)容。

為了避免大家說(shuō)只說(shuō)不做,那么我就把我抓取的博客園首頁(yè)內(nèi)容秀一下,因?yàn)椴┛蛨@首頁(yè)數(shù)據(jù)會(huì)有更新,所以大家可以看到這些數(shù)據(jù)都是在博客園中順序存在的。

利用正則表達(dá)式抓取博客園列表數(shù)據(jù)

博客園每頁(yè)列表是20條,一共200頁(yè),所以一共是4000條。數(shù)據(jù)抓取正確。

我以前說(shuō)過(guò),只是會(huì)代碼的程序員不一定是合格程序員,程序員應(yīng)該盡可能的減少自己的工作量,因?yàn)槲覀兌际歉咧巧痰娜恕K晕覀儜?yīng)該積極的學(xué)習(xí)各種對(duì)我們的工作有幫助的框架或者是方法,比如IOC、Entity Framework或Nhibernate框架來(lái)減輕我們開(kāi)發(fā)維護(hù)代碼的負(fù)擔(dān),畢竟我們聽(tīng)到需求要更改的反映,一般都是憤怒,然后大罵,最后才是修改。有些框架能夠幫助我們,給我們維護(hù)代碼帶來(lái)好心情,何樂(lè)而不為呢。

我最后說(shuō)一句,因?yàn)槲乙_(kāi)發(fā)一個(gè)簡(jiǎn)單的仿照博客園的網(wǎng)站(MVC3),所以會(huì)用到各種技術(shù)準(zhǔn)備,我提前寫(xiě)出來(lái)把這些要用到的內(nèi)容整理一下,為以后的開(kāi)發(fā)加速。

下一次,我準(zhǔn)備整理一下在MVC中使用文本編輯器KindEditor的方法,希望大家如果有好的意見(jiàn)或者資料可以提供一下,讓我也增加一些見(jiàn)識(shí)。謝謝各位

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 婷婷精品久久久久久久久久不卡 | 久久国产精品亚州精品毛片 | 欧美2区| 国产一区二 | 婷婷中文字幕 | 操碰97| 精品一区二区网站 | 日本一区二区高清视频 | 北条麻妃国产九九九精品小说 | 国产精品成av人在线视午夜片 | 一区二区三区四区日韩 | 91丨九色丨国产在线 | 久久国产精品一区 | 日本免费网 | 成人高清 | 亚洲乱码国产乱码精品精 | 久久久久久电影 | 日韩欧美国产电影 | 91,看片| 国产精品成人av | 91免费在线看 | 亚洲另类视频 | 国产精品国产精品国产专区不片 | 欧美日韩精品一区二区 | 成人一级 | 日韩精品在线一区 | 欧美日韩一区精品 | 国产一区二区三区四区视频 | 国产成人精品久久 | 久久99国产精品 | 海外中文字幕在线观看 | 天天宗合网| 国产福利资源 | www.com91| 久久久水蜜桃 | 精品国产福利 | 欧美日韩一 | 欧美综合第一页 | 色网在线 | 97国产超碰 | 久久久青草婷婷精品综合日韩 |