C#最基本的小说爬虫

新手学习C#,自己折腾弄了个简单的小说爬虫,实现了把小说内容爬下来写入txt,还只能爬指定网站。

第一次搞爬虫,涉及到了网络协议,正则表达式,弄得手忙脚乱跑起来效率还差劲,慢慢改吧。

爬的目标:http://www.166xs.com/xiaoshuo/83/83557/

一、先写HttpWebRequest把网站扒下来

这里有几个坑,大概说下:

第一个就是记得弄个代理IP爬网站,第一次忘了弄代理然后ip就被封了。。。。。

第二个就是要判断网页是否压缩,第一次没弄结果各种转码gbk utf都是乱码。后面解压就好了。

/// <summary>
        /// 抓取网页并转码
        /// </summary>
        /// <param name="url"></param>
        /// <param name="post_parament"></param>
        /// <returns></returns>
        public string HttpGet(string url, string post_parament)
        {
            string html;
            HttpWebRequest Web_Request = (HttpWebRequest)WebRequest.Create(url);
            Web_Request.Timeout = 30000;
            Web_Request.Method = "GET";
            Web_Request.UserAgent = "Mozilla/4.0";
            Web_Request.Headers.Add("Accept-Encoding", "gzip, deflate");
            //Web_Request.Credentials = CredentialCache.DefaultCredentials;

            //设置代理属性WebProxy-------------------------------------------------
            WebProxy proxy = new WebProxy("111.13.7.120", 80);
            //在发起HTTP请求前将proxy赋值给HttpWebRequest的Proxy属性
            Web_Request.Proxy = proxy;

            HttpWebResponse Web_Response = (HttpWebResponse)Web_Request.GetResponse();

            if (Web_Response.ContentEncoding.ToLower() == "gzip")       // 如果使用了GZip则先解压
            {
                using (Stream Stream_Receive = Web_Response.GetResponseStream())
                {
                    using (var Zip_Stream = new GZipStream(Stream_Receive, CompressionMode.Decompress))
                    {
                        using (StreamReader Stream_Reader = new StreamReader(Zip_Stream, Encoding.Default))
                        {
                            html = Stream_Reader.ReadToEnd();
                        }
                    }
                }
            }
            else
            {
                using (Stream Stream_Receive = Web_Response.GetResponseStream())
                {
                    using (StreamReader Stream_Reader = new StreamReader(Stream_Receive, Encoding.Default))
                    {
                        html = Stream_Reader.ReadToEnd();
                    }
                }
            }

            return html;
        }

二、下面就是用正则处理内容了,由于正则表达式不熟悉所以重复动作太多。

1.先获取网页内容

 IWebHttpRepository webHttpRepository = new WebHttpRepository();
            string html = webHttpRepository.HttpGet(Url_Txt.Text, "");

2.获取书名和文章列表

书名

文章列表

    string Novel_Name = Regex.Match(html, @"(?<=<h1>)([\S\s]*?)(?=</h1>)").Value;  //获取书名

            Regex Regex_Menu = new Regex(@"(?is)(?<=<dl class=""book_list"">).+?(?=</dl>)");
            string Result_Menu = Regex_Menu.Match(html).Value;   //获取列表内容

            Regex Regex_List = new Regex(@"(?is)(?<=<dd>).+?(?=</dd>)");
            var Result_List = Regex_List.Matches(Result_Menu);  //获取列表集合

3.因为章节列表前面有多余的<dd>,所以要剔除

int i = 0;  //计数
            string Menu_Content = "";   //所有章节
            foreach (var x in Result_List)
            {
                if (i < 4)
                {
                    //前面五个都不是章节列表,所以剔除
                }
                else
                {
                    Menu_Content += x.ToString();
                }
                i++;
            }

4.然后获取<a>的href和innerHTML,然后遍历访问获得内容和章节名称并处理,然后写入txt

   Regex Regex_Href = new Regex(@"(?is)<a[^>]*?href=([‘""]?)(?<url>[^‘""\s>]+)\1[^>]*>(?<text>(?:(?!</?a\b).)*)</a>");
            MatchCollection Result_Match_List = Regex_Href.Matches(Menu_Content);   //获取href链接和a标签 innerHTML 

            string Novel_Path = Directory.GetCurrentDirectory() + "\\Novel\\" + Novel_Name + ".txt";     //小说地址
            File.Create(Novel_Path).Close();
            StreamWriter Write_Content = new StreamWriter(Novel_Path);

            foreach (Match Result_Single in Result_Match_List)
            {
                string Url_Text = Result_Single.Groups["url"].Value;
                string Content_Text = Result_Single.Groups["text"].Value;

                string Content_Html = webHttpRepository.HttpGet(Url_Txt.Text + Url_Text, "");//获取内容页

                Regex Rege_Content = new Regex(@"(?is)(?<=<p class=""Book_Text"">).+?(?=</p>)");
                string Result_Content = Rege_Content.Match(Content_Html).Value; //获取文章内容

                Regex Regex_Main = new Regex(@"(&nbsp;&nbsp;&nbsp;&nbsp;)(.*)");
                string Rsult_Main = Regex_Main.Match(Result_Content).Value; //正文
                string Screen_Content = Rsult_Main.Replace("&nbsp;", "").Replace("<br />", "\r\n");

                Write_Content.WriteLine(Content_Text + "\r\n");//写入标题
                Write_Content.WriteLine(Screen_Content);//写入内容
            }

            Write_Content.Dispose();
            Write_Content.Close();
            MessageBox.Show(Novel_Name+".txt 创建成功!");
            System.Diagnostics.Process.Start(Directory.GetCurrentDirectory() + "\\Novel\\");

三、小说写入成功

时间: 2024-10-07 14:01:34

C#最基本的小说爬虫的相关文章

使用scrapy制作的小说爬虫

爬虫配套的django网站  https://www.zybuluo.com/xuemy268/note/63660 首先是安装scrapy,在Windows下的安装比较麻烦,大家好好百度下,这里就不细说了,在ubuntu下的安装 apt-get install python-dev apt-get install python-lxml apt-get install libffi-dev pip install scrapy 爬取小说的话无非就是爬取两个页面,小说介绍页和小说章节页,然后又分

【nodejs爬虫】使用async控制并发写一个小说爬虫

最近在做一个书城项目,数据用爬虫爬取,百度了一下找到这个网站,以择天记这本小说为例. 爬虫用到了几个模块,cheerio,superagent,async. superagent是一个http请求模块,详情可参考链接. cheerio是一个有着jQuery类似语法的文档解析模块,你可以简单理解为nodejs中的jQuery. async是一个异步流程控制模块,在这里我们主要用到async的mapLimit(coll, limit, iteratee, callback) async.mapLim

小说爬虫

原文引用https://www.dazhuanlan.com/2019/08/26/5d62f6fd2023a/ 小说网址 https://www.uxiaoshuo.com/ 使用绝色妖娆:鬼医至尊为例(主要是女朋友想看^_^) 下面是进程代码 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676

Nodejs——简单小说爬虫实现

1 //引入模块 2 const http = require('http') 3 const fs = require('fs') 4 const cheerio = require('cheerio') 5 const iconv = require('iconv-lite') 6 //第一章url 7 const url = 'http://www.81zw.com/book/8634/745331.html' 8 //开始章节数 9 let i = 1 10 //最大获取章节数 11 l

python爬虫之小说网站--下载小说(正则表达式)

思路: 1.找到要下载的小说首页,打开网页源代码进行分析(例:https://www.kanunu8.com/files/old/2011/2447.html) 2.分析自己要得到的内容,首先分析url,发现只有后面的是变化的,先获得小说的没有相对路径,然后组合成新的url(每章小说的url) 3.获得每章小说的内容,进行美化处理 代码如下: #小说爬虫 import requests import re url='https://www.kanunu8.com/book4/10509/' #因

python第三方模块精选

python不但有着强大丰富的"内置电池",同样的,第三方模块也是非常的多.目前收集了requests.paramiko.pymsql,以后会陆续添加: 一.requests Python标准库中提供了:urllib等模块以供Http请求,但是,它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务. 利用urllib发送GET请求: 1 2 3 4 5 import urllib.request f = urllib.

2015暑假记录

暑假记录 date work 2015/7/13-2015/7/14 win下安装scrapy 安装流程: 重新安装python2.7 安装pip,easy_install 使用pip安装lxml,pyOpenSSL,Zope.Interface,twisted,pywin32 注意所有的系统版本都需要对上,否则在twisted的deferred会出现错误 2015/7/15 简易版python小说爬虫

.NET4.5 WFP中用WebBrowser获取/操作网页html代码

引言 想给自己之前写的网页小说爬虫程序更新换代,之前一直是用winform的形式写的程序,因此这一次更新打算把UI换成WPF(因为听说WPF很漂亮),顺便也以此引入WPF的学习. 那么作为网页爬虫程序,最重要的就是html源码的获取了,通常的获取方式有几种:HttpWebRequest.WebRequest.WebClient.WebBrowser等.由于我这里写的爬虫软件针对的网站需要先登录才能看到小说内容,而我一次爬取的内容不多都是短篇小说,因此不需要考虑到爬取的速度,因此自然是打算使用We

Python 爬虫-抓取小说《鬼吹灯之精绝古城》

想看小说<鬼吹灯之精绝古城>,可是网页版的好多广告,还要一页一页的翻,还无法复制,于是写了个小爬虫,保存到word里慢慢看. 代码如下: """ 爬取<鬼吹灯之精绝古城>小说 """ from selenium import webdriver import os from docx import Document class DownloadFiles(): def __init__(self): self.baseUr