這篇文章主要為大家展示了“如何利用正則表達式抓取博客園列表數(shù)據(jù)”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學習一下“如何利用正則表達式抓取博客園列表數(shù)據(jù)”這篇文章吧。
站在用戶的角度思考問題,與客戶深入溝通,找到岱山網(wǎng)站設(shè)計與岱山網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站建設(shè)、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名與空間、網(wǎng)站空間、企業(yè)郵箱。業(yè)務覆蓋岱山地區(qū)。
在抓取博客園數(shù)據(jù)的時候采用了正則表達式,所以有不熟悉正則表達式的朋友可以參考相關(guān)資料,其實很容易掌握,就是在具體的實例中會花些時間。
現(xiàn)在我就來把我抓取博客園數(shù)據(jù)的過程敘述一下,如果有朋友有更好的意見,歡迎提出來。
要使用正則表達式抓取數(shù)據(jù),首先就要創(chuàng)建一個正則表達式進行匹配,我推薦使用regulator,這個正則表達式工具,我們可以先使用這個工具把我們要使用的正則表達式拼接出來,然后在程序中使用。
我發(fā)現(xiàn)博客園的首頁列表可以通過http://www.cnblogs.com/p1,p2...這種方式來直接訪問,這樣我們就可以直接通過url獲取數(shù)據(jù),而不用模擬數(shù)據(jù)點擊事件來虛擬的點擊下一頁的那個按鈕獲取數(shù)據(jù),更加方便。因為我的目的就是抓取一些數(shù)據(jù),所以就簡單點。
1.首先就是要寫對應的sql Helper類,相信這是很多程序員都會掌握的,無非就是增刪改查的操作。在創(chuàng)建好了sqlhelper類之后,我們就可以開始進行抓取數(shù)據(jù)的邏輯處理。
2.創(chuàng)建BlogRegexController
public class BlogRegexController : Controller { public void ExecuteRegex() { string strBaseUrl = "http://www.cnblogs.com/p"; //定義博客園可以訪問的列表數(shù)據(jù)的基地址 for (int i = ; i <= ; i++)//因為博客園首頁列表最大只有頁,所以我們這個循環(huán)就執(zhí)行次 { string strUrl = strBaseUrl + i.ToString(); BlogRege blogRegex = new BlogRege(); //定義的具體的Regex類 抓取博客園地址 string result = blogRegex.SendUrl(strUrl); blogRegex.AnalysisHtml(result); Response.Write("獲取成功"); } } // // GET: /BlogRegex/ public ActionResult Index() { ExecuteRegex(); return View(); } }
在controller中的ExecuteRegex()方法就是執(zhí)行抓取博客園列表數(shù)據(jù)的功臣。
3.首先就是其中定義的BlogRege類,他負責抓取博客園列表數(shù)據(jù)并將其插入到數(shù)據(jù)庫中
public class BlogRege { //負責把數(shù)據(jù)插入到數(shù)據(jù)庫中 使用到的是sqlhelper類 public void Insert(string title, string content,string linkurl, int categoryID = ) { SqlHelper helper = new SqlHelper(); helper.Insert(title, content, categoryID,linkurl); } ////// 通過Url地址獲取具體網(wǎng)頁內(nèi)容 發(fā)起一個請求獲得html內(nèi)容 /// /// ///public string SendUrl(string strUrl) { try { WebRequest webRequest = WebRequest.Create(strUrl); WebResponse webResponse = webRequest.GetResponse(); StreamReader reader = new StreamReader(webResponse.GetResponseStream()); string result = reader.ReadToEnd(); return result; } catch (Exception ex) { throw ex; } } /// /// 分析Html 解析出里面具體的數(shù)據(jù) /// /// public void AnalysisHtml(string htmlContent) {//這個就是我在regulator正則表達式工具中拼接獲取到的正則表達式 還有一點請注意就是轉(zhuǎn)義字符的問題 string strPattern = "\\s*.*\\s*.*\\s*.*\\s*.*\\s*.*\\s*.*\\s*.*\\s*\\s*.*)\"\\s*target=\"_blank\">(? .*) .*\\s*\\s*(?
"; Regex regex = new Regex(strPattern, RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.CultureInvariant); if (regex.IsMatch(htmlContent)) { MatchCollection matchCollection = regex.Matches(htmlContent); foreach (Match match in matchCollection) { string title = match.Groups[].Value;//獲取到的是列表數(shù)據(jù)的標題 string content = match.Groups[].Value;//獲取到的是內(nèi)容 string linkurl=match.Groups[].Value;//獲取到的是鏈接到的地址 Insert(title, content,linkurl);//執(zhí)行插入到數(shù)據(jù)庫的操作 } } } }.*)\\s* 4.通過上面的代碼我們可以很輕松的從博客園中獲取我們用來測試的數(shù)據(jù),方便快捷,而且真實,比我們手動輸入的速度要快很多。
正則表達式其實不應該算是一種語言,只能算是一種語法,因為任何的語言包括C#,javascript等語言都對正則表達式有很好的支持,只是他們的使用語法稍有不同,其實只要我們可以正確的拼接出正則表達式,那么我們抓取任何網(wǎng)站的內(nèi)容都可以很輕松的做到。前一段我試著抓取了淘寶的數(shù)據(jù),一共抓取了有幾百萬條,我想應該還有很多沒有抓取到,不得不佩服淘寶,數(shù)據(jù)量太大。
回到我們使用的C#語言上,其實對正則表達式也有著非常好的支持,Regex就是用來對正則表達式進行操作的類,所有的對正則表達式的操作都在這個類中。
如果你對正則表達式還不是太熟悉,網(wǎng)上有一篇正則表達式30分鐘入門教程,大家可以參考一下,寫的很不錯。再加上使用一個正則表達式工具,相信可以抓取到任何你想的內(nèi)容。
在拼接正則表達式的時候,可能會花費很長時間,畢竟要分析html結(jié)構(gòu),從中抓取內(nèi)容。希望大家可以沉住氣,因為只要正則表達式拼接正確,那么一定可以抓取正確的內(nèi)容。
為了避免大家說只說不做,那么我就把我抓取的博客園首頁內(nèi)容秀一下,因為博客園首頁數(shù)據(jù)會有更新,所以大家可以看到這些數(shù)據(jù)都是在博客園中順序存在的。
博客園每頁列表是20條,一共200頁,所以一共是4000條。數(shù)據(jù)抓取正確。
以上是“如何利用正則表達式抓取博客園列表數(shù)據(jù)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
網(wǎng)頁題目:如何利用正則表達式抓取博客園列表數(shù)據(jù)
路徑分享:http://weahome.cn/article/pgdpgs.html