溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2021-09-28 16:51:02 來(lái)源:億速云 閱讀:101 作者:小新 欄目:互聯(lián)網(wǎng)科技

這篇文章主要為大家展示了“如何利用正則表達(dá)式抓取博客園列表數(shù)據(jù)”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“如何利用正則表達(dá)式抓取博客園列表數(shù)據(jù)”這篇文章吧。

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

現(xiàn)在我就來(lái)把我抓取博客園數(shù)據(jù)的過(guò)程敘述一下,如果有朋友有更好的意見,歡迎提出來(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)直接訪問(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.首先就是要寫對(duì)應(yīng)的sql Helper類,相信這是很多程序員都會(huì)掌握的,無(wú)非就是增刪改查的操作。在創(chuàng)建好了sqlhelper類之后,我們就可以開始進(jìn)行抓取數(shù)據(jù)的邏輯處理。

2.創(chuàng)建BlogRegexController

public class BlogRegexController : Controller
   {
     public void ExecuteRegex()
     {
       string strBaseUrl = "http://www.cnblogs.com/p"; //定義博客園可以訪問(wèn)的列表數(shù)據(jù)的基地址
       for (int i = ; i <= ; i++)//因?yàn)椴┛蛨@首頁(yè)列表最大只有頁(yè),所以我們這個(gè)循環(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類,他負(fù)責(zé)抓取博客園列表數(shù)據(jù)并將其插入到數(shù)據(jù)庫(kù)中

public class BlogRege
   {   //負(fù)責(zé)把數(shù)據(jù)插入到數(shù)據(jù)庫(kù)中 使用到的是sqlhelper類
     public void Insert(string title, string content,string linkurl, int categoryID = )
     {
       SqlHelper helper = new SqlHelper();
       helper.Insert(title, content, categoryID,linkurl);
     }
     /// <summary>
     /// 通過(guò)Url地址獲取具體網(wǎng)頁(yè)內(nèi)容 發(fā)起一個(gè)請(qǐng)求獲得html內(nèi)容
     /// </summary>
     /// <param name="strUrl"></param>
     /// <returns></returns>
     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;
       }
     }
     /// <summary>
     /// 分析Html 解析出里面具體的數(shù)據(jù)
     /// </summary>
     /// <param name="htmlContent"></param>
     public void AnalysisHtml(string htmlContent)
     {//這個(gè)就是我在regulator正則表達(dá)式工具中拼接獲取到的正則表達(dá)式 還有一點(diǎn)請(qǐng)注意就是轉(zhuǎn)義字符的問(wèn)題
       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>";
       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ù)的標(biāo)題
           string content = match.Groups[].Value;//獲取到的是內(nèi)容
           string linkurl=match.Groups[].Value;//獲取到的是鏈接到的地址
          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)該還有很多沒有抓取到,不得不佩服淘寶,數(shù)據(jù)量太大。

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

如果你對(duì)正則表達(dá)式還不是太熟悉,網(wǎng)上有一篇正則表達(dá)式30分鐘入門教程,大家可以參考一下,寫的很不錯(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ù)抓取正確。

以上是“如何利用正則表達(dá)式抓取博客園列表數(shù)據(jù)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI