HtmlAgilityPack C#爬虫

Main程序

  class Program
    {
        static void Main(string[] args)
        {
            var tmpStr1 = "http://www.****.com/txtxz/{0}/down.html";
            WebClient wc = new WebClient();

            for (int i = 54422; i < 54423; i++)
            {
                var str = String.Format(tmpStr1, i);
                String result = wc.DownloadString(str);
                BookDataParser parser = new BookDataParser(result, str);
                var item = parser.GetBookData();
                if (item == null)
                {
                    Console.WriteLine("fail to get in url{0}", i);
                    continue;
                }
                wc.DownloadFile(item.DownLink, item.Title + ".txt");
                Console.WriteLine(item);
            }

            Console.ReadKey();
        }
    }

BookDataParser.cs

/// <summary>
    /// BookData解析
    /// </summary>
    public class BookDataParser
    {
        private String _content;    //html 内容
        private HtmlDocument _doc;  //HtmlAgilityPack 处理文档类
        private String _url;        //当前链接,仅用于构造BookData

        /// <summary>
        /// 构造BookDataParser
        /// </summary>
        /// <param name="content">Html内容</param>
        /// <param name="url">当前链接</param>
        public BookDataParser(string content,string url)
        {
            _url = url;
            _content = content;
            _doc = new HtmlDocument();
            _doc.LoadHtml(content);
        }

        /// <summary>
        /// 解析返回bookData
        /// </summary>
        /// <returns></returns>
        public BookData GetBookData()
        {
            if (!VaildContent()) { return null; }

            var bookData = new BookData();
            //Title
            var titleNode = _doc.DocumentNode.SelectSingleNode("//div[@id=‘titlename‘]/h1");
            var str = titleNode.ChildNodes.First(n => n.Name == "#text").InnerHtml;
            bookData.Title = str.Substring(0, str.IndexOf("TXT"));

            var infoNode = _doc.DocumentNode.SelectNodes("//div[@class=‘txt_info‘]/span");
            //Author
            var str2 = infoNode[0].InnerText;
            bookData.AuthorName = str2.Substring(str2.IndexOf(‘:‘)+1);
            //class
            var str3 = infoNode[1].InnerText;
            bookData.Class = str3.Substring(str3.IndexOf(":") + 1);
            //date
            var str4 = infoNode.Last().InnerText;
            bookData.UploadTime = DateTime.Parse(str4.Substring(str4.IndexOf(":") + 1));

            //Description
            var descNode = _doc.DocumentNode.SelectSingleNode("//div[@class=‘infos_txt‘]");
            bookData.Description = GetDesc(descNode);
            //DownLink
            var linkNode1 = _doc.DocumentNode.SelectSingleNode("//div[@class=‘pan_url‘]/a[last()]");
            bookData.DownLink = linkNode1.GetAttributeValue("href", null);
            //InfoLink
            bookData.InfoLink = _url;
            return bookData;
        }

        /// <summary>
        /// 处理descNode获得描述
        /// </summary>
        /// <param name="descNode">描述信息的节点</param>
        /// <returns>book 描述</returns>
        private string GetDesc(HtmlNode descNode)
        {
            StringBuilder sb = new StringBuilder();
            foreach (var node in descNode.ChildNodes)
            {
                if (node.Name=="#text")
                {
                    var str = node.InnerText;
                    if (!String.IsNullOrWhiteSpace(str))
                    {
                        sb.Append(HttpUtility.HtmlDecode(str).Trim());
                    }
                }
                if (node.Name=="br")
                {
                    sb.Append("\n");
                }
            }
            return sb.ToString();
        }

        /// <summary>
        /// 验证Content为空或不合法
        /// </summary>
        /// <returns></returns>
        public bool VaildContent()
        {
            if (_content == null) return false;
            var node = _doc.DocumentNode.SelectSingleNode("//div[class=‘blocktitle‘]");
            return node == null || node.InnerText.StartsWith("出现错误");
        }
    }
时间: 2024-12-17 06:31:21

HtmlAgilityPack C#爬虫的相关文章

