Source Code: http://download.csdn.net/download/qdalong/10271880

这是爬取网页内容,像是这对大家来说都是不难得,但是在这里有一些小改动,代码献上,大家参考

  1. 1 private string GetHttpWebRequest(string url)
  2. 2 {
  3. 3 HttpWebResponse result;
  4. 4 string strHTML = string.Empty;
  5. 5 try
  6. 6 {
  7. 7 Uri uri = new Uri(url);
  8. 8 WebRequest webReq = WebRequest.Create(uri);
  9. 9 WebResponse webRes = webReq.GetResponse();
  10. 10
  11. 11 HttpWebRequest myReq = (HttpWebRequest)webReq;
  12. 12 myReq.UserAgent = "User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705";
  13. 13 myReq.Accept = "*/*";
  14. 14 myReq.KeepAlive = true;
  15. 15 myReq.Headers.Add("Accept-Language", "zh-cn,en-us;q=0.5");
  16. 16 result = (HttpWebResponse)myReq.GetResponse();
  17. 17 Stream receviceStream = result.GetResponseStream();
  18. 18 StreamReader readerOfStream = new StreamReader(receviceStream, System.Text.Encoding.GetEncoding("utf-8"));
  19. 19 strHTML = readerOfStream.ReadToEnd();
  20. 20 readerOfStream.Close();
  21. 21 receviceStream.Close();
  22. 22 result.Close();
  23. 23 }
  24. 24 catch
  25. 25 {
  26. 26 Uri uri = new Uri(url);
  27. 27 WebRequest webReq = WebRequest.Create(uri);
  28. 28 HttpWebRequest myReq = (HttpWebRequest)webReq;
  29. 29 myReq.UserAgent = "User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705";
  30. 30 myReq.Accept = "*/*";
  31. 31 myReq.KeepAlive = true;
  32. 32 myReq.Headers.Add("Accept-Language", "zh-cn,en-us;q=0.5");
  33. 33 //result = (HttpWebResponse)myReq.GetResponse();
  34. 34 try
  35. 35 {
  36. 36 result = (HttpWebResponse)myReq.GetResponse();
  37. 37 }
  38. 38 catch (WebException ex)
  39. 39 {
  40. 40 result = (HttpWebResponse)ex.Response;
  41. 41 }
  42. 42 Stream receviceStream = result.GetResponseStream();
  43. 43 StreamReader readerOfStream = new StreamReader(receviceStream, System.Text.Encoding.GetEncoding("gb2312"));
  44. 44 strHTML = readerOfStream.ReadToEnd();
  45. 45 readerOfStream.Close();
  46. 46 receviceStream.Close();
  47. 47 result.Close();
  48. 48 }
  49. 49 return strHTML;
  50. 50 }

  这是根据url爬取网页远吗,有一些小改动,很多网页有不同的编码格式,甚至有些网站做了反爬取的防范,这个方法经过能够改动也能爬去

以下是爬取网页所有的网址链接

  1. /// <summary>
  2. /// 提取HTML代码中的网址
  3. /// </summary>
  4. /// <param name="htmlCode"></param>
  5. /// <returns></returns>
  6. private static List<string> GetHyperLinks(string htmlCode, string url)
  7. {
  8. ArrayList al = new ArrayList();
  9. bool IsGenxin = false;
  10. StringBuilder weburlSB = new StringBuilder();//SQL
  11. StringBuilder linkSb = new StringBuilder();//展示数据
  12. List<string> Weburllistzx = new List<string>();//新增
  13. List<string> Weburllist = new List<string>();//旧的
  14. string ProductionContent = htmlCode;
  15. Regex reg = new Regex(@"http(s)?://([\w-]+\.)+[\w-]+/?");
  16. string wangzhanyuming = reg.Match(url, 0).Value;
  17. MatchCollection mc = Regex.Matches(ProductionContent.Replace("href=\"/", "href=\"" + wangzhanyuming).Replace("href='/", "href='" + wangzhanyuming).Replace("href=/", "href=" + wangzhanyuming).Replace("href=\"./", "href=\"" + wangzhanyuming), @"<[aA][^>]* href=[^>]*>", RegexOptions.Singleline);
  18. int Index = 1;
  19. foreach (Match m in mc)
  20. {
  21. MatchCollection mc1 = Regex.Matches(m.Value, @"[a-zA-z]+://[^\s]*", RegexOptions.Singleline);
  22. if (mc1.Count > 0)
  23. {
  24. foreach (Match m1 in mc1)
  25. {
  26. string linkurlstr = string.Empty;
  27. linkurlstr = m1.Value.Replace("\"", "").Replace("'", "").Replace(">", "").Replace(";", "");
  28. weburlSB.Append("$-$");
  29. weburlSB.Append(linkurlstr);
  30. weburlSB.Append("$_$");
  31. if (!Weburllist.Contains(linkurlstr) && !Weburllistzx.Contains(linkurlstr))
  32. {
  33. IsGenxin = true;
  34. Weburllistzx.Add(linkurlstr);
  35. linkSb.AppendFormat("{0}<br/>", linkurlstr);
  36. }
  37. }
  38. }
  39. else
  40. {
  41. if (m.Value.IndexOf("javascript") == -1)
  42. {
  43. string amstr = string.Empty;
  44. string wangzhanxiangduilujin = string.Empty;
  45. wangzhanxiangduilujin = url.Substring(0, url.LastIndexOf("/") + 1);
  46. amstr = m.Value.Replace("href=\"", "href=\"" + wangzhanxiangduilujin).Replace("href='", "href='" + wangzhanxiangduilujin);
  47. MatchCollection mc11 = Regex.Matches(amstr, @"[a-zA-z]+://[^\s]*", RegexOptions.Singleline);
  48. foreach (Match m1 in mc11)
  49. {
  50. string linkurlstr = string.Empty;
  51. linkurlstr = m1.Value.Replace("\"", "").Replace("'", "").Replace(">", "").Replace(";", "");
  52. weburlSB.Append("$-$");
  53. weburlSB.Append(linkurlstr);
  54. weburlSB.Append("$_$");
  55. if (!Weburllist.Contains(linkurlstr) && !Weburllistzx.Contains(linkurlstr))
  56. {
  57. IsGenxin = true;
  58. Weburllistzx.Add(linkurlstr);
  59. linkSb.AppendFormat("{0}<br/>", linkurlstr);
  60. }
  61. }
  62. }
  63. }
  64. Index++;
  65. }
  66. return Weburllistzx;
  67. }

