• 网页信息抓取


    写了一个从网页中抓取信息(如最新的头条新闻,新闻的来源,标题,内容等)的类,本文将介绍如何使用这个类来抓取网页中需要的信息。本文将以抓取博客园首页的博客标题和链接为例:

    image

    上图显示的是博客园首页的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("");
                    }
                }
            }
        }
    }
    

      

    运行结果如下:

    image

    欢迎学习前端的同学一起学习

    前端学习交流QQ群:461593224

  • 相关阅读:
    【CSS】330- 手把手教你玩转 CSS3 3D 技术
    【每周小回顾】4- 一起回顾上周精彩内容
    【CSS】329- 非常强!3行核心css代码的rate评分组件
    Android 高仿微信头像截取 打造不一样的自定义控件
    十三.200多万元得到的创业教训--用户体验就是人性
    十一. 没有这4项素质,别想在创业公司
    十二.200多万元得到的创业教训--app名字是关键
    十. 加班等于团队建设?
    Android 实现形态各异的双向侧滑菜单 自定义控件来袭
    九. 200多万元得到的创业教训--“雕爷”是忽悠吗?
  • 原文地址:https://www.cnblogs.com/fsyz/p/7886355.html
Copyright © 2020-2023  润新知