zoukankan      html  css  js  c++  java
  • 简单爬虫-抓取博客园文章列表

        如果使用对方网站数据,而又没有响应的接口,或者使用接口不够灵活的情况下,使用爬虫在合适不过了。爬虫有几种,对方网站展示形式有几种都是用分析,每个网站展示有相似的地方,有不同的地方。

        大部分使用httpRequst就能完成,不管是否添加了口令、随即码、请求参数、提交方式get或者post、地址来源、多次响应等等。但是有些网站使用ajax如果是返回json或固定格式的也好处理,如果是很复杂的,可以使用webbrower控件进行抓取,最后正则解析,获取所需要的数据即可。

         那我们来抓取去首页网站列表 文章标题、文章摘要、文章发布时间、文章作者、文章评论次数、文章浏览次数。看下结构图。

      get请求返回静态html附代码如下

    public class HttpCnblogs
        {
            public static List<CnblogsModel> HttpGetHtml()
            {
    
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.cnblogs.com/");
                request.Method = "GET";
                request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
                request.UserAgent = "	Mozilla/5.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0";
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Stream stream = response.GetResponseStream();
                StreamReader sr = new StreamReader(stream);
                string articleContent = sr.ReadToEnd();
    
                List<CnblogsModel> list = new List<CnblogsModel>();
    
                #region 正则表达式
                //div post_item_body列表
                Regex regBody = new Regex(@"<divsclass=""post_item_body"">([sS].*?)</div>", RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);
                //a标签 文章标题  作者名字 评论 阅读
                Regex regA = new Regex("<a[^>]*?>(.*?)</a>", RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);
                //p标签 文章内容
                Regex regP = new Regex(@"<psclass=""post_item_summary"">(.*?)</p>", RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);
                //提取评论 阅读次数如:评论(10)-》10
                Regex regNumbernew = new Regex(@"d+", RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);
                //提取时间
                Regex regTime = new Regex(@"d{4}-d{2}-d{2}sd{2}:d{2}", RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);
                #endregion
                MatchCollection mList = regBody.Matches(articleContent);
                CnblogsModel model = null;
                String strBody = String.Empty;
                for (int i = 0; i < mList.Count; i++)
                {
                    model = new CnblogsModel();
                    strBody = mList[i].Groups[1].ToString();
                    MatchCollection aList = regA.Matches(strBody);
                    int aCount = aList.Count;
                    model.ArticleTitle = aList[0].Groups[1].ToString();
                    model.ArticleAutor = aCount == 5 ? aList[2].Groups[1].ToString() : aList[1].Groups[1].ToString();
                    model.ArticleComment = Convert.ToInt32(regNumbernew.Match(aList[aCount-2].Groups[1].ToString()).Value);
                    model.ArticleTime = regTime.Match(strBody).Value;
                    model.ArticleView = Convert.ToInt32(regNumbernew.Match(aList[aCount-1].Groups[1].ToString()).Value);
                    model.ArticleContent = regP.Matches(strBody)[0].Groups[1].ToString();
                    list.Add(model);
                }
                return list;
            }
        }
    
        public class CnblogsModel
        {
            /// <summary>
            /// 文章标题
            /// </summary>
            public String ArticleTitle { get; set; }
            /// <summary>
            /// 文章内容摘要
            /// </summary>
            public String ArticleContent { get; set; }
            /// <summary>
            /// 文章作者
            /// </summary>
            public String ArticleAutor { get; set; }
            /// <summary>
            /// 文章发布时间
            /// </summary>
            public String ArticleTime { get; set; }
            /// <summary>
            /// 文章评论量
            /// </summary>
            public Int32 ArticleComment { get; set; }
            /// <summary>
            /// 文章浏览量
            /// </summary>
            public Int32 ArticleView { get; set; }
        }
    

     最后看看获取的文章model

     

      写的不好,还请见谅,准备下面试去。。

  • 相关阅读:
    组件间通信
    Android抓包方法(一)之Fiddler代理
    汉字转拼音
    post请求参数问题
    post请求参数设置
    swagger
    IfcPresentationDefinitionResource(介绍定义资源)
    Java计算两个日期之间的时间差(毫秒数)
    IfcPresentationAppearanceResource(外观定义资源)
    IfcMeasureResource(度量资源)
  • 原文地址:https://www.cnblogs.com/chengtian/p/3738115.html
Copyright © 2011-2022 走看看