这块的技术其实就是简单的使用了正则去匹配!接下来献上获取标题,以及存储到xml文件的方法

  1. 1 /// <summary>
  2. 2 /// // 把网址写入xml文件
  3. 3 /// </summary>
  4. 4 /// <param name="strURL"></param>
  5. 5 /// <param name="alHyperLinks"></param>
  6. 6 private static void WriteToXml(string strURL, List<string> alHyperLinks)
  7. 7 {
  8. 8 XmlTextWriter writer = new XmlTextWriter(@"D:\HyperLinks.xml", Encoding.UTF8);
  9. 9 writer.Formatting = Formatting.Indented;
  10. 10 writer.WriteStartDocument(false);
  11. 11 writer.WriteDocType("HyperLinks", null, "urls.dtd", null);
  12. 12 writer.WriteComment("提取自" + strURL + "的超链接");
  13. 13 writer.WriteStartElement("HyperLinks");
  14. 14 writer.WriteStartElement("HyperLinks", null);
  15. 15 writer.WriteAttributeString("DateTime", DateTime.Now.ToString());
  16. 16 foreach (string str in alHyperLinks)
  17. 17 {
  18. 18 string title = GetDomain(str);
  19. 19 string body = str;
  20. 20 writer.WriteElementString(title, null, body);
  21. 21 }
  22. 22 writer.WriteEndElement();
  23. 23 writer.WriteEndElement();
  24. 24 writer.Flush();
  25. 25 writer.Close();
  26. 26 }
  27. 27 /// <summary>
  28. 28 /// 获取网址的域名后缀
  29. 29 /// </summary>
  30. 30 /// <param name="strURL"></param>
  31. 31 /// <returns></returns>
  32. 32 private static string GetDomain(string strURL)
  33. 33 {
  34. 34 string retVal;
  35. 35 string strRegex = @"(\.com/|\.net/|\.cn/|\.org/|\.gov/)";
  36. 36 Regex r = new Regex(strRegex, RegexOptions.IgnoreCase);
  37. 37 Match m = r.Match(strURL);
  38. 38 retVal = m.ToString();
  39. 39 strRegex = @"\.|/$";
  40. 40 retVal = Regex.Replace(retVal, strRegex, "").ToString();
  41. 41 if (retVal == "")
  42. 42 retVal = "other";
  43. 43 return retVal;
  44. 44 }
  45. 45 /// <summary>
  46. 46 /// 获取标题
  47. 47 /// </summary>
  48. 48 /// <param name="html"></param>
  49. 49 /// <returns></returns>
  50. 50 private static string GetTitle(string html)
  51. 51 {
  52. 52 string titleFilter = @"<title>[\s\S]*?</title>";
  53. 53 string h1Filter = @"<h1.*?>.*?</h1>";
  54. 54 string clearFilter = @"<.*?>";
  55. 55
  56. 56 string title = "";
  57. 57 Match match = Regex.Match(html, titleFilter, RegexOptions.IgnoreCase);
  58. 58 if (match.Success)
  59. 59 {
  60. 60 title = Regex.Replace(match.Groups[0].Value, clearFilter, "");
  61. 61 }
  62. 62
  63. 63 // 正文的标题一般在h1中,比title中的标题更干净
  64. 64 match = Regex.Match(html, h1Filter, RegexOptions.IgnoreCase);
  65. 65 if (match.Success)
  66. 66 {
  67. 67 string h1 = Regex.Replace(match.Groups[0].Value, clearFilter, "");
  68. 68 if (!String.IsNullOrEmpty(h1) && title.StartsWith(h1))
  69. 69 {
  70. 70 title = h1;
  71. 71 }
  72. 72 }
  73. 73 return title;
  74. 74 }

