C#网络爬虫抓取小说

2017-09-05DotNet

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

来源:苍

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、获取小说章节目录

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

// 获取小说名字

// 所有的章节都在这个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地址,查看章节内容。

通过分析,正文内容在

中。

// 获取正文

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#完整代码

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;

}

}

}

三、最后效果

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

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

阅读原文

阅读2332

15投诉

精选留言

写留言

  •  2
    馨馨我我
    抓取网页……还是用一个 html 解析器吧,比如 Less.Html

    4小时前

  •  1
    Sunday
    一不小心就被安利了一本小说

    3小时前

  •  
    怪蜀黍
    这种不需要绕过防爬虫的,火车头即可

    3小时前

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

    4小时前

  •  
    流浪在卡利姆多的地狱犬
    受益

    4小时前

  •  
    心静自然凉
    没有限制频率和ip,真好

    4小时前

  •  
    Artking
    尝试并修改了下,不错ꉂ ೭(˵¯̴͒ꇴ¯̴͒˵)౨”

    4小时前

  •  
    徐伟聪
    竟然是第一个阅读刚好可以学习正则表达式

    4小时前

以上留言由公众号筛选后显示

C#网络爬虫抓取小说相关推荐

  1. python展示全部好友_利用Python网络爬虫抓取微信好友的签名及其可视化展示

    前几天给大家分享了如何利用Python词云和wordart可视化工具对朋友圈数据进行可视化,利用Python网络爬虫抓取微信好友数量以及微信好友的男女比例,以及利用Python网络爬虫抓取微信好友的所 ...

  2. 基于Thinkphp5+phpQuery 网络爬虫抓取数据接口,统一输出接口数据api

    TP5_Splider 一个基于Thinkphp5+phpQuery 网络爬虫抓取数据接口 统一输出接口数据api.适合正在学习Vue,AngularJs框架学习 开发demo,需要接口并保证接口不跨 ...

  3. python爬虫微信朋友圈怎么发文字_如何利用Python网络爬虫抓取微信朋友圈的动态(上)...

    今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌 ...

  4. python爬虫好友聊天记录_利用Python网络爬虫抓取微信好友的签名及其可视化展示...

    前几天给大家分享了如何利用Python词云和wordart可视化工具对朋友圈数据进行可视化,利用Python网络爬虫抓取微信好友数量以及微信好友的男女比例,以及利用Python网络爬虫抓取微信好友的所 ...

  5. 用python爬虫下载视频_使用Python编写简单网络爬虫抓取视频下载资源

    我第一次接触爬虫这东西是在今年的5月份,当时写了一个博客搜索引擎,所用到的爬虫也挺智能的,起码比电影来了这个站用到的爬虫水平高多了! 回到用Python写爬虫的话题. Python一直是我主要使用的脚 ...

  6. python抓取微信朋友圈动态_2018最全如何利用Python网络爬虫抓取微信朋友圈的动态...

    今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌 ...

  7. python爬虫能爬取微信密码吗_如何利用Python网络爬虫抓取微信好友数量以及微信好友的男女比例...

    今天我们继续focus on微信,不过这次给大家带来的是利用Python网络爬虫抓取微信好友总数量和微信好友男女性别的分布情况.代码实现蛮简单的,具体的教程如下. 相信大家都知道,直接通过网页抓取微信 ...

  8. 2018最全如何利用Python网络爬虫抓取微信朋友圈的动态

    今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌 ...

  9. 如何利用Python网络爬虫抓取微信朋友圈的动态(上)

    今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌 ...

最新文章

  1. 求两个矩形重叠部分的面积
  2. 计算机起源于发展论文,关于计算机起源及发展的论文1500字左右,论文形式.
  3. R语言应用实战系列(六)-基于R的人工神经网络ANN算法和KNN算法(k-Nearest Neighbour)
  4. JS与OC中的方法相互调用
  5. blog项目中遇到的问题及解决
  6. c语言中如何让诊断代码右移_如何检测和诊断生产中的慢代码
  7. OpenGL中的二维编程——从简单的矩形开始
  8. 工程师软技能5:生产力
  9. Wi-Fi闪开,网速快 100 倍的Li-Fi要来了
  10. linux下tmux
  11. 操作系统系统用c语言写,用C语言写关于操作系统的一个问题。
  12. C语言 最小二乘 向量旋转 欧拉方法求洛伦兹方程
  13. python入门爬虫案例_[Python入门学习]-爬虫项目案例讲解
  14. 【玩转win7之简单几步为闪存盘加密】
  15. android 编译c代码吗,在Android手机上编译C代码
  16. Oracle数据库REDO损坏ora-00333修复手札
  17. kmz转换为dwg_CAD软件中的PDF插件如何实现转换DWG?一篇文章完整解释
  18. Oracle中rank函数详解
  19. 重温张欣穗购书衷心与申霞艳,张鸿等名师座谈《千万与春住》二零一九年六月二十四日
  20. Oracle数据库(五)用户 ,角色,权限

热门文章

  1. bio 生信博主网站 blog
  2. python爬虫完整代码下载页
  3. PMBOK(第六版) 学习笔记 ——《第一章 引论》
  4. linux查看磁盘是否SSD盘
  5. 函数节流(Throttle)和防抖(Debounce)解析及其OC实现
  6. Ubuntu之必装软件
  7. 为什么要限制兑换外汇额度?
  8. 苹果手机时间显示invalid Date
  9. 神经性脚臭案例整理(一)
  10. hadoop3-求分组topn