日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

抓取博客园列表数据

發(fā)布時(shí)間:2023/12/31 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 抓取博客园列表数据 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

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

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

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

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

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

2.創(chuàng)建BlogRegexController

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

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

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

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

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

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

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

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

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

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

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

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

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

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

?

轉(zhuǎn)自:http://www.cnblogs.com/jiagoushi/archive/2012/12/15/2819867.html

總結(jié)

以上是生活随笔為你收集整理的抓取博客园列表数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。