简单的C#网络爬虫的更多相关文章

  1. 简单的Java网络爬虫(获取一个网页中的邮箱)

    import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; impo ...

  2. 一个简单的Python网络爬虫(抓图),针对某论坛.

    #coding:utf-8 import urllib2 import re import threading #图片下载 def loadImg(addr,x,y,artName): data = ...

  3. 网络爬虫(java)

       陆陆续续做了有一个月,期间因为各种技术问题被多次暂停,最关键的一次主要是因为存储容器使用的普通二叉树,在节点权重相同的情况下导致树高增高,在进行遍历的时候效率大大降低,甚至在使用递归的时候导致栈 ...

  4. 网络爬虫与搜索引擎优化(SEO)

    爬虫及爬行方式 爬虫有很多名字,比如web机器人.spider等,它是一种可以在无需人类干预的情况下自动进行一系列web事务处理的软件程序.web爬虫是一种机器人,它们会递归地对各种信息性的web站点 ...

  5. 网络爬虫与搜索引擎优化(SEO)

    一.网络爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引. ...

  6. 第三次作业-Python网络爬虫与信息提取

    1.注册中国大学MOOC 2.选择北京理工大学嵩天老师的<Python网络爬虫与信息提取>MOOC课程 3.学习完成第0周至第4周的课程内容,并完成各周作业 过程. 5.写一篇不少于100 ...

  7. 13. Go 语言网络爬虫

    Go 语言网络爬虫 本章将完整地展示一个应用程序的设计.编写和简单试用的全过程,从而把前面讲到的所有 Go 知识贯穿起来.在这个过程中,加深对这些知识的记忆和理解,以及再次说明怎样把它们用到实处.由本 ...

  8. python网络爬虫进入(一)——简单的博客爬行动物

    最近.对于图形微信公众号.互联网收集和阅读一些疯狂的-depth新闻和有趣,发人深思文本注释,并选择最佳的发表论文数篇了.但看着它的感觉是一个麻烦的一人死亡.寻找一个简单的解决方案的方法,看看你是否可 ...

  9. [Python学习] 简单网络爬虫抓取博客文章及思想介绍

            前面一直强调Python运用到网络爬虫方面很有效,这篇文章也是结合学习的Python视频知识及我研究生数据挖掘方向的知识.从而简介下Python是怎样爬去网络数据的,文章知识很easy ...

随机推荐

  1. 译注(2): How to Write a 21st Century Proof

    原文:Computer Scientist Tells Mathematicians How To Write Proofs 对比一下下面两个证明哪个更好? 版本一: "A square a ...

  2. HashMap源码分析(基于jdk8)

    我们知道在jdk7中HashMap的实现方式是数组+链表.而在jdk8中,实现有所变化,使用的是数组+链表+红黑树实现的. 当链表长度达到8时转化为红黑树. static final int TREE ...

  3. 【MongoDB异常】Exception authenticating MongoCredential解决方法

    我们通过ideal编辑器编辑 springboot时候,出现这个错误: com.mongodb.MongoSecurityException: Exception authenticating Mon ...

  4. Pyhon进阶9---类的继承

    类的继承 基本概念 定义 格式如下 继承中的访问控制 class Animal: __CNOUT = 0 HEIGHT = 0 def __init__(self,age,weight,height) ...

  5. swiftmailer时没有设置https的选项,才可以发送成功。在linux下面

    <?php $su = 'register'; $ge = '1362836763@qq.com'; $co = 'Please register!'; send_mail($su,$ge,$c ...

  6. C# 中使用面向切面编程(AOP)中实践代码整洁

    1. 前言 最近在看<架构整洁之道>一书,书中反复提到了面向对象编程的 SOLID 原则(在作者的前一本书<代码整洁之道>也是被大力阐释),而面向切面编程(Aop)作为面向对象 ...

  7. 【CERC2016】【BZOJ4792】村庄 搜索

    题目大意 有一个 \(2^n\times 2^n\) 的网格,左下角坐标为 \((0,0)\),右上角坐标为 \((2^n,2^n)\). 定义格点 \((x,y)\) 为坐标系中坐标为 \((x,y ...

  8. [powershell]获取FCID&Port

    Get-InitiatorID Get-InitiatorPort

  9. kubernetes 1.14安装部署metrics-server插件

    简单介绍: 如果使用kubernetes的自动扩容功能的话,那首先得有一个插件,然后该插件将收集到的信息(cpu.memory..)与自动扩容的设置的值进行比对,自动调整pod数量.关于该插件,在ku ...

  10. 20175209 《Java程序设计》第八周学习总结

    20175209 <Java程序设计>第八周学习总结 一.教材知识点总结 1.泛型 1.泛型类声明: 格式 class People<E> People是泛型类名称 E是泛型列 ...