NET备份博客园随笔分类文章,Dapper走一波爬虫

作者: 网络编程  发布:2019-08-15

(转载请注脚来源:

后边用.NET做网页采撷达成应用正则表明式去相称剖判,相比较繁琐,开支时间相当多,固然Html复杂的话真是欲哭无泪。

    近日因为公司工作需求,又有机缘撸winform了,本次的要求是因为厂商有品种上报的那块职业,项目申报早先时期须要关爱政坛发布的相干动态新闻,政坛部门网站过多,人工要求二个二个网址去浏览和查看,有的时候候还也许会遗漏掉,因而呢,大家盘算用爬虫 移动端web来做,小编最主要担负爬虫和web Api。

很已经听过包HtmlAgilityPack,其是在.NET下用XPath来剖析的HTML的三个类库(包)。但是一贯没时间尝试,轻巧询问了下HtmlAgilityPack的API后,开掘便是HTML深入分析利器,于是花些时日做二个例证记录下。

爬虫篇

金沙澳门官网 , 

    爬虫首要采取.Net庞大的开源深入分析HTML成分的类库HtmlAgilityPack,操作过XML的童鞋应该飞速就足以上手,通过深入分析X帕特h来深入分析HTML,特其他平价的,还或者有一款不错的叫Jumony,没用过,对HtmlAgilityPack相比熟稔,所以首荐了HtmlAgilityPack来作为大将军。

本次是以下载天涯论坛随笔分类作品为例,采取两有些完毕,第一某个是将收罗到的篇章放到集结变量中,第二有的是通过操作集结变量将小说下载到本地,

    HtmlAgilityPack的主旨使用能够参见那篇 《开源项目Html Agility Pack完结急迅分析Html》。

这样做作用比较低,因为能够一贯边访问作品边下载。暂风尚未考虑功效难点,仅仅只是完毕效果与利益。上边轻便门船演讲下。

    效果图,多图慎入:

 

金沙澳门官网 1金沙澳门官网 2

得到小说分类

 金沙澳门官网 3

 

 

据书上说输入的博客名获得相应的小说分类。

 

 

访问福建财厅例子

金沙澳门官网 4金沙澳门官网 5

  金沙澳门官网 6

   /// <summary>

        /// 获取博客分类

        /// </summary>

        /// <param name=" uname"></param>

        /// <returns></returns>

        private static List< BlogType> GettBlogTypeList(string uname)

        {

            string url = "http://www.cnblogs.com/"   uname   "/mvc/blog/sidecolumn.aspx?blogApp="   uname;

            string htmlStr = CommonHelper .GetRequestStr(url);

            HtmlDocument doc = new HtmlDocument();

            doc.LoadHtml(htmlStr);

            var nodes = doc.DocumentNode.SelectNodes("//div[@id='sidebar_postcategory']//a"); //随笔分类

            if (nodes == null || nodes.Count <= 0)

                return null ;

            List<BlogType > list = new List< BlogType>();

            for (int i = 0; i < nodes.Count; i  )

            {

                var aUrl = nodes[i].Attributes["href" ].Value;

                var name = nodes[i].InnerText;

                list.Add( new BlogType () { BlogTypeUrl = aUrl, BlogTypeName = name.Contains( "(") ? name.Split('(')[0] : name,BlogTypeNameShow=name });

            }

            return list;

        }



  public class BlogType

    {

        public string BlogTypeUrl { get; set; }

        public string BlogTypeName { get; set; }

        public string BlogTypeNameShow { get; set; }

    }

     因为是政党文告的出来的音信,所以新闻的对外开放的,只是机器代替人工来浏览,不会被调理的,首要搜集文章的标题、日期和作品内容,以四川财厅网址为例子。

View Code

 

 

First

 如获得到的小说分类如下:

    加载网址以此就不用说了,先查看网址的字符编码,如图<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ,然后设置HtmlAgilityPack中的OverrideEncoding属性,再起来加载,不然搜集到的是乱码,未有意义。

 

金沙澳门官网 7

金沙澳门官网 8

 

 

htmlAgilityPack.OverrideEncoding = Encoding.UTF8;

搜聚分类的文章

 

 

Second

应用两步贯彻,第一步获取只富含标题和url的篇章,第二步再获得小说内容。

  金沙澳门官网 9

     

 

金沙澳门官网 10金沙澳门官网 11

    浅析小说列表,浏览器F12查看HTML标签景况,能够分析出X帕特h为:

 /// <summary>

        /// 根据分类获取博客

        /// </summary>

        /// <param name=" blogTypes"></param>

        /// <param name=" useTime"></param>

        /// <returns></returns>

        public static Dictionary< BlogType,List <BlogInfo>> GetBlogsByType( List<BlogType > blogTypes,out long useTime)

        {

            Stopwatch sw = new Stopwatch();

            sw.Start();

            Dictionary<BlogType , List< BlogInfo>> dic = new Dictionary< BlogType, List <BlogInfo>>();          

            foreach (var blogType in blogTypes)

            {

                List<BlogInfo > list = new List< BlogInfo>();

                HtmlDocument doc = new HtmlDocument();

                doc.LoadHtml( CommonHelper.GetRequestStr(blogType.BlogTypeUrl));

                var typeNameNode = doc.DocumentNode.SelectSingleNode("//div[@class='entrylist']/h1");

                string typeName = typeNameNode.InnerText;

                var listPosttitleNodes = doc.DocumentNode.SelectNodes("//div[@class='entrylistPosttitle']/a");

                if (listPosttitleNodes != null && listPosttitleNodes.Count > 0)

                {

                    for (int i = 0; i < listPosttitleNodes.Count; i  )

                    {

                        Console.WriteLine("正在爬取文章【{0}】..." , listPosttitleNodes[i].InnerText);

                        list.Add( new BlogInfo ()

                        {

                            BlogUrl = listPosttitleNodes[i].Attributes[ "href"].Value,

                            BlogTitle = listPosttitleNodes[i].InnerText,

                            BlogTypeName = typeName

                        });

                    }

                }

                dic.Add(blogType,list);

            }

            sw.Stop();

            useTime = sw.ElapsedMilliseconds;

            return dic;

        }





     /// <summary>

        /// 获取详细的博客信息

        /// </summary>

        /// <param name=" dic"></param>

        /// <param name=" useTime"></param>

        /// <returns></returns>

        public static Dictionary< BlogType, List <BlogInfo>> GetBlogDetail( Dictionary<BlogType , List<BlogInfo >> dic, out long useTime)

        {

            Stopwatch sw = new Stopwatch();

            sw.Start();

            HtmlDocument doc = new HtmlDocument();

            for(int k=0;k<dic.Keys.Count;k  )

            {

                var blogType = dic.Keys.ElementAt(k);

                var list = dic[blogType];

                for (int i = 0; i < list.Count; i  )

                {

                    Console.WriteLine("正在获取文章【{0}】内容..." , list[i].BlogTitle);

                    doc.LoadHtml( CommonHelper.GetRequestStr(list[i].BlogUrl));

                    var bodyNode = doc.DocumentNode.SelectSingleNode("//div[@id='cnblogs_post_body']");

                    var dateNode = doc.DocumentNode.SelectSingleNode("//span[@id='post-date']");

                    var userNode = doc.DocumentNode.SelectSingleNode("//div[@class='postDesc']/a[1]");

                    list[i].BlogContent = bodyNode == null ? "内容获取失败" : bodyNode.InnerHtml;

                    list[i].BlogPostTime = dateNode == null ? "发布时间获取失败" : dateNode.InnerText;

                    list[i].BlogName = userNode == null ? "用户获取失败" : userNode.InnerText;

                }

                dic[blogType] = list;

            }

            sw.Stop();

            useTime = sw.ElapsedMilliseconds;

            return dic;

        }



    public class BlogInfo

    {

        public string BlogUrl { get; set; }

        public string BlogName { get; set; }

        public string BlogTitle { get; set; }

        public string BlogContent { get; set; }

        public string BlogTypeName { get; set; }

        public string BlogPostTime { get; set; }

    }
//ul[@class='dzjzw_list_main_ul']//li

View Code

     小说内容的链接的XPath标签:

 

//a

 下载到地面

    作品揭露的年月XPath标签:

 

//span[@class='date']

依附地点收集到的小说再一步步下载到本地,时期分两步,第一步下载图片,第二步下载小说内容。

 

 

事必躬亲流程代码:

金沙澳门官网 12金沙澳门官网 13

本文由金沙澳门官网发布于网络编程,转载请注明出处:NET备份博客园随笔分类文章,Dapper走一波爬虫

关键词: 金沙澳门官网

上一篇:python爬虫遇到状态码304
下一篇:没有了