通过线程,HttpWebResponse,正则获取句子迷中的句子

前端之家收集整理的这篇文章主要介绍了通过线程,HttpWebResponse,正则获取句子迷中的句子前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

之前一直在关注句子迷这个网站,在里面可以找到自己喜欢的名人的金典语录。

每一次都去打开,再去翻页查看太烦有没有什么方法可以把网站中的句子直接抓出来,保存到本地txt文件中?
然后在网上查看了一些资料,自己动手写了一个控制台应用程序。

注:代码存在点问题,多次发起请求,线程会被占用,目前没有解决;求救中

具体实现方式:

步骤1:通过HttpWebResponse发送一个请求,将整个HTML页面请求过来,将全部数据读入StreamReader中,下图@R_404_161@

步骤2:将读入流中的数据进行处理,只取包含句子的文本,这里面需要查询页面的中html。

在取文本的过程中,使用正则表达式,取出想要的数据

  1. ///正则表达式
  2. Regex regText = new Regex(@"<div\s+class\=\""views-field-PHPcode-1\"">([\S\s]*?)</div>",RegexOptions.IgnoreCase);

步骤3:对上面的标签,在进一步进行提取

  1. Regex objRegExp = new Regex("<(.|\n)+?>");

具体代码如下:

  1. class Program
  2. {
  3. static ReaderWriterLock writeLock = new ReaderWriterLock();
  4. const int LOCK = 1000; //申请读写时间
  5. const int SLEEP = 100; //线程挂起时间
  6. static void Main(string[] args)
  7. {
  8. Console.WriteLine("-------------------句子迷文档下载----------");
  9. Console.WriteLine("操作API:");
  10. Console.WriteLine("注释1:查询的的作者名,以逗号(英文)隔开,例子如下:");
  11. Console.WriteLine(" 鲁迅,胡适,顾城");
  12.  
  13. Console.WriteLine("注释2:保存的盘符,例子如下:");
  14. Console.WriteLine(" X:\\\\句子迷 ");
  15. Console.WriteLine("-------------------文档结束----------");
  16. Console.WriteLine("请输入需要保存的盘:");
  17. directoryName1 = Console.ReadLine();
  18.  
  19. Console.WriteLine("请输入作者姓名:");
  20. string writers = Console.ReadLine();
  21. string[] strWriter = writers.Split(',');
  22. //string[] strWriter = { "鲁迅","胡适","belle","stars" };
  23. for (int i = 0; i < strWriter.Length; i++)
  24. {
  25. Thread thread = new Thread(DownLoad1);
  26. thread.Name = strWriter[i];
  27. thread.Start();
  28. }
  29.  
  30. Console.ReadKey();
  31.  
  32.  
  33. }
  34.  
  35. #region 通过网页获取句子迷中的名言名句
  36. /// <summary>
  37. /// 通过网页获取句子迷中的名言名句
  38. /// </summary>
  39. /// <param name="category"></param>
  40. public static void DownLoad1()
  41. {
  42. string url = string.Empty;
  43. bool flag = true;//遇到取文件异常就直接跳出
  44.  
  45. for (int pageSize = 0; pageSize < 10; pageSize++)
  46. {
  47. try
  48. {
  49. string writerName = Thread.CurrentThread.Name; ;
  50. //查询作者列子
  51. //if (pageSize == 0)
  52. // url = "http://www.juzimi.com/writer/徐志摩";
  53. //else
  54. // url = "http://www.juzimi.com/writer/徐志摩?page=" + pageSize;
  55.  
  56. //第一版查询功能
  57. //if (pageSize == 0)
  58. // url = "http://www.juzimi.com/writer/"+writerName;
  59. //else
  60. // url = "http://www.juzimi.com/writer/" + writerName + "?page=" + pageSize;
  61. if (pageSize == 0)
  62. url = "http://www.juzimi.com/search/node/" + writerName + "%20type:sentence";
  63. else
  64. url = "http://www.juzimi.com/search/node/" + writerName + "%20type%3Asentence?page=" + pageSize;
  65. //创建http链接
  66. var request = (HttpWebRequest)WebRequest.Create(url);
  67. //request.Timeout = 1000 * 10; //5s过期
  68. var response = (HttpWebResponse)request.GetResponse();
  69. Stream stream = response.GetResponseStream();
  70. StreamReader sr = new StreamReader(stream);
  71. string content = sr.ReadToEnd();
  72. var list = GetHtmlTextList(content);
  73. if (list.Count == 0)
  74. {
  75. Console.WriteLine("时间:" + DateTime.Now + " 当前网址:" + url + ":未找到相关信息;" + "当前线程:" + Thread.CurrentThread.ManagedThreadId);
  76. flag = false;
  77. break;
  78. }
  79. try
  80. {
  81. //文件保存文件
  82. string directoryName = string.IsNullOrEmpty(directoryName1) ? "X:\\句子迷" : directoryName1;
  83. //文件
  84. string fileName = writerName;
  85. Write(directoryName,fileName,list);
  86. Console.WriteLine("时间:" + DateTime.Now + " 当前网址:" + url + "句子信息下载完成!" + "当前线程:" + Thread.CurrentThread.ManagedThreadId);
  87. }
  88. catch (Exception e)
  89. {
  90. Console.WriteLine("时间:" + DateTime.Now + " 当前网址:" + url + " 错误信息:" + e.Message + "当前线程:" + Thread.CurrentThread.ManagedThreadId);
  91. continue;
  92. }
  93. }
  94. catch (Exception ex)
  95. {
  96. if (ex.ToString().Contains("404"))
  97. {
  98. Console.WriteLine("时间:" + DateTime.Now + " 当前网址:" + url + " 错误信息:" + ex.Message + "当前线程:" + Thread.CurrentThread.ManagedThreadId);
  99. flag = false;
  100. break;
  101. }
  102. else
  103. {
  104. Console.WriteLine("时间:" + DateTime.Now + " 当前网址:" + url + " 错误信息:" + ex.Message + "当前线程:" + Thread.CurrentThread.ManagedThreadId);
  105. }
  106. }
  107.  
  108. if (!flag)
  109. {
  110. break;
  111. }
  112.  
  113. }
  114. }
  115.  
  116. /// <summary>
  117. /// 保存句子迷中的句子
  118. /// </summary>
  119. /// <param name="path">保存路劲地址</param>
  120. /// /// <param name="path">句子迷中的句子</param>
  121. public static void Write(string path,string fileName,List<string> strBook)
  122. {
  123.  
  124. writeLock.AcquireWriterLock(LOCK);
  125. FileStream fs = null;
  126. //判断文件夹是否存在
  127. if (!Directory.Exists(path))
  128. Directory.CreateDirectory(path);
  129. //判断集体文件保存路径是否存在
  130. string filePalce = path + "\\" + fileName + ".txt";
  131. if (!File.Exists(filePalce))
  132. {
  133. File.Create(filePalce);
  134. fs = new FileStream(filePalce,FileMode.Create);
  135. }
  136. else
  137. {
  138. fs = new FileStream(filePalce,FileMode.Append);
  139. }
  140.  
  141. StreamWriter sw = new StreamWriter(fs);
  142. foreach (var item in strBook)
  143. {
  144. //开始写入
  145. sw.Write(item + "\r\n\r\n");
  146. }
  147. Thread.Sleep(SLEEP);
  148. //清空缓冲区
  149. sw.Flush();
  150. //关闭
  151. sw.Close();
  152. fs.Close();
  153. writeLock.ReleaseWriterLock();
  154.  
  155. }
  156.  
  157.  
  158. /// <summary>
  159. /// 取得HTML中所有图片的 URL。
  160. /// </summary>
  161. /// <param name="sHtmlText">@R_404_161@</param>
  162. /// <returns>图片的URL列表</returns>
  163. public static List<string> GetHtmlTextList(string sHtmlText)
  164. {
  165. // 定义正则表达式用来匹配 text 标签
  166. Regex regText = new Regex(@"<div\s+class\=\""views-field-PHPcode-1\"">([\S\s]*?)</div>",RegexOptions.IgnoreCase);
  167.  
  168. // 搜索匹配的字符串
  169. MatchCollection matches = regText.Matches(sHtmlText);
  170.  
  171. List<string> sUrlList = new List<string>();
  172.  
  173. // 取得匹配项列表
  174. foreach (Match match in matches)
  175. {
  176. sUrlList.Add(replceHtml(match.Value));
  177. }
  178. return sUrlList;
  179. }
  180.  
  181. /// <summary>
  182. /// 将取出来的含有html的标签替换掉,只留下里面的值
  183. /// </summary>
  184. /// <param name="strHtml"></param>
  185. /// <returns></returns>
  186. public static string replceHtml(string strHtml)
  187. {
  188. Regex objRegExp = new Regex("<(.|\n)+?>");
  189. return objRegExp.Replace(strHtml,"");
  190. }
  191. #endregion

运行结果:

本地保存路径,及打开文件效果

猜你在找的正则表达式相关文章