在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
心血来潮,想研究下爬虫,爬点小说。 通过百度选择了个小说网站,随便找了一本小说http://www.23us.so/files/article/html/13/13655/index.html。 1、分析html规则思路是获取小说章节目录,循环目录,抓取所有章节中的内容,拼到txt文本中。最后形成完本小说。 1、获取小说章节目录 通过分析,我在标注的地方获取小说名字及章节目录。 <meta name="keywords" content="无疆,无疆最新章节,无疆全文阅读"/>// 获取小说名字 <table cellspacing="1" cellpadding="0" bgcolor="#E4E4E4" id="at">// 所有的章节都在这个table中。 下面是利用正则,获取名字与目录。 // 获取小说名字 Match ma_name = Regex.Match(html, @"<meta name=""keywords"".+content=""(.+)""/>"); string name = ma_name.Groups[1].Value.ToString().Split(',')[0]; // 获取章节目录 Regex reg_mulu = new Regex(@"<table cellspacing=""1"" cellpadding=""0"" bgcolor=""#E4E4E4"" at"">(.|\n)*?</table>"); var mat_mulu = reg_mulu.Match(html); string mulu = mat_mulu.Groups[0].ToString(); 2、获取小说正文内容 通过章节a标签中的url地址,查看章节内容。 通过分析,正文内容在<dd >中。 // 获取正文 Regex reg = new Regex(@"<dd contents"">(.|\n)*?</dd>"); MatchCollection mc = reg.Matches(html_z); var mat = reg.Match(html_z); string content = mat.Groups[0].ToString().Replace("<dd id=\"contents\">", "").Replace("</dd>", "").Replace(" ", "").Replace("<br />", "\r\n"); 2、C#完整代码using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Text.RegularExpressions; using System.Web; using System.Web.Mvc; 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, @"<meta name=""keywords"".+content=""(.+)""/>"); string name = ma_name.Groups[1].Value.ToString().Split(',')[0]; // 获取章节目录 Regex reg_mulu = new Regex(@"<table cellspacing=""1"" cellpadding=""0"" bgcolor=""#E4E4E4"" at"">(.|\n)*?</table>"); var mat_mulu = reg_mulu.Match(html); string mulu = mat_mulu.Groups[0].ToString(); // 匹配a标签里面的url Regex tmpreg = new Regex("<a[^>]+?href=\"([^\"]+)\"[^>]*>([^<]+)</a>", 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是<a href="http://www.23us.so/files/article/html/13/13655/5638725.html">第一章 泰山之巅</a> //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, @"<meta name=""keywords"".+content=""(.+)"" />"); //string name = ma_name.Groups[1].Value.ToString().Split(',')[0]; // 获取标题,通过分析h1标签也可以得到章节标题 //string title = html_z.Replace("<h1>", "*").Replace("</h1>", "*").Split('*')[1]; // 获取正文 Regex reg = new Regex(@"<dd contents"">(.|\n)*?</dd>"); MatchCollection mc = reg.Matches(html_z); var mat = reg.Match(html_z); string content = mat.Groups[0].ToString().Replace("<dd id=\"contents\">", "").Replace("</dd>", "").Replace(" ", "").Replace("<br />", "\r\n"); 3、最后效果
补充: wlong 同学提了个建议,说用NSoup解析html更方便,我就去查了查,目前没有太大的感触,可能不太会用。DLL下载地址http://nsoup.codeplex.com/ NSoup.Nodes.Document doc = NSoup.NSoupClient.Parse(html); //获取meta //<meta name="keywords" content="无疆,无疆最新章节,无疆全文阅读"/>// 获取小说名字 NSoup.Select.Elements ele = doc.GetElementsByTag("meta"); string name = ele.Where(a=>a.Attr("name") == "keywords").Select(a=>a.Attr("content").ToString()).ToString(); foreach (var i in ele) { if (i.Attr("name") == "keywords") { name = i.Attr("content").ToString(); } } //获取章节 NSoup.Select.Elements eleChapter = doc.GetElementsByTag("table");//查找table,获取table里的html NSoup.Nodes.Document docChild = NSoup.NSoupClient.Parse(eleChapter.ToString()); NSoup.Select.Elements eleChild = docChild.GetElementsByTag("a");//查找a标签 //循环目录,获取正文内容 foreach (var j in eleChild) { // 获取章节标题 string title = j.Text(); // 获取文章内容 string htmlChild = cra.HttpGet(j.Attr("href").ToString(), ""); } 继续研究Html Agility Pack这个去。。。 |
请发表评论