利用正则表达式抓取博客园列表数据

这篇文章主要介绍了利用正则表达式抓取博客园列表数据的相关资料,需要的朋友可以参考下

鉴于我在要完成的asp.net MVC 3 仿照博客园企业系统要用到测试数据,我自己输入太累,所以我就抓取了博客园的部分列表数据,还请dudu不要见怪。

在抓取博客园数据的时候采用了正则表达式,所以有不熟悉正则表达式的朋友可以参考相关资料,其实很容易掌握,就是在具体的实例中会花些时间。

现在我就来把我抓取博客园数据的过程叙述一下,如果有朋友有更好的意见,欢迎提出来。

要使用正则表达式抓取数据,首先就要创建一个正则表达式进行匹配,我推荐使用regulator,这个正则表达式工具,我们可以先使用这个工具把我们要使用的正则表达式拼接出来,然后在程序中使用。

我发现博客园的首页列表可以通过http://www.cnblogs.com/p1,p2...这种方式来直接访问,这样我们就可以直接通过url获取数据,而不用模拟数据点击事件来虚拟的点击下一页的那个按钮获取数据,更加方便。因为我的目的就是抓取一些数据,所以就简单点。

1.首先就是要写对应的sql Helper类,相信这是很多程序员都会掌握的,无非就是增删改查的操作。在创建好了sqlhelper类之后,我们就可以开始进行抓取数据的逻辑处理。

