写了一个从网页中抓取信息
2018-06-24 02:02:37来源:未知 阅读 ()
写了一个从网页中抓取信息(如最新的头条新闻,新闻的来源,标题,内容等)的类,本文将介绍如何使用这个类来抓取网页中需要的信息。本文将以抓取博客园首页的博客标题和链接为例:
上图显示的是博客园首页的DOM树,显然只需提取出class为post_item的div,再重中提取出class为titlelnk的a标志即可。这样的功能可以通过以下函数来实现:
/// <summary> /// 在文本html的文本查找标志名为tagName,并且属性attrName的值为attrValue的所有标志 /// 例如:FindTagByAttr(html, "div", "class", "demo") /// 返回所有class为demo的div标志 /// 前端学习交流QQ群:461593224
/// </summary> public static List<HtmlTag> FindTagByAttr(String html, String tagName, String attrName, String attrValue) { String format = String.Format(@"<{0}\s[^<>]*{1}\s*=\s*(\x27|\x22){2}(\x27|\x22)[^<>]*>", tagName, attrName, attrValue); return FindTag(html, tagName, format); } public static List<HtmlTag> FindTag(String html, String name, String format) { Regex reg = new Regex(format, RegexOptions.IgnoreCase); Regex tagReg = new Regex(String.Format(@"<(\/|)({0})(\s[^<>]*|)>", name), RegexOptions.IgnoreCase); List<HtmlTag> tags = new List<HtmlTag>(); int start = 0; while (true) { Match match = reg.Match(html, start); if (match.Success) { start = match.Index + match.Length; Match tagMatch = null; int beginTagCount = 1; while (true) { tagMatch = tagReg.Match(html, start); if (!tagMatch.Success) { tagMatch = null; break; } start = tagMatch.Index + tagMatch.Length; if (tagMatch.Groups[1].Value == "/") beginTagCount--; else beginTagCount++; if (beginTagCount == 0) break; } if (tagMatch != null) { HtmlTag tag = new HtmlTag(name, match.Value, html.Substring(match.Index + match.Length, tagMatch.Index - match.Index - match.Length)); tags.Add(tag); } else { break; } } else { break; } } return tags; }
有了以上函数,就可以提取需要的HTML标志了,要实现抓取,还需要一个下载网页的函数:
public static String GetHtml(string url) { try { HttpWebRequest req = HttpWebRequest.Create(url) as HttpWebRequest; req.Timeout = 30 * 1000; HttpWebResponse response = req.GetResponse() as HttpWebResponse; Stream stream = response.GetResponseStream(); MemoryStream buffer = new MemoryStream(); Byte[] temp = new Byte[4096]; int count = 0; while ((count = stream.Read(temp, 0, 4096)) > 0) { buffer.Write(temp, 0, count); } return Encoding.GetEncoding(response.CharacterSet).GetString(buffer.GetBuffer()); } catch { return String.Empty; } }
/// 前端学习交流QQ群:461593224
以下以抓取博客园首页的文章标题和链接为例,介绍如何使用HtmlTag类来抓取网页信息:
class Program { static void Main(string[] args) { String html = HtmlTag.GetHtml("http://www.cnblogs.com"); List<HtmlTag> tags = HtmlTag.FindTagByAttr(html, "div", "id", "post_list"); if (tags.Count > 0) { List<HtmlTag> item_tags = tags[0].FindTagByAttr("div", "class", "post_item"); foreach (HtmlTag item_tag in item_tags) { List<HtmlTag> a_tags = item_tag.FindTagByAttr("a", "class", "titlelnk"); if (a_tags.Count > 0) { Console.WriteLine("标题:{0}", a_tags[0].InnerHTML); Console.WriteLine("链接:{0}", a_tags[0].GetAttribute("href")); Console.WriteLine(""); } } } } }
运行结果如下:
欢迎学习前端的同学一起学习
前端学习交流QQ群:461593224
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:iframe的使用
- HTML基础01 2020-06-07
- 使用 Apache SSI(Server Side Includes) 制作多语言版静态网 2020-06-01
- 网页搜索框里显示字段鼠标点击后就隐藏的方法 2020-05-29
- 想成为一个高薪WEB前端程序员,这些书籍你要看 2020-05-22
- 【2020Python修炼记】前端开发之 网页设计超级酷炫小技巧 2020-05-14
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash