现在市面上大部分都是PYthon 做的爬虫,这里另辟蹊径用一下c#
本文获取的网站是:https://www.bqktxt.com
有更好的方法欢迎大佬指点
好了!开始吧!

  1. 首先创建一个winfrom窗体应用,并画出窗体

用到的组件有:Lable,textbox,button,linklable,progressBar
各位注意区别


2. 创建一个接收类(用于传参)

  1. 检测URL按钮代码

这一步的主要作用是把网页的所有结构下载下来然后进行拆解,得到自己想要的部分。
我这里获取了"章节标题",“文章名称”,"每一章节的URL"等需要的信息。
我们来看一下网页的HTML然后可以更好的写正则表达式来获取内容

根据上图可以看到章节的内容全部都在dd标签里面,然后还分了【正文部分】和【最新章节】,一般来说获取正文部分就可以,看了他的结构以后就可以开始写代码啦!

  try{WebClient MyWebClient = new WebClient();MyWebClient.Credentials = CredentialCache.DefaultCredentials;//获取或设置用于向Internet资源的请求进行身份验证的网络凭据Byte[] pageData = MyWebClient.DownloadData("https://www.bqktxt.com/38_38836/");//我这里写死了可以在"下载URL那个输入框里面输入" //从指定网站下载数据string pageHtml = "";  //如果获取网站页面采用的是GB2312,则使用这句 if (pagetype == "GBK" || pagetype == "GB2312"){pageHtml = Encoding.Default.GetString(pageData);}if (pagetype == "UTF-8"){pageHtml = Encoding.UTF8.GetString(pageData);}Regex redl = new Regex(@"(?is)(?<=<dl>)(?:(?!</dl).)*"); //<dl>内容正则匹配Regex retile = new Regex(@"(?is)(?<=<h2>)(?:(?!</h2).)*");//<h2>内容正则匹配Regex redd = new Regex(@"(?is)(?<=<dd>)(?:(?!</dd).)*");//<dd>内容正则匹配//遍历出标题foreach (Match retiles in retile.Matches(pageHtml)){tilepage = retiles.Value;}foreach (Match rdl in redl.Matches(pageHtml)){ddpage += rdl.Value;}HtmlDocument dod = new HtmlDocument();dod.LoadHtml(pageHtml);HtmlNode nodesd = dod.DocumentNode.SelectSingleNode("span[@class='last']/a");string all = dod.DocumentNode.InnerText;//定义正文规则string name = $"<dt>《{tilepage}》正文卷</dt>";//获取正文在全文的位置int cp = ddpage.IndexOf(name);//获取正文string zhengwen = ddpage.Remove(0, cp);//.Replace(" ","");foreach (Match redds in redd.Matches(zhengwen)){apage += redds.Value + "\r\n";}//HtmlNode 获取a标签内容HtmlDocument doc = new HtmlDocument();doc.LoadHtml(apage);HtmlNode nodes = doc.DocumentNode.SelectSingleNode("/a");//章节标题biaoti = doc.DocumentNode.InnerText;Console.WriteLine("s");Regex reg = new Regex(@"(?is)<a[^>]*?href =(['""\s]?)(?<href>[^'""\s]*)\1[^>]*?>");MatchCollection match = reg.Matches(apage);foreach (Match m in match){url.Add(m.Groups["href"].Value);}label3.Text = tilepage;label5.Text = url.Count.ToString()+"章";MessageBox.Show("检测成功!可以下载");flag = true;}catch (Exception ex){MessageBox.Show(ex.Message);}

4.然后我们进行完善窗体按钮(选择存放文件的path)

FolderBrowserDialog folderBrowserDialog1 = new FolderBrowserDialog();if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)  //选择存储路径{string zipPath = folderBrowserDialog1.SelectedPath;textBox2.Text = zipPath;}
  1. 现在到了最重要的一步了

