C#网络爬虫抓取小说
C#网络爬虫抓取小说
(点击上方蓝字,可快速关注我们)
来源:苍
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技能
15投诉
写留言
- 2馨馨我我抓取网页……还是用一个 html 解析器吧,比如 Less.Html
4小时前
- 1Sunday一不小心就被安利了一本小说
3小时前
- 怪蜀黍这种不需要绕过防爬虫的,火车头即可
3小时前
- souther我在前几周之前也只懂c#,其实算不上懂,比起其他的用的多而已,前几周有个爬虫需求,用c#试了几天后,在朋友的建议下换成了python,很快就实现了楼主类似的功能,学起来也简单,所以什么情况用什么语言合适,程序员应该有个权衡,另外我爱c井
4小时前
- 流浪在卡利姆多的地狱犬受益
4小时前
- 心静自然凉没有限制频率和ip,真好
4小时前
- Artking尝试并修改了下,不错ꉂ ೭(˵¯̴͒ꇴ¯̴͒˵)౨”
4小时前
- 徐伟聪竟然是第一个阅读刚好可以学习正则表达式
4小时前
C#网络爬虫抓取小说相关推荐
- python展示全部好友_利用Python网络爬虫抓取微信好友的签名及其可视化展示
前几天给大家分享了如何利用Python词云和wordart可视化工具对朋友圈数据进行可视化,利用Python网络爬虫抓取微信好友数量以及微信好友的男女比例,以及利用Python网络爬虫抓取微信好友的所 ...
- 基于Thinkphp5+phpQuery 网络爬虫抓取数据接口,统一输出接口数据api
TP5_Splider 一个基于Thinkphp5+phpQuery 网络爬虫抓取数据接口 统一输出接口数据api.适合正在学习Vue,AngularJs框架学习 开发demo,需要接口并保证接口不跨 ...
- python爬虫微信朋友圈怎么发文字_如何利用Python网络爬虫抓取微信朋友圈的动态(上)...
今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌 ...
- python爬虫好友聊天记录_利用Python网络爬虫抓取微信好友的签名及其可视化展示...
前几天给大家分享了如何利用Python词云和wordart可视化工具对朋友圈数据进行可视化,利用Python网络爬虫抓取微信好友数量以及微信好友的男女比例,以及利用Python网络爬虫抓取微信好友的所 ...
- 用python爬虫下载视频_使用Python编写简单网络爬虫抓取视频下载资源
我第一次接触爬虫这东西是在今年的5月份,当时写了一个博客搜索引擎,所用到的爬虫也挺智能的,起码比电影来了这个站用到的爬虫水平高多了! 回到用Python写爬虫的话题. Python一直是我主要使用的脚 ...
- python抓取微信朋友圈动态_2018最全如何利用Python网络爬虫抓取微信朋友圈的动态...
今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌 ...
- python爬虫能爬取微信密码吗_如何利用Python网络爬虫抓取微信好友数量以及微信好友的男女比例...
今天我们继续focus on微信,不过这次给大家带来的是利用Python网络爬虫抓取微信好友总数量和微信好友男女性别的分布情况.代码实现蛮简单的,具体的教程如下. 相信大家都知道,直接通过网页抓取微信 ...
- 2018最全如何利用Python网络爬虫抓取微信朋友圈的动态
今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌 ...
- 如何利用Python网络爬虫抓取微信朋友圈的动态(上)
今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌 ...
最新文章
- 求两个矩形重叠部分的面积
- 计算机起源于发展论文,关于计算机起源及发展的论文1500字左右,论文形式.
- R语言应用实战系列(六)-基于R的人工神经网络ANN算法和KNN算法(k-Nearest Neighbour)
- JS与OC中的方法相互调用
- blog项目中遇到的问题及解决
- c语言中如何让诊断代码右移_如何检测和诊断生产中的慢代码
- OpenGL中的二维编程——从简单的矩形开始
- 工程师软技能5:生产力
- Wi-Fi闪开,网速快 100 倍的Li-Fi要来了
- linux下tmux
- 操作系统系统用c语言写,用C语言写关于操作系统的一个问题。
- C语言 最小二乘 向量旋转 欧拉方法求洛伦兹方程
- python入门爬虫案例_[Python入门学习]-爬虫项目案例讲解
- 【玩转win7之简单几步为闪存盘加密】
- android 编译c代码吗,在Android手机上编译C代码
- Oracle数据库REDO损坏ora-00333修复手札
- kmz转换为dwg_CAD软件中的PDF插件如何实现转换DWG?一篇文章完整解释
- Oracle中rank函数详解
- 重温张欣穗购书衷心与申霞艳,张鸿等名师座谈《千万与春住》二零一九年六月二十四日
- Oracle数据库(五)用户 ,角色,权限