现在的位置: 首页 > 综合 > 正文

网络信息采集器

2012年09月21日 ⁄ 综合 ⁄ 共 7100字 ⁄ 字号 评论关闭

网络信息采集器,用于在网络上采集其他网站所发不出来的信息资源,对信息采集者而言是非常地方便快捷的,以下就是网络信息采集器的制作教程:

在制作网络信息采集器时,我们会使用到网络命名空间中的HttpWebRequest和HttpWebResponse这2个类,还会使用到基础命名空间中的IO技术,在下面我将写出。

            //采集网站的地址
            string url = "http://www.baidu.com/";

            //创建访问目标
            HttpWebRequest webRequeset = (HttpWebRequest)WebRequest.Create(url);

            //得到回应
            HttpWebResponse webResponse = (HttpWebResponse)webRequeset.GetResponse();

            //得到数据流
            Stream stream = webResponse.GetResponseStream();

            //对获取到的数据流进行编码解析,让我们可以进行正常读取
            StreamReader streamReader = new StreamReader(stream, Encoding.GetEncoding("gb2312"));

            //读取出数据流中的信息
            string content = streamReader.ReadToEnd();

            //关闭流
            streamReader.Close();

            //关闭网络响应流
            webResponse.Close();

通过上面的方式,我们将得到网络响应回来的数据,这时,我们将进行正则配对选取性截取 

public class GetRemoteObj
    {

        #region 根据URL读取网络内容

        /// <summary>
        /// 根据URL读取网络内容
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public string GetRemoteHtmlCode(string url)
        {
            HttpWebRequest wrequest = (HttpWebRequest)WebRequest.Create(url);
            HttpWebResponse wresponse = (HttpWebResponse)wrequest.GetResponse();
            Stream stream = wresponse.GetResponseStream();
            StreamReader reader = new StreamReader(stream, Encoding.GetEncoding("gb2312"));
            string HtmlCode = reader.ReadToEnd();
            reader.Close();
            wresponse.Close();
            return HtmlCode;
        }

        #endregion

        #region 替换网页中的换行和引号

        /// <summary>
        /// 替换网页中的换行和引号
        /// </summary>
        /// <param name="HtmlCode"></param>
        /// <returns></returns>
        public string ReplaceEnter(string HtmlCode)
        {
            string s = "";
            if (HtmlCode == null || HtmlCode == "")
                s = "";
            else
                s = HtmlCode.Replace("\"", "");
            s = s.Replace("\r", "");
            s = s.Replace("\n", "");
            return s;
        }

        #endregion

        #region 执行正则提取出值

        /// <summary>
        /// 执行正则提取出值
        /// </summary>
        /// <param name="RegexString">正则表达式</param>
        /// <param name="RemoteStr">html源码</param>
        /// <returns></returns>
        public string GetRegValue(string RegexString, string RemoteStr)
        {
            string MatchVale = "";
            Regex r = new Regex(RegexString);
            Match m = r.Match(RemoteStr);
            if (m.Success)
            {
                MatchVale = m.Value;
            }
            return MatchVale;
        }

        #endregion

        #region 删除HTML标签

        /// <summary>
        /// 删除HTML标签       

        /// <param name="HtmlCode">html源码</param>
        /// <returns></returns>
        public string RemoveHTML(string HtmlCode)
        {
            string MatchVale = HtmlCode;
            foreach (Match s in Regex.Matches(HtmlCode, "<.+?>"))
            {
                MatchVale = MatchVale.Replace(s.Value, "");
            }
            return MatchVale;
        }

        #endregion

        #region 获取页面的链接正则

        /// <summary>
        /// 获取页面的链接正则
        /// </summary>
        /// <param name="HtmlCode">html源码</param>
        /// <returns></returns>
        public string GetHref(string HtmlCode)
        {
            string MatchVale = "";
            string Reg = @"(h|H)(r|R)(e|E)(f|F) *= *(’|"")?((\w|\\|\/|\.|:|-|_)+)[\S]*";
            foreach (Match m in Regex.Matches(HtmlCode, Reg))
            {
                MatchVale += (m.Value).ToLower().Replace("href=", "").Trim() + "|";
            }
            return MatchVale;
        }

        #endregion

        #region 匹配<img src="" />中的图片路径实际链接

        /// <summary>
        /// 匹配<img src="" />中的图片路径实际链接
        /// </summary>
        /// <param name="ImgString">字符串</param>
        /// <param name="imgHttp"></param>
        /// <returns></returns>
        public string GetImg(string ImgString, string imgHttp)
        {
            string MatchVale = "";
            string Reg = @"src=.+\.(bmp|jpg|gif|png|)";
            foreach (Match m in Regex.Matches(ImgString.ToLower(), Reg))
            {
                MatchVale += (m.Value).ToLower().Trim().Replace("src=", "");
            }
            if (MatchVale.IndexOf(".net") != -1 || MatchVale.IndexOf(".com") != -1 || MatchVale.IndexOf(".org") != -1 || MatchVale.IndexOf(".cn") != -1 || MatchVale.IndexOf(".cc") != -1 || MatchVale.IndexOf(".info") != -1 || MatchVale.IndexOf(".biz") != -1 || MatchVale.IndexOf(".tv") != -1)

                return (MatchVale);
            else
                return (imgHttp + MatchVale);
        }

        #endregion

        #region  匹配页面的图片地址

        /// <summary>
        /// 匹配页面的图片地址
        /// </summary>
        /// <param name="HtmlCode">html源码</param>
        /// <param name="imgHttp">要补充的http://路径信息</param>
        /// <returns></returns>
        public string GetImgSrc(string HtmlCode, string imgHttp)
        {
            string MatchVale = "";
            string Reg = @"<img.+?>";

            foreach (Match m in Regex.Matches(HtmlCode.ToLower(), Reg))
            {
                MatchVale += GetImg((m.Value).ToLower().Trim(), imgHttp) + "|";
            }

            return MatchVale;
        }

        #endregion

        #region 替换通过正则获取字符串所带的正则首尾匹配字符串

        /// <summary>
        /// 替换通过正则获取字符串所带的正则首尾匹配字符串
        /// </summary>
        /// <param name="RegValue">要替换的值</param>
        /// <param name="regStart">正则匹配的首字符串</param>
        /// <param name="regEnd">正则匹配的尾字符串</param>
        /// <returns></returns>
        public string RegReplace(string RegValue, string regStart, string regEnd)
        {
            string s = RegValue;
            if (RegValue != "" && RegValue != null)
            {
                if (regStart != "" && regStart != null)
                {
                    s = s.Replace(regStart, "");
                }
                if (regEnd != "" && regEnd != null)
                {
                    s = s.Replace(regEnd, "");
                }
            }
            return s;
        }

        #endregion

    }

 