爬虫技术(六)-- 使用HtmlAgilityPack获取页面链接(附c#代码及插件下载)

菜鸟HtmlAgilityPack初体验...弱弱的代码... Html Agility Pack是一个开源项目,为网页提供了标准的DOM API和XPath导航.使用WebBrowser和HttpWebRequest下载的网页可以用Html Agility Pack来解析. HtmlAgilityPack的文档是CHM格式的,有时会无法正常阅读CHM格式的文件.如果是IE不能链接到您请求的网页或者打开后"页面无法显示".请在要打开的CHM文件上右击属性,会在底下属性多了个"

网络爬虫+HtmlAgilityPack+windows服务从博客园爬取20万博文

网络爬虫+HtmlAgilityPack+windows服务从博客园爬取20万博文 1.前言 最新在公司做一个项目,需要一些文章类的数据,当时就想到了用网络爬虫去一些技术性的网站爬一些,当然我经常去的就是博客园,于是就有下面的这篇文章. 2.准备工作 我需要把我从博客园爬取的数据,保存起来,最好的方式当然是保存到数据库中去了,好了我们先建一个数据库,在来一张表,保存我们的数据,其实都很简单的了啊,如下图所示 BlogArticleId博文自增ID,BlogTitle博文标题,BlogUrl博文地

C#多线程爬虫抓取免费代理IP

这里用到一个HTML解析辅助类:HtmlAgilityPack,如果没有网上找一个增加到库里,这个插件有很多版本,如果你开发环境是使用VS2005就2.0的类库,VS2010就使用4.0,以此类推..........然后直接创建一个控制台应用,将我下面的代码COPY替换就可以运行,下面就来讲讲我两年前做爬虫经历,当时是给一家公司做,也是用的C#,不过当时遇到一个头痛的问题就是抓的图片有病毒,然后系统挂了几次.所以抓网站图片要注意安全,虽然我这里没涉及到图片,但是还是提醒下看文章的朋友. clas

爬虫神器XPath,程序员带你免费获取周星驰等明星热门电影

本教程由“做全栈攻城狮”原创首发,本人大学生一枚平时还需要上课,但尽量每日更新文章教程.一方面把我所习得的知识分享出来,希望能对初学者有所帮助.另一方面总结自己所学,以备以后查看. 可能看着文章很短,但大家想想高考时800字的作文用了多长时间.字都是一个字一个字的码出来的,也需要很多精力. 非常需要各位的支持,哪怕点个赞,评论一下.更多技术方向的文章可以关注我.力求写出高质量文章.帮助更多学习技术的人. 本人大学生一枚,如各位有Asp.Net和安卓开发方向的兼职,可以联系微信:cxx7177.感

网易新闻页面信息抓取 -- htmlagilitypack搭配scrapysharp

最近在弄网页爬虫这方面的,上网看到关于htmlagilitypack搭配scrapysharp的文章,于是决定试一试~ 于是到https://www.nuget.org/packages/ScrapySharp去看看, 看到这句下载提示:To install ScrapySharp, run the following command in the Package Manager Console PM> Install-Package ScrapySharp 接下去我就去找package man

c# 爬虫(一) HELLO WORLD

最近在摸索爬虫相关的东西,写点随笔,以便忘记. 目的与用途 现实的项目中,我们需要太多的第三方接口了.而往往这些第三方接口由于条件限制,一时拿不到. 譬如: 1. 淘宝网今天有什么特价商品. 2. 百度今天的热搜榜是什么. 3. 某用户的水电.话费.煤气有没有欠费,欠了多少. 等等问题,怎么办呢? 解决不了就请程序员出马,因为程序员是万能的,程序员是无敌的. 原理 既然我们没有能力(财力)与阿里巴巴.百度等第三方做对接,那么我们可以通过模拟访问他们对于的页面,并抓取对应的数据,来收集相关的信息.

C#丨爬虫基础

在前几天看到一片公众号的文章是关于.NET玩爬虫. 所以今天小编索性来try一下,恰好小编最近在关注房价这一块的,索性就写了一个例子抓取房产信息的. 不善言辞的小编直接给出代码吧!相信读者也等不及了.你要是觉得有用就推荐一下或者评论一下吧! using HtmlAgilityPack; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; usin

C#网页爬虫抓取行政区划

借鉴C#网页爬虫抓取行政区划,从国家统计局获取了最新行政区域数据. 以下为代码贴片: 数据库类: public class City { public decimal ID { get; set; } public string Name { get; set; } public string Code { get; set; } public string Org_Level { get; set; } public string ParentCode { get; set; } public

老蜗牛写采集:网络爬虫(二)

短小精悍的xNet 这个一个俄国牛人写的开源工具,为啥说他强悍了,因为他将所有Http协议的底层都实现了一遍,这有啥好处?只要你是写爬虫的,都会遇到一个让人抓狂的问题,就是明明知道自己Http请求头跟浏览器一模一样了,为啥还会获取不到自己想要的数据.这时你如果使用HttpWebReaquest,你只能调试到GetRespone,底层的字节流是调试不到了.所以必须得有个更深入的底层组件,方便自己调试.以下是xNet的开源地址:https://github.com/X-rus/xNet快速入门 快速