网络信息采集器,用于在网络上采集其他网站所发不出来的信息资源,对信息采集者而言是非常地方便快捷的,以下就是网络信息采集器的制作教程:
在制作网络信息采集器时,我们会使用到网络命名空间中的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个一个的采集更好,不然容易挂掉
以上基本是信息采集系统的基础了,前端时间做的信息网,初步就用到了这些,如果大家有兴趣,可以对某个网站进行采集下,个人感觉还是不错,就是重用性我没有更好的解决方法,这点很郁闷,采集只能针对摸个网站的信息,不能通用,如果有时间,可以在深入的了解下。
在这里,我对各位看兄道歉,该文章拖了了一段时间,是在很忙,有兄弟找我要例子,说实话,除了那个网站的采集器,我还真的没有做个例子出来,汗。。。。
下次我在写文章时,一定会先做例子,是在对不起!!!!