是在对不起大家,该文章被我耽误了很久了,今天终于抽出时间来,我决定把该文章搞定:

上面的方法,我把几个重要的讲解下 (由于家里是拨号上网,我基本上是以百度举例)

GetRemoteHtmlCode 该方法是用来获取该网页中的源代码,我们只需要传入URL地址即可 (注意下,传入的URL必须加上http,例如百度,我们需要写成http://www.baidu.com

GetRegValue 该方法主要是用来提取关键信息 (这个方法非常的重要,可以说是采集系统的关键了,我会在下面举个例子)

RemoveHTML  该方法主要用来删除HTML标签

ReplaceEnter 该方法主要用来替换换行和引号

下面我将写个例子出来给大家看看:

            GetRemoteObj getUrl = new GetRemoteObj();     //实例化操作类
            string url = "http://www.baidu.com/";                 //这个是我们的URL   
            string content = getUrl.GetRemoteHtmlCode(url); //得到html源码
            string Reg="<title>.+?</title>";   //根据title标签正则,得到标题
            string title = getUrl.GetRegValue(Reg, content); //取出title  这里取出来的标题是包含了title标签的
            title = getUrl.RemoveHTML(title); //删除html标签
            Console.WriteLine(title);  //打印输出,在这里的时候,就会显示出标题内容了

上面的例子,大家都可以写一下,我们选择性截取内容时,有事会碰到换行的问题,那么可以先把对方换行标识符先替换下,就可以正常截取内容,

这个其实是很简单的,我把自己的一些经验总结了下:

第一:多线程采集的意思,很多人都搞错了,我在这里先解释下,我们在采集网页信息的时候,有可能一个页面中有很多个我们需要存储到数据里的数据,

比如说百度,但我们搜索出来信息是,百度给我们是分页显示的,这个时候,我们可以在这个页面进行多线程采集,使用委托和事件,我们让该页面显示出来的数据,比如一个页面有10个数据,那么我们开启10个线程,同时进行内容的采集,每当采集完成一个时,我们就干掉一个,当全部完成后,我们就可以调入第二页数据,在开启线程,进行同时采集

第二:我们每采集完一个页面,需要进行标示,我一般都是把该页面的路径放入到数据库中,在采集时,先进行对比,我不知道大家还有没有更好的方法哈,如果有,请指教一下

第三:采集信息的机器最好是服务器,服务器的优势最大在于网络和cpu资源,我们开启多线程时,是非常消耗网络资源和cpu的,如果是一个差的机器,我推荐你还是1个一个的采集更好,不然容易挂掉

以上基本是信息采集系统的基础了,前端时间做的信息网,初步就用到了这些,如果大家有兴趣,可以对某个网站进行采集下,个人感觉还是不错,就是重用性我没有更好的解决方法,这点很郁闷,采集只能针对摸个网站的信息,不能通用,如果有时间,可以在深入的了解下。

 

在这里,我对各位看兄道歉,该文章拖了了一段时间,是在很忙,有兄弟找我要例子,说实话,除了那个网站的采集器,我还真的没有做个例子出来,汗。。。。

下次我在写文章时,一定会先做例子,是在对不起!!!!

 

 

 

 

 

抱歉!评论已关闭.