C#网络爬虫抓取小说

C#网络爬虫抓取小说

2017-09-05   DotNet

(点击上方蓝字,可快速关注我们)


来源:苍

cnblogs.com/cang12138/p/7464226.html


阅读目录


1、分析html规则


2、C#完整代码


3、最后效果


心血来潮,想研究下爬虫,爬点小说。


通过百度选择了个小说网站,随便找了一本小书http://www.23us.so/files/article/html/13/13655/index.html。


一、分析html规则


思路是获取小说章节目录,循环目录,抓取所有章节中的内容,拼到txt文本中。最后形成完本小说。


1、获取小说章节目录


C#网络爬虫抓取小说


通过分析,我在标注的地方获取小说名字及章节目录。


// 获取小说名字

 

// 所有的章节都在这个table中。


下面是利用正则,获取名字与目录。


// 获取小说名字

Match ma_name = Regex.Match(html, @"");

string name = ma_name.Groups[1].Value.ToString().Split(',')[0];


// 获取章节目录

Regex reg_mulu = new Regex(@"

(.|\n)*? ");

var mat_mulu = reg_mulu.Match(html);

string mulu = mat_mulu.Groups[0].ToString();


2、获取小说正文内容


通过章节a标签中的url地址,查看章节内容。


C#网络爬虫抓取小说




通过分析,正文内容在

中。


// 获取正文

Regex reg = new Regex(@"

(.|\n)*?
");


MatchCollection mc = reg.Matches(html_z);


var mat = reg.Match(html_z);


string content = mat.Groups[0].ToString().Replace("
", "").Replace("
", "").Replace(" ", "").Replace("
", "\r\n");


二、C#完整代码

C#网络爬虫抓取小说


 


namespace Test.Controllers

{

    public class CrawlerController : BaseController

    {

        // GET: Crawler

        public void Index()

        {

            //抓取整本小说

            CrawlerController cra = new CrawlerController();// 顶点抓取小说网站小说

            string html = cra.HttpGet("http://www.23us.so/files/article/html/13/13655/index.html", "");


            // 获取小说名字

            Match ma_name = Regex.Match(html, @"");

            string name = ma_name.Groups[1].Value.ToString().Split(',')[0];


            // 获取章节目录

            Regex reg_mulu = new Regex(@"

(.|\n)*? ");

            var mat_mulu = reg_mulu.Match(html);

            string mulu = mat_mulu.Groups[0].ToString();


            // 匹配a标签里面的url

            Regex tmpreg = new Regex("]+?href=\"([^\"]+)\"[^>]*>([^<]+)", RegexOptions.Compiled);

            MatchCollection sMC = tmpreg.Matches(mulu);

            if (sMC.Count != 0)

            {

                //循环目录url,获取正文内容

                for (int i = 0; i < sMC.Count; i++)

                {

                    //sMC[i].Groups[1].Value

                    //0是第一章 泰山之巅 

                    //1是http://www.23us.so/files/article/html/13/13655/5638725.html

                    //2是第一章 泰山之巅


                    // 获取章节标题

                    string title = sMC[i].Groups[2].Value;


                    // 获取文章内容

                    string html_z = cra.HttpGet(sMC[i].Groups[1].Value, "");


                    // 获取小说名字,章节中也可以查找名字

                    //Match ma_name = Regex.Match(html, @"");

                    //string name = ma_name.Groups[1].Value.ToString().Split(',')[0];


                    // 获取标题,通过分析h1标签也可以得到章节标题

                    //string title = html_z.Replace("

", "*").Replace("

", "*").Split('*')[1];


                    // 获取正文

                    Regex reg = new Regex(@"

(.|\n)*?
");


                    MatchCollection mc = reg.Matches(html_z);


                    var mat = reg.Match(html_z);


                    string content = mat.Groups[0].ToString().Replace("
", "").Replace("
", "").Replace(" ", "").Replace("
", "\r\n");






                    // txt文本输出


                    string path = AppDomain.CurrentDomain.BaseDirectory.Replace("\\", "/") + "Txt/";


                    Novel(title + "\r\n" + content, name, path);


                }


            }


        }






        ///


        /// 创建文本


        ///


        /// 内容


        /// 名字


        /// 路径


        public void Novel(string content, string name, string path)


        {


            string Log = content + "\r\n";


            // 创建文件夹,如果不存在就创建file文件夹


            if (Directory.Exists(path) == false)


            {


                Directory.CreateDirectory(path);


            }






            // 判断文件是否存在,不存在则创建


            if (!System.IO.File.Exists(path + name + ".txt"))


            {


                FileStream fs1 = new FileStream(path + name + ".txt", FileMode.Create, FileAccess.Write);// 创建写入文件 


                StreamWriter sw = new StreamWriter(fs1);


                sw.WriteLine(Log);// 开始写入值


                sw.Close();


                fs1.Close();


            }


            else


            {


                FileStream fs = new FileStream(path + name + ".txt" + "", FileMode.Append, FileAccess.Write);


                StreamWriter sr = new StreamWriter(fs);


                sr.WriteLine(Log);// 开始写入值


                sr.Close();


                fs.Close();


            }


        }






        public string HttpPost(string Url, string postDataStr)


        {


            CookieContainer cookie = new CookieContainer();


            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);


            request.Method = "POST";


            request.ContentType = "application/x-www-form-urlencoded";


            request.ContentLength = Encoding.UTF8.GetByteCount(postDataStr);


            request.CookieContainer = cookie;


            Stream myRequestStream = request.GetRequestStream();


            StreamWriter myStreamWriter = new StreamWriter(myRequestStream, Encoding.GetEncoding("gb2312"));


            myStreamWriter.Write(postDataStr);


            myStreamWriter.Close();






            HttpWebResponse response = (HttpWebResponse)request.GetResponse();






            response.Cookies = cookie.GetCookies(response.ResponseUri);


            Stream myResponseStream = response.GetResponseStream();


            StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));


            string retString = myStreamReader.ReadToEnd();


            myStreamReader.Close();


            myResponseStream.Close();






            return retString;


        }






        public string HttpGet(string Url, string postDataStr)


        {


            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url + (postDataStr == "" ? "" : "?") + postDataStr);


            request.Method = "GET";


            HttpWebResponse response;


            request.ContentType = "text/html;charset=UTF-8";


            try


            {


                response = (HttpWebResponse)request.GetResponse();


            }


            catch (WebException ex)


            {


                response = (HttpWebResponse)request.GetResponse();


            }






            Stream myResponseStream = response.GetResponseStream();


            StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));


            string retString = myStreamReader.ReadToEnd();


            myStreamReader.Close();


            myResponseStream.Close();






            return retString;


        }


    }


}