创建一个类我这里是(HttpHelper.cs)
代码如下!

 public class HttpHelper{public delegate void UpdateUI(int step);//声明一个更新主线程的委托public UpdateUI UpdateUIDelegate;public delegate void AccomplishTask();//声明一个在完成任务时通知主线程的委托public AccomplishTask TaskCallBack;public async void Write(object databased){database sd = new database(); //接收类sd = (database)databased;//拆箱int urlmuns = sd.urlmuns;List<string> urldata= sd.url;string filepath =sd.filepath;string pagetype = sd.pagetype;string zjname = sd.zjname;string a = "";string pageHtml = "";//获取的的html页面string t = "";//章节标题string ads = "";//过度参数string regexstr = @"<[^>]*>";//去除HTML标签string regexstrs = @"<[^>]*>"; //去除HTML标签Regex regexs = new Regex(@"<div id=""content"" class=""showtxt"">.*?</div>");Regex reso = new Regex(@"<h1>.*?</h1>");WebClient MyWebClient = new WebClient();string urldone = filepath + "\\" + zjname + ".txt";List<string> article = new List<string>();for (int i = 0; i < urlmuns; i++){article.Add("https://www.bqktxt.com" + urldata[i]);//把每一章节的URL 拼接一下.}for (int j = 0; j < article.Count; j++){//开始获取MyWebClient.Credentials = CredentialCache.DefaultCredentials;//获取或设置用于向Internet资源的请求进行身份验证的网络凭据Byte[] pageData = MyWebClient.DownloadData(article[j]); //从指定网站下载数据//如果获取网站页面采用的是GB2312,则使用这句 if (pagetype == "GBK" || pagetype == "GB2312"){pageHtml = Encoding.Default.GetString(pageData);}if (pagetype == "UTF-8"){pageHtml = Encoding.UTF8.GetString(pageData);}MatchCollection match = regexs.Matches(pageHtml);foreach (Match m in match){a = m.Value;}MatchCollection matchd = reso.Matches(pageHtml);foreach (Match m in matchd){t = m.Value;}t = Regex.Replace(t, regexstrs, string.Empty, RegexOptions.IgnoreCase);//去除HTML标签ads = Regex.Replace(a, regexstr, string.Empty, RegexOptions.IgnoreCase).Replace("&nbsp;", "");//删除多余代码只显示中文和标点string newads = ads.Replace("app2();", "");newads = newads.Replace("chaptererror();", "");newads = newads.Replace("read2();", "");try{if (!File.Exists(urldone))//是否有这个文件,有的话覆盖,没有的话创建{File.Create(urldone).Close();using (StreamWriter sw = new StreamWriter(urldone,false,Encoding.UTF8)){sw.WriteLine(t);//写入章节标题sw.WriteLine(newads);//写入章节内容sw.Close();//关闭sw.Dispose();}}else{using (StreamWriter sw = new StreamWriter(urldone, true))//加true是在原有的文本里面继续写入{await sw.WriteLineAsync("\r\n"+t+"\r\n"+ newads);sw.Close();sw.Dispose();}}UpdateUIDelegate(1);//更新UI动画}catch (Exception ex){  }}TaskCallBack();//异步回调}}

6.在winfrom程序的"全文下载"按钮调用刚刚写好的方法

 database da = new database(); //这里是装箱 da.urlmuns = url.Count;da.url = url;da.filepath = textBox2.Text;da.pagetype = pagetype;da.zjname = tilepage;int taskCount = url.Count; //总量this.progressBar1.Maximum = taskCount;//UI的最大数值this.progressBar1.Value = 0;//初始HttpHelper dataWrite = new HttpHelper();//实例化一个写入数据的类dataWrite.UpdateUIDelegate += UpdataUIStatus;//绑定更新任务状态的委托dataWrite.TaskCallBack += Accomplish;//绑定完成任务要调用的委托Thread thread = new Thread(new ParameterizedThreadStart(dataWrite.Write));thread.IsBackground = true;thread.Start(da);

然后是用的两个方法,就在winfrom的代码区定义就行

    //更新UIprivate void UpdataUIStatus(int step){if (InvokeRequired){this.Invoke(new AsynUpdateUI(delegate (int s){this.progressBar1.Value += s;this.label7.Text = this.progressBar1.Value.ToString() + "/" + this.progressBar1.Maximum.ToString();}), step);}else{this.progressBar1.Value += step;this.label7.Text = this.progressBar1.Value.ToString() + "/" + this.progressBar1.Maximum.ToString();}}private void Accomplish(){//还可以进行其他的一些完任务完成之后的逻辑处理MessageBox.Show("任务完成");}

这些全部写好以后就可以开始运行啦,看看效果吧!


好了本篇文章就到这里啦欢迎大佬指点

c#实现爬虫获取小说(.NET)相关推荐

  1. python爬虫获取小说根据正文调用函数传入章节地址列表_python爬虫之小说章节获取,聊斋志异小说完整版...

    "写鬼写妖高人一等,刺贪刺虐入骨三分." 没找到聊斋志异完整版的txt文档,那就把在线阅读的文章抓下来吧. 开发环境 python3.7 requests模块 lxml模块 获取分 ...

  2. python爬虫小说代码示例-Python从零开始写爬虫-4 解析HTML获取小说正文

    Python从零开始写爬虫-4 解析HTML获取小说正文 在上一节中, 我们已经学会如何获取小说的目录, 这一节我们将学习如何通过正则表达式(在第二节学习过)来获取小说正文. 首先, 先随便选择一个章 ...

  3. 学习笔记-spring-mybatis-jsoup-http-client小说站点爬虫(1)--获取小说站点章节列表

    获取小说站点章节列表 第一次写博客,写得不好请见谅 目的是让自己印象更加深刻,锻炼自己表达能力,同时可以和大家一起交流学习,大神勿喷! 本次学习教程来自吾爱破解小说站点爬虫-spring-mybati ...

  4. python爬虫小说代码示例-使用简单Python爬虫获取一个干净整洁的小说文件

    打开小说所在界面,右击选择查看网页源代码 1.在头部能够看到'charset=utf-8'得知文件的编码为'uft-8'!,url=http://www.17k.com/list/2921315.ht ...

  5. 网站爬取工具_Python项目:结合Django和爬虫开发小说网站,免安装,无广告

    前言 很多喜欢看小说的小伙伴都是是两袖清风的学生党,沉迷小说,不能自拔.奈何囊中甚是羞涩,没有money去看正版小说,但是往往这些免费的小说网站或者小说软件,随之而来的是大量的广告. Python嘛, ...

  6. NodeJs ES6 写简单爬虫 爬小说网站《我当方士那些年》

    个人网站地址 www.wenghaoping.com Vue + express + Mongodb构建 请大家多支持一下. 先上代码,然后在慢慢逼逼 Git地址,有需要的Clone ==先从小说网站 ...

  7. python爬虫获取起点中文网人气排行Top100(快速入门,新手必备!)

    本篇博客小菌为大家带来的是用python爬虫获取起点中文网人气排行Top100的分享,希望大家能在学习的过程中感受爬虫的魅力!         我们先根据网址https://www.qidian.co ...

  8. python爬虫下载小说_用PYTHON爬虫简单爬取网络小说

    用PYTHON爬虫简单爬取网络小说. 这里是17K小说网上,随便找了一本小说,名字是<千万大奖>. 里面主要是三个函数: 1.get_download_url() 用于获取该小说的所有章节 ...

  9. python爬虫17K小说网资料

    python爬虫17K小说网资料 爬虫作业要求:抓取小说网站为例,必须抓取一系列小说(不是一部小说)的篇名.作者.出版单位(或首发网站).出版时间(或网上发布时间).内容简介.小说封面图画.价格.读者 ...

最新文章

  1. 应该使用c# 预定义类型 还是绝对不要使用预定义类型。
  2. 薛定谔的流量杠杆,网红电商上市的激励与诅咒
  3. javascript技巧及常用事件方法集合(全)
  4. android--在命令行中生成Android的数字证书keystore文件
  5. 一个html文件创造多个页面,使页眉和页脚文件包含在多个html页面中。
  6. 处理PHP字符串的10个简单方法
  7. shiro的源码分析(一)
  8. 读 《.Net 之美》解析.Net Remoting (应用程序域)-- Part.1
  9. python关闭word_python自动化办公:玩转word之样式秘笈
  10. MCPC 2011Hdu4207-4214(未完全)题解
  11. windows 批量创建文件夹
  12. Window10笔记本电脑如何更改默认浏览器
  13. 基于java的健身房管理系统的设计与实现
  14. android 字体倒影,android实现TextView文字倒影效果
  15. 水瓶座|水瓶座性格分析
  16. %02d得意思是什么?
  17. Remove Duplicates
  18. JMF API 中文指导
  19. 关于计算机语言最高奖项 图灵奖 的12位得主!你认识几个?
  20. 超级计算机神威太湖之光图片,超级计算机“神威·太湖之光”世界最快

热门文章

  1. mysql rds数据库优势_云数据库 RDS MySQL究竟有何优势呢?
  2. Hark语音识别学习(一)-Hark desinger的使用
  3. Recovering Functional Mechanical Assemblies from Raw Scans
  4. python可以构建sem模型_Python Pandas Series.sem()用法及代码示例
  5. 【闲聊】人生如梦,一樽还酹江月
  6. 挂起和阻塞区别?sleep()和wait()的区别?
  7. JavaScript首次体验
  8. banner 生成利器 http://patorjk.com/software/taag
  9. nsga 的java实现_Java – Scala遗传算法(GA)库中的模拟二进制交叉(SBX)交叉运算符
  10. java rsa 文件加密解密_RSA 加密、解密(自己生成加密解密文件)