栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C# > C#教程

利用C#实现最基本的小说爬虫示例代码

C#教程 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

利用C#实现最基本的小说爬虫示例代码

前言

作为一个新手,最近在学习C#,自己折腾弄了个简单的小说爬虫,实现了把小说内容爬下来写入txt,还只能爬指定网站。

第一次搞爬虫,涉及到了网络协议,正则表达式,弄得手忙脚乱跑起来效率还差劲,慢慢改吧。下面话不多说了,来一起看看详细的介绍吧。

爬的目标:http://www.166xs.com/xiaoshuo/83/83557/

一、先写HttpWebRequest把网站扒下来

这里有几个坑,大概说下:

第一个就是记得弄个代理IP爬网站,第一次忘了弄代理然后ip就被封了。。。。。

第二个就是要判断网页是否压缩,第一次没弄结果各种转码gbk utf都是乱码。后面解压就好了。

/// 
  /// 抓取网页并转码
  /// 
  /// 
  /// 
  /// 
  public string HttpGet(string url, string post_parament)
  {
   string html;
   HttpWebRequest Web_Request = (HttpWebRequest)WebRequest.Create(url);
   Web_Request.Timeout = 30000;
   Web_Request.Method = "GET";
   Web_Request.UserAgent = "Mozilla/4.0";
   Web_Request.Headers.Add("Accept-Encoding", "gzip, deflate");
   //Web_Request.Credentials = CredentialCache.DefaultCredentials;

   //设置代理属性WebProxy-------------------------------------------------
   WebProxy proxy = new WebProxy("111.13.7.120", 80);
   //在发起HTTP请求前将proxy赋值给HttpWebRequest的Proxy属性
   Web_Request.Proxy = proxy;

   HttpWebResponse Web_Response = (HttpWebResponse)Web_Request.GetResponse();

   if (Web_Response.ContentEncoding.ToLower() == "gzip")  // 如果使用了GZip则先解压
   {
    using (Stream Stream_Receive = Web_Response.GetResponseStream())
    {
     using (var Zip_Stream = new GZipStream(Stream_Receive, CompressionMode.Decompress))
     {
      using (StreamReader Stream_Reader = new StreamReader(Zip_Stream, Encoding.Default))
      {
html = Stream_Reader.ReadToEnd();
      }
     }
    }
   }
   else
   {
    using (Stream Stream_Receive = Web_Response.GetResponseStream())
    {
     using (StreamReader Stream_Reader = new StreamReader(Stream_Receive, Encoding.Default))
     {
      html = Stream_Reader.ReadToEnd();
     }
    }
   }

   return html;
  }

二、下面就是用正则处理内容了,由于正则表达式不熟悉所以重复动作太多。

1.先获取网页内容

 IWebHttpRepository webHttpRepository = new WebHttpRepository();
   string html = webHttpRepository.HttpGet(Url_Txt.Text, "");

2.获取书名和文章列表

书名

文章列表

string Novel_Name = Regex.Match(html, @"(?<=)([Ss]*?)(?=)").Value; //获取书名

   Regex Regex_Menu = new Regex(@"(?is)(?<=
).+?(?=
)"); string Result_Menu = Regex_Menu.Match(html).Value; //获取列表内容 Regex Regex_List = new Regex(@"(?is)(?<=
).+?(?=
)"); var Result_List = Regex_List.Matches(Result_Menu); //获取列表集合

3.因为章节列表前面有多余的

,所以要剔除

int i = 0; //计数
   string Menu_Content = ""; //所有章节
   foreach (var x in Result_List)
   {
    if (i < 4)
    {
     //前面五个都不是章节列表,所以剔除
    }
    else
    {
     Menu_Content += x.ToString();
    }
    i++;
   }

4.然后获取的href和innerHTML,然后遍历访问获得内容和章节名称并处理,然后写入txt

Regex Regex_Href = new Regex(@"(?is)]*?href=(['""]?)(?[^'""s>]+)1[^>]*>(?(?:(?!).+?(?=

)"); string Result_Content = Rege_Content.Match(Content_Html).Value; //获取文章内容 Regex Regex_Main = new Regex(@"(    )(.*)"); string Rsult_Main = Regex_Main.Match(Result_Content).Value; //正文 string Screen_Content = Rsult_Main.Replace(" ", "").Replace("
", "rn"); Write_Content.WriteLine(Content_Text + "rn");//写入标题 Write_Content.WriteLine(Screen_Content);//写入内容 } Write_Content.Dispose(); Write_Content.Close(); MessageBox.Show(Novel_Name+".txt 创建成功!"); System.Diagnostics.Process.Start(Directory.GetCurrentDirectory() + \Novel\);

三、小说写入成功

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对考高分网的支持。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/123203.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号