三、最后效果


C#网络爬虫抓取小说


看完本文有收获?请转发分享给更多人

关注「DotNet」,提升.Net技能 

C#网络爬虫抓取小说

阅读原文
阅读   2332
15 投诉
精选留言

写留言

  •  2
    馨馨我我 C#网络爬虫抓取小说
    抓取网页……还是用一个 html 解析器吧,比如 Less.Html

    4小时前

  •  1
    Sunday C#网络爬虫抓取小说
    一不小心就被安利了一本小说

    3小时前

  •  
    怪蜀黍 C#网络爬虫抓取小说
    这种不需要绕过防爬虫的,火车头即可

    3小时前

  •  
    souther C#网络爬虫抓取小说
    我在前几周之前也只懂c#,其实算不上懂,比起其他的用的多而已,前几周有个爬虫需求,用c#试了几天后,在朋友的建议下换成了python,很快就实现了楼主类似的功能,学起来也简单,所以什么情况用什么语言合适,程序员应该有个权衡,另外我爱c井

    4小时前

  •  
    流浪在卡利姆多的地狱犬 C#网络爬虫抓取小说
    受益

    4小时前

  •  
    心静自然凉 C#网络爬虫抓取小说
    没有限制频率和ip,真好

    4小时前

  •  
    Artking C#网络爬虫抓取小说
    尝试并修改了下,不错ꉂ ೭(˵¯̴͒ꇴ¯̴͒˵)౨”

    4小时前

  •  
    徐伟聪 C#网络爬虫抓取小说
    竟然是第一个阅读刚好可以学习正则表达式

    4小时前

以上留言由公众号筛选后显示
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尔雅慕客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值