2.创建BlogRegexController

 public class BlogRegexController : Controller { public void ExecuteRegex() { string strBaseUrl = "http://www.cnblogs.com/p"; //定义博客园可以访问的列表数据的基地址 for (int i = ; i <= ; i++)//因为博客园首页列表最大只有页,所以我们这个循环就执行次 { 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()方法就是执行抓取博客园列表数据的功臣。

3.首先就是其中定义的BlogRege类,他负责抓取博客园列表数据并将其插入到数据库中

 public class BlogRege {   //负责把数据插入到数据库中 使用到的是sqlhelper类 public void Insert(string title, string content,string linkurl, int categoryID = ) { SqlHelper helper = new SqlHelper(); helper.Insert(title, content, categoryID,linkurl); } ///  /// 通过Url地址获取具体网页内容 发起一个请求获得html内容 ///  ///  ///  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 解析出里面具体的数据 ///  ///  public void AnalysisHtml(string htmlContent) {//这个就是我在regulator正则表达式工具中拼接获取到的正则表达式 还有一点请注意就是转义字符的问题 string strPattern = "\\s*.*\\s*.*\\s*.*\\s*.*\\s*.*\\s*.*\\s*.*\\s*\\s*.*)\"\\s*target=\"_blank\">(?.*)</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;//获取到的是列表数据的标题 string content = match.Groups[].Value;//获取到的是内容 string linkurl=match.Groups[].Value;//获取到的是链接到的地址 Insert(title, content,linkurl);//执行插入到数据库的操作 } } } }</pre></div><p>4.通过上面的代码我们可以很轻松的从博客园中获取我们用来测试的数据,方便快捷,而且真实,比我们手动输入的速度要快很多。</p><p>正则表达式其实不应该算是一种语言,只能算是一种语法,因为任何的语言包括C#,javascript等语言都对正则表达式有很好的支持,只是他们的使用语法稍有不同,其实只要我们可以正确的拼接出正则表达式,那么我们抓取任何网站的内容都可以很轻松的做到。前一段我试着抓取了淘宝的数据,一共抓取了有几百万条,我想应该还有很多没有抓取到,不得不佩服淘宝,数据量太大。</p><p>回到我们使用的C#语言上,其实对正则表达式也有着非常好的支持,Regex就是用来对正则表达式进行操作的类,所有的对正则表达式的操作都在这个类中。</p><p>如果你对正则表达式还不是太熟悉,网上有一篇正则表达式30分钟入门教程,大家可以参考一下,写的很不错。再加上使用一个正则表达式工具,相信可以抓取到任何你想的内容。</p><p>在拼接正则表达式的时候,可能会花费很长时间,毕竟要分析html结构,从中抓取内容。希望大家可以沉住气,因为只要正则表达式拼接正确,那么一定可以抓取正确的内容。</p><p>为了避免大家说只说不做,那么我就把我抓取的博客园首页内容秀一下,因为博客园首页数据会有更新,所以大家可以看到这些数据都是在博客园中顺序存在的。</p><p style="text-align: center"><img alt="" src="https://ss.0133.cn/article/67/f2/44/67f2445792462e2e902571b275963003.jpg-600"/></p><p>博客园每页列表是20条,一共200页,所以一共是4000条。数据抓取正确。</p><p>我以前说过,只是会代码的程序员不一定是合格程序员,程序员应该尽可能的减少自己的工作量,因为我们都是高智商的人。所以我们应该积极的学习各种对我们的工作有帮助的框架或者是方法,比如IOC、Entity Framework或Nhibernate框架来减轻我们开发维护代码的负担,毕竟我们听到需求要更改的反映,一般都是愤怒,然后大骂,最后才是修改。有些框架能够帮助我们,给我们维护代码带来好心情,何乐而不为呢。</p><p>我最后说一句,因为我要开发一个简单的仿照博客园的网站(MVC3),所以会用到各种技术准备,我提前写出来把这些要用到的内容整理一下,为以后的开发加速。</p><p>下一次,我准备整理一下在MVC中使用文本编辑器KindEditor的方法,希望大家如果有好的意见或者资料可以提供一下,让我也增加一些见识。谢谢各位</p></div><p>以上就是利用正则表达式抓取博客园列表数据的详细内容,更多请关注0133技术站其它相关文章!</p></article><div class="post-actions"><a href="javascript:;" etap="like" class="post-like action action-like" data-pid="0"><i
                        class="fa fa-thumbs-o-up"></i>赞(<span>0</span>)</a><a href="javascript:;"
                                                                               class="action action-rewards"
                                                                               data-event="rewards"><i
                    class="fa fa-jpy"></i> 打赏</a></div><div class="post-copyright">未经允许不得转载:<a href="/">0133技术站首页</a> » <a href="/cate156/">正则表达式</a></div><!--<div class="article-tags">标签:<a href="/archives/tag/javascript" rel="tag">JavaScript</a><a
                    href="/archives/tag/%e5%be%ae%e4%bf%a1" rel="tag">微信</a><a
                    href="/archives/tag/%e5%be%ae%e4%bf%a1%e7%9a%84%e7%89%88%e6%9c%ac%e5%8f%b7" rel="tag">微信的版本号</a><a
                    href="/archives/tag/%e7%89%88%e6%9c%ac%e5%8f%b7" rel="tag">版本号</a><a
                    href="/archives/tag/%e8%af%ad%e4%b9%89%e5%8c%96" rel="tag">语义化</a></div>--><nav class="article-nav"><span class="article-nav-prev">上一篇<br><a href="/cate156/111843878791025.html" rel="prev">正则表达式简单的检查输入email是否合法程序</a></span><span class="article-nav-next">下一篇<br><a href="/cate156/111843919528100.html" rel="next">python正则表达式的使用(实验代码)</a></span></nav><div class="relates relates-thumb"><div class="title"><h3>相关文章</h3></div><ul><li><a href="/cate156/1114680917225.html"><img data-src="https://ss.0133.cn/article/58/93/a1/5893a175f403b71a1ad32a1cbe84cb91.jpg-160" alt="shell脚本中的正则表达式详解" class="thumb"></a><a href="/cate156/1114680917225.html">shell脚本中的正则表达式详解</a></li><li><a href="/cate156/1114682128900.html"><img data-src="https://ss.0133.cn/article/25/a3/32/25a332f54bad49b74d6fcd16df9aba80.jpg-160" alt="正则表达式常见的4种匹配模式小结" class="thumb"></a><a href="/cate156/1114682128900.html">正则表达式常见的4种匹配模式小结</a></li><li><a href="/cate156/1114683340625.html"><img data-src="https://ss.0133.cn/article/21/72/f5/2172f59e9032dcdf3044f38514f38921.jpg-160" alt="正则表达式分组与引用的使用" class="thumb"></a><a href="/cate156/1114683340625.html">正则表达式分组与引用的使用</a></li><li><a href="/cate156/1114684552400.html"><img data-src="https://ss.0133.cn/article/6b/2e/13/6b2e130b5cf99e2ebdb5bba217bf1f2a.jpg-160" alt="正则表达式量词与贪婪的使用详解" class="thumb"></a><a href="/cate156/1114684552400.html">正则表达式量词与贪婪的使用详解</a></li><li><a href="/cate156/1114685764225.html"><img data-src="https://ss.0133.cn/article/90/a7/e7/90a7e76c3f78b518b4ccd7261e3581ab.jpg-160" alt="正则表达式那些让人头晕的元字符" class="thumb"></a><a href="/cate156/1114685764225.html">正则表达式那些让人头晕的元字符</a></li><li><a href="/cate156/1114686976100.html"><img data-src="https://ss.0133.cn/article/5e/a8/aa/5ea8aa158b3b9ddccaf028b36c2956bb.jpg-160" alt="Idea使用正则表达式批量替换字符串的方法" class="thumb"></a><a href="/cate156/1114686976100.html">Idea使用正则表达式批量替换字符串的方法</a></li><li><a href="/cate156/1114688188025.html"><img data-src="https://ss.0133.cn/article/5e/a8/aa/5ea8aa158b3b9ddccaf028b36c2956bb.jpg-160" alt="Java正则表达式实现经纬度的合法性操作" class="thumb"></a><a href="/cate156/1114688188025.html">Java正则表达式实现经纬度的合法性操作</a></li><li><a href="/cate156/1114689400000.html"><img data-src="https://ss.0133.cn/article/5d/06/ab/5d06abb507dfcb6223c0ea195586a877.jpg-160" alt="Java正则表达式里隐藏的陷阱" class="thumb"></a><a href="/cate156/1114689400000.html">Java正则表达式里隐藏的陷阱</a></li></ul></div><!--
            <div class="title" id="comments"><h3>评论
                    <small>抢沙发</small></h3></div><div id="respond" class="no_webshot"><form action="return false;" method="post" id="commentform"><div class="comt"><div class="comt-title"><img data-src="https://secure.gravatar.com/avatar/?s=100&d=mm" class="avatar avatar-100"
                                 height="50" width="50"><p><a id="cancel-comment-reply-link" href="javascript:;">取消</a></p></div><div class="comt-box"><textarea placeholder="你的评论可以一针见血" class="input-block-level comt-area" name="comment"
                                      id="comment" cols="100%" rows="3" tabindex="1"
                                      onkeydown="if(event.ctrlKey&&event.keyCode==13){document.getElementById('submit').click();return false};"></textarea><div class="comt-ctrl"><div class="comt-tips"><input type='hidden' name='comment_post_ID' value='6053'
                                                              id='comment_post_ID'/><input type='hidden' name='comment_parent' id='comment_parent' value='0'/><p style="display: none;"><input type="hidden" id="akismet_comment_nonce"
                                                                     name="akismet_comment_nonce" value="40dd7081eb"/></p><label for="comment_mail_notify" class="checkbox inline hide"
                                               style="padding-top:0"><input type="checkbox" name="comment_mail_notify"
                                                                            id="comment_mail_notify"
                                                                            value="comment_mail_notify"
                                                                            checked="checked"/>有人回复时邮件通知我</label><p style="display: none;"><input type="hidden" id="ak_js" name="ak_js" value="245"/></p></div><button type="button" name="submit" id="submit" tabindex="5">提交评论</button>--><!-- <span data-type="comment-insert-smilie" class="muted comt-smilie"><i class="icon-thumbs-up icon12"></i> 表情</span> --><!--
                            </div></div><div class="comt-comterinfo" id="comment-author-info"><ul><li class="form-inline"><label class="hide" for="author">昵称</label><input class="ipt" type="text" name="author" id="author" value="" tabindex="2" placeholder="昵称"><span class="text-muted">昵称 (必填)</span></li><li class="form-inline"><label class="hide" for="email">邮箱</label><input class="ipt" type="text" name="email" id="email" value="" tabindex="3" placeholder="邮箱"><span class="text-muted">邮箱 (必填)</span></li><li class="form-inline"><label class="hide" for="url">网址</label><input class="ipt" type="text" name="url" id="url" value="" tabindex="4" placeholder="网址"><span class="text-muted">网址</span></li></ul></div></div></form></div>--></div></div><div class="sidebar"><div class="widget widget_ui_tags"><h3>编程</h3><div class="items"><a href="/cate104/">Java</a><a href="/cate105/">C语言</a><a href="/cate133/">新手学堂</a><a href="/cate149/">数据库</a><a href="/cate151/">ASP编程</a><a href="/cate153/">PHP编程</a><a href="/cate154/">XML/RSS</a><a href="/cate155/">Flex</a><a href="/cate156/">正则表达式</a><a href="/cate158/">R语言</a><a href="/cate159/">汇编语言</a><a href="/cate160/">其他教程</a><a href="/cate165/">移动</a></div></div><form method="get" class="search-form clearfix" id="search-formhybrid-search" target="_blank" action="/search/article/"><div class="search-input-wrap"><input type="text" class="search-text" placeholder="来搜我" name="word" id="search-texthybrid-search"
                       value="" data-placeholder=""><b class="search-liaosheji"></b><button type="submit" class="search-button"><i class="icon-search"></i></button></div></form><div style="text-align:center;margin:0 auto;"><ul class='hot-search layui-clear'><li style="float:left;margin-right:20px;">热门搜索:</li><li style="float:left;margin-right:20px;"><a href='/search/article/?word=正则表达式提取数字'>正则表达式提取数字</a></li><li style="float:left;margin-right:20px;"><a href='/search/article/?word=正则表达式'>正则表达式</a></li><li style="float:left;margin-right:20px;"><a href='/search/article/?word=正则表达式函数'>正则表达式函数</a></li><li style="float:left;margin-right:20px;"><a href='/search/article/?word=正则表达式使用'>正则表达式使用</a></li><li style="float:left;margin-right:20px;"><a href='/search/article/?word=常用正则表达式'>常用正则表达式</a></li></ul></div><br/><div class="widget widget_ui_posts"><h3>置顶推荐</h3><ul><li><a href="/cate99/113256942050000.html"><span class="thumbnail"><img data-src="https://ss.0133.cn/upload/article/000/000/001/61c09166ae006922.jpg" alt="抽审下架是不是废了" class="thumb"></span><span class="text">抽审下架是不是废了</span><span
                            class="muted">2021-12-20</span></a></li></ul></div><div class="widget widget_recent_entries"><h3>猜你喜欢</h3><ul><li><a href="/cate156/112031209252025.html" target="_blank">密码强度的正则表达式两种方案JS总结篇</a><span class="post-date">2021-11-11</span></li><li><a href="/cate156/11475210276025.html" target="_blank">正则表达式m修饰符(多行匹配)</a><span class="post-date">2021-10-07</span></li><li><a href="/cate156/111154657662500.html" target="_blank">正则表达式 \D 元字符(等价于"[^0-9]")</a><span class="post-date">2021-10-17</span></li><li><a href="/cate156/11478967765625.html" target="_blank">Java正则表达式过滤出字母、数字和中文</a><span class="post-date">2021-10-07</span></li><li><a href="/cate156/11475099985625.html" target="_blank">JavaScript基于正则表达式的数字判断函数</a><span class="post-date">2021-10-07</span></li><li><a href="/cate156/11477467140100.html" target="_blank">正则表达式之零宽断言实例详解【基于PHP】</a><span class="post-date">2021-10-07</span></li><li><a href="/cate156/11478947003600.html" target="_blank">JavaScript的正则也有单行模式了</a><span class="post-date">2021-10-07</span></li><li><a href="/cate156/112491488578025.html" target="_blank">js去掉首位空格的正则表达式</a><span class="post-date">2021-11-20</span></li></ul></div><!--<div class="widget widget_ui_tags"><h3>热门标签</h3><div class="items"><a href="/archives/tag/javascript">JavaScript (324)</a></div></div><div class="widget widget_ui_comments"><h3>最新评论</h3><ul><li><a href="" title=""><img data-src="" class="avatar avatar-100" height="50" width="50"><strong></strong></a></li></ul></div>--></div><div id="leftbar" class="leftbar"><div class="leftbar-con"><div style="text-align: center; width: 160px;"></div></div></div></section><footer class="footer"><div class="container"><p>© 2022 <a href="/">WEB前端开发</a></p><p><a href="/cate88/">工具教程</a> | <a href="/cate71/">前端开发</a> | <a href="/cate61/">常见问题</a> | <a
                href="/cate129/">操作系统</a> | <a href="/cate103/">编程</a>  | <a href="/cate108/">网络安全</a>  | <a href="/cate120/">设计</a>  | <a href="/cate137/">站长技巧</a></p><div class="footer-gav" style="margin-bottom: 10px ;font-size: 12px;"><img
                src="https://ss.0133.cn/newimg88/2016/06/beian-gov-cn.png" style="vertical-align: middle; height: 14px;"/><a href="https://beian.miit.gov.cn/" target="_blank">鄂ICP备2021014202号-2</a></div><div class="footer-qrcode"></div></div></footer><script>    window.jsui = {
        www: '',
        uri: '/wp-content/themes/dux',
        ver: '5.2.5',
        roll: ["1", "2"],
        ajaxpager: '0',
        url_rp: '/about'
    };
</script><script type='text/javascript' src='/wp-content/themes/dux/js/libs/bootstrap.min.js?ver=5.2.5'></script><script type='text/javascript' src='/wp-content/themes/dux/js/loader.js?ver=5.2.5'></script><script type='text/javascript' src='/wp-includes/js/wp-embed.min.js?ver=5.0.2'></script><script async="async" type='text/javascript' src='/wp-content/plugins/akismet/_inc/form.js?ver=4.0.8'></script><script type="text/javascript">    var $win = jQuery(window);

    var $WindowW = $win.width();

    var $threebar = jQuery("#leftbar");
    if ($threebar.length) {
        var offsetT = $threebar.offset().top;
        $win.on("scroll.leftbar", function () {
            if ($WindowW >= 1200) {
                if ($win.scrollTop() >= (offsetT)) {
                    $threebar.find(".leftbar-con").css({
                        "position": "fixed",
                        "top": 0
                    });
                } else {
                    $threebar.find(".leftbar-con").css("position", "static")
                }
            }
        });
    }

    // Array
    var imagesArr = [];
    $('#article-content').find("img").each(function (index, Element) {
        imagesArr.push(Element)
    });
    mediumZoom(imagesArr, {
        margin: 24,
        background: '#FFFFFF',
        scrollOffset: 0
    })

</script><script>    (function (i, s, o, g, r, a, m) {
        i['GoogleAnalyticsObject'] = r;
        i[r] = i[r] || function () {
                    (i[r].q = i[r].q || []).push(arguments)
                }, i[r].l = 1 * new Date();
        a = s.createElement(o),
                m = s.getElementsByTagName(o)[0];
        a.async = 1;
        a.src = g;
        m.parentNode.insertBefore(a, m)
    })(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');

    ga('create', 'UA-3448069-1', 'css88.com');
    ga('send', 'pageview');

</script><script>    var _hmt = _hmt || [];
    (function () {
        var hm = document.createElement("script");
        hm.src = "https://hm.baidu.com/hm.js?08985692e4db1e8be1cff8097c2979b7";
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(hm, s);
    })();
</script><script>    (function () {
        var bp = document.createElement('script');
        var curProtocol = window.location.protocol.split(':')[0];
        if (curProtocol === 'https') {
            bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
        }
        else {
            bp.src = 'http://push.zhanzhang.baidu.com/push.js';
        }
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(bp, s);
    })();
</script></body></html>