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技能
-
2馨馨我我抓取网页……还是用一个 html 解析器吧,比如 Less.Html
4小时前
-
1Sunday一不小心就被安利了一本小说
3小时前
-
怪蜀黍这种不需要绕过防爬虫的,火车头即可
3小时前
-
souther我在前几周之前也只懂c#,其实算不上懂,比起其他的用的多而已,前几周有个爬虫需求,用c#试了几天后,在朋友的建议下换成了python,很快就实现了楼主类似的功能,学起来也简单,所以什么情况用什么语言合适,程序员应该有个权衡,另外我爱c井
4小时前
-
流浪在卡利姆多的地狱犬受益
4小时前
-
心静自然凉没有限制频率和ip,真好
4小时前
-
Artking尝试并修改了下,不错ꉂ ೭(˵¯̴͒ꇴ¯̴͒˵)౨”
4小时前
-
徐伟聪竟然是第一个阅读刚好可以学习正则表达式
4小时前