抓取网页数据 请问能不能不通过url抓取网页数据url后面参数屏蔽了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不通过url通过啥???浏览器能打开你下载不下来检查一下UserAgent,伪装成IE应该打得开,另外参数之间的联系,cookie等都需要一致(不过一般的网页没有这么复杂,只需要设置个UserAgent就可以了) 你可以重写URL 屏蔽掉URL地址后面所带的参数 http://topic.csdn.net/u/20100119/22/34eeedce-61b9-4080-82f8-53ffa0840685.html?38807 请问能不能不通过url抓取网页数据 不能url后面参数屏蔽了 再屏蔽也会有包 可通过xmlhttp get、post 获取网页原始HTML、二进制(图像) 内容不推荐用IE 对象。 为什么CSDN上,这么多人用美女头像?难到真的都是美女~! System.Net.WebClient wc = new System.Net.WebClient();Byte[] pageData = wc.DownloadData("网页地址");string s= System.Text.Encoding.Default.GetString(pageData); 大仙们 到时说说方法啊 upup <@Aattention Content="本Blog原创文章,转载或引用请注明转载" From="Robby.cnblogs.com"@> 由于自己的搜索引擎中做到了这一块内容,所以今天说说如何抓取网页数据、分析并且去除Html标签,给大家提供一个参考。我的平台是Visual Studio2005,C#。—————————————————————割————————————————————————— 首先将网页内容整个抓取下来,这个我就不说了,不是本次话题的重点。假设抓取的数据放在RecvBuffer这个byte[]中(数据从网络上传输过来时不是字符串的形式而是byte),那么我们的第一步就是将RecvBuffer转化为String,以便于对其操作,实例如下: // 将接收到的数据增加到响应字符串中 strResponse += Encoding.ASCII.GetString(RecvBuffer, 0, nBytes); strResponse即是保存数据的字符串,此处用系统自带的System.Text.Encoding的方法转化RecvBuffer,GetString的第一个参数RecvBuffer就是我们的原始数据,即包含需要解码的字节序列的字节数组;第二个参数0代表第一个要解码的字节的索引,一般就从0开始;第三个参数nBytes为要解码的字节数,可以自己调整。 得到了数据的字符串形式,然后可以对网页进行解析了(其实就是对字符串的各种操作和正则表达式的应用)。下面我以几个例子来说明对网页数据的解析: // 解析页面,查找链接 // 此处尚需扩展,还有某些形式的链接不被识别 string strRef = @"(href|HREF|src|SRC|action|ACTION|Action)[ ]*=[ ]*[""'][^""'#>]+[""']"; MatchCollection matches = new Regex(strRef).Matches(strResponse); strStatus += "找到: "+matches.Count+" 个链接\r\n"; 上面的例子将网页中的链接解析出来,strRef变量表示了正则表达式的模式,变量matches表示符合匹配的项目的集合,后面的Regex(strRef).Matches(strResponse)就是创建正则规则使得strResponse里符合strRef模式的字符串都返回。然后调用matches的变量就可以取得各种信息了。 当然,这里只能识别一些基本的链接形式,像script中的链接和一些不带“”的链接都没有被支持,这个的扩展还是蛮简单的。 再举几个更简单点的解析的例子,大家学习学习: //获取标题 Match TitleMatch = Regex.Match(strResponse, "<title>([^<]*)</title>", RegexOptions.IgnoreCase | RegexOptions.Multiline); title = TitleMatch.Groups[1].Value; //获取描述信息 Match Desc = Regex.Match(strResponse, "<Meta name=\"DESCRIPTION\" content=\"([^<]*)\">", RegexOptions.IgnoreCase | RegexOptions.Multiline); strdesc = Desc.Groups[1].Value; //获取网页的大小 size = strResponse.Length;—————————————————————割————————————————————————— 好了,下面说一下如何去除Html标签,这个想必有很多初学者很需要。其实还是正则表达式和字符串基本操作的应用,由于这个功能还是比较常用的,所以例子写成了函数,便于调用: /**//// <summary> /// 将Html标签转化为空格 /// </summary> /// <param name="strHtml">待转化的字符串</param> /// <returns>经过转化的字符串</returns> private string stripHtml(string strHtml) { Regex objRegExp = new Regex("<(.|\n)+?>"); string strOutput = objRegExp.Replace(strHtml, ""); strOutput = strOutput.Replace("<", "<"); strOutput = strOutput.Replace(">", ">"); return strOutput; } ok,这样一来Html标签就基本没了,但是有些例外会使得去除不干净,所以建议连续两次转化,这样就搞定了。但是还没结束,如果你留意的话,可以看到上面的函数其实是将Html标签转化为了空格。太多连续的空格会影响之后对字符串的操作。所以再加入这样的语句: //把所有空格变为一个空格 Regex r = new Regex(@"\s+"); wordsOnly = r.Replace(strResponse, " "); wordsOnly.Trim(); 好了,大功告成,这里的wordsOnly便是我们最终的成果----去除了Html标签,并去除了多余空格的字符串。 希望对大家有用! public class PageUtil { #region 得到网络流 public static HttpWebResponse GetResponse(string url) { return GetResponse(url, @"http://www.bfor.cn"); } public static HttpWebRequest CreateRequest(string url) { return CreateRequest(url, @"http://www.bfor.cn"); } public static HttpWebRequest CreateRequest(string url, string referral) { WebRequest req = WebRequest.Create(url); HttpWebRequest wreq = req as HttpWebRequest; if (null != wreq) { wreq.UserAgent = "xiaoxiao"; wreq.Referer = @"http://www.bfor.cn"; wreq.Timeout = 60000; } return wreq; } public static HttpWebResponse GetResponse(string url, string referral) { HttpWebRequest request = CreateRequest(url); return (HttpWebResponse)request.GetResponse(); } public static string GetPageText(string url, out string referral) { string str; HttpWebResponse response = GetResponse(url); using (Stream s = response.GetResponseStream()) { string enc = getEncoding(response); if (enc == "") enc = "gb2312"; referral = enc; Encoding encode = System.Text.Encoding.GetEncoding(enc); using (StreamReader sr = new StreamReader(s, encode)) { str = sr.ReadToEnd(); } } response.Close(); return str; } private static string getEncoding(HttpWebResponse httpResp) { string contentType = httpResp.ContentType;//类似“Content-Type: text/html; charset=utf-8;”或“Content-Type: text/html; charset=utf-8”或者“Content-Type: text/html”//注意utf-8后面有可能没有分号 int i = contentType.IndexOf("charset="); string s = httpResp.CharacterSet; if (i >= 0) { i += 8; int j = contentType.IndexOf(';', i); if (j >= i) { return contentType.Substring(i, j - i).Trim(); } return contentType.Substring(i); } return string.Empty; } #endregion }调用 string en; string response=string.Empty; try { response= PageUtil.GetPageText(url, out en); ServiceManager.EditorContainer.LoadText(url, response); Close(); this.DialogResult = DialogResult.OK; } catch (Exception ex) { Util.ShowErrorMessageBox("打开网址'{0}'时出现错误 :\n\n{1}",url, ex.Message); } out 参数,获取页面编码 不用url是不可能的的 不用url 用ip吗? 楼主不用url是不可能的,url是获取页面数据的唯一方法(我所知的)。所以 你还是换一种思路吧如果仅仅是抓取数据 httpWebRequest足够了 楼主试试下面的程序,看行不行!目前还没收集到取不出来的网址,若取不到数据,请说一声。读取网络资源,返回字节数组http://blog.csdn.net/sxldfang/archive/2010/04/12/5478078.aspx for(i=0;i<ck.length;i++){ck[i].style.background="#9c0"; } HttpWebResponse 可以对web 发起请求HttpWebRequest request = WebRequest.Create(URL) as HttpWebRequest; HttpWebResponse response = request.GetResponse() as HttpWebResponse; Stream responseStream = response.GetResponseStream();取得流之后 你就把字符串读出来,再用上面人教你的正则表达式提取你要的信息!至于人家把URL隐藏很好解决,你找个HTTP嗅探工具,任何和服务器的通信都会被嗅探工具截获,你模仿就行了! 获取网页的源代码System.Net.WebClient wc = new System.Net.WebClient();Byte[] pageData = wc.DownloadData("网页地址");string s= System.Text.Encoding.Default.GetString(pageData);你得到数据要,希望做什么处理? 没有参数,那看看是不是Post方式传的值呀~ 关于时间查询的问题 新手求助:实现密码输错3次,账号冻结。 急~~~~~~~~ 会c#.net学asp.net难吗? 如何捕捉WINDWOS系统错误窗口 急!!vs2005+sp2开发的程序在XP上安装,装上2.0FrameWork+sp2程序双击后没有任何反应。 没有关键字的表,怎么保存? 求教一个问题:dev gridcontrol的下拉列表每行绑定不同数据源 如何用c#实现ie浏览器上的前进、后退功能 难! TreeView拖拉时的问题 方法探讨 100分 类似VS项目属性中的控件 类如何实现[""],像Session["abc"]
url后面参数屏蔽了 再屏蔽也会有包
不推荐用IE 对象。
System.Net.WebClient wc = new System.Net.WebClient();
Byte[] pageData = wc.DownloadData("网页地址");
string s= System.Text.Encoding.Default.GetString(pageData);
<@Aattention Content="本Blog原创文章,转载或引用请注明转载" From="Robby.cnblogs.com"@> 由于自己的搜索引擎中做到了这一块内容,所以今天说说如何抓取网页数据、分析并且去除Html标签,给大家提供一个参考。我的平台是Visual Studio2005,C#。—————————————————————割————————————————————————— 首先将网页内容整个抓取下来,这个我就不说了,不是本次话题的重点。假设抓取的数据放在RecvBuffer这个byte[]中(数据从网络上传输过来时不是字符串的形式而是byte),那么我们的第一步就是将RecvBuffer转化为String,以便于对其操作,实例如下:
// 将接收到的数据增加到响应字符串中
strResponse += Encoding.ASCII.GetString(RecvBuffer, 0, nBytes); strResponse即是保存数据的字符串,此处用系统自带的System.Text.Encoding的方法转化RecvBuffer,GetString的第一个参数RecvBuffer就是我们的原始数据,即包含需要解码的字节序列的字节数组;第二个参数0代表第一个要解码的字节的索引,一般就从0开始;第三个参数nBytes为要解码的字节数,可以自己调整。 得到了数据的字符串形式,然后可以对网页进行解析了(其实就是对字符串的各种操作和正则表达式的应用)。下面我以几个例子来说明对网页数据的解析:
// 解析页面,查找链接
// 此处尚需扩展,还有某些形式的链接不被识别
string strRef = @"(href|HREF|src|SRC|action|ACTION|Action)[ ]*=[ ]*[""'][^""'#>]+[""']";
MatchCollection matches = new Regex(strRef).Matches(strResponse);
strStatus += "找到: "+matches.Count+" 个链接\r\n"; 上面的例子将网页中的链接解析出来,strRef变量表示了正则表达式的模式,变量matches表示符合匹配的项目的集合,后面的Regex(strRef).Matches(strResponse)就是创建正则规则使得strResponse里符合strRef模式的字符串都返回。然后调用matches的变量就可以取得各种信息了。
当然,这里只能识别一些基本的链接形式,像script中的链接和一些不带“”的链接都没有被支持,这个的扩展还是蛮简单的。
再举几个更简单点的解析的例子,大家学习学习:
//获取标题
Match TitleMatch = Regex.Match(strResponse, "<title>([^<]*)</title>", RegexOptions.IgnoreCase | RegexOptions.Multiline);
title = TitleMatch.Groups[1].Value; //获取描述信息
Match Desc = Regex.Match(strResponse, "<Meta name=\"DESCRIPTION\" content=\"([^<]*)\">", RegexOptions.IgnoreCase | RegexOptions.Multiline);
strdesc = Desc.Groups[1].Value; //获取网页的大小
size = strResponse.Length;
—————————————————————割————————————————————————— 好了,下面说一下如何去除Html标签,这个想必有很多初学者很需要。其实还是正则表达式和字符串基本操作的应用,由于这个功能还是比较常用的,所以例子写成了函数,便于调用:
/**//// <summary>
/// 将Html标签转化为空格
/// </summary>
/// <param name="strHtml">待转化的字符串</param>
/// <returns>经过转化的字符串</returns>
private string stripHtml(string strHtml)
{
Regex objRegExp = new Regex("<(.|\n)+?>");
string strOutput = objRegExp.Replace(strHtml, "");
strOutput = strOutput.Replace("<", "<");
strOutput = strOutput.Replace(">", ">");
return strOutput;
} ok,这样一来Html标签就基本没了,但是有些例外会使得去除不干净,所以建议连续两次转化,这样就搞定了。但是还没结束,如果你留意的话,可以看到上面的函数其实是将Html标签转化为了空格。太多连续的空格会影响之后对字符串的操作。所以再加入这样的语句:
//把所有空格变为一个空格
Regex r = new Regex(@"\s+");
wordsOnly = r.Replace(strResponse, " ");
wordsOnly.Trim(); 好了,大功告成,这里的wordsOnly便是我们最终的成果----去除了Html标签,并去除了多余空格的字符串。
希望对大家有用!
public class PageUtil
{
#region 得到网络流
public static HttpWebResponse GetResponse(string url)
{
return GetResponse(url, @"http://www.bfor.cn");
}
public static HttpWebRequest CreateRequest(string url)
{
return CreateRequest(url, @"http://www.bfor.cn");
}
public static HttpWebRequest CreateRequest(string url, string referral)
{
WebRequest req = WebRequest.Create(url); HttpWebRequest wreq = req as HttpWebRequest;
if (null != wreq)
{
wreq.UserAgent = "xiaoxiao";
wreq.Referer = @"http://www.bfor.cn";
wreq.Timeout = 60000;
}
return wreq;
}
public static HttpWebResponse GetResponse(string url, string referral)
{
HttpWebRequest request = CreateRequest(url);
return (HttpWebResponse)request.GetResponse();
}
public static string GetPageText(string url, out string referral)
{
string str;
HttpWebResponse response = GetResponse(url);
using (Stream s = response.GetResponseStream())
{
string enc = getEncoding(response);
if (enc == "")
enc = "gb2312";
referral = enc;
Encoding encode = System.Text.Encoding.GetEncoding(enc);
using (StreamReader sr = new StreamReader(s, encode))
{
str = sr.ReadToEnd();
}
}
response.Close();
return str;
}
private static string getEncoding(HttpWebResponse httpResp)
{
string contentType = httpResp.ContentType;//类似“Content-Type: text/html; charset=utf-8;”或“Content-Type: text/html; charset=utf-8”或者“Content-Type: text/html”//注意utf-8后面有可能没有分号
int i = contentType.IndexOf("charset=");
string s = httpResp.CharacterSet;
if (i >= 0)
{
i += 8;
int j = contentType.IndexOf(';', i);
if (j >= i)
{
return contentType.Substring(i, j - i).Trim();
}
return contentType.Substring(i);
}
return string.Empty;
}
#endregion
}调用 string en;
string response=string.Empty;
try
{
response= PageUtil.GetPageText(url, out en); ServiceManager.EditorContainer.LoadText(url, response); Close();
this.DialogResult = DialogResult.OK;
}
catch (Exception ex)
{
Util.ShowErrorMessageBox("打开网址'{0}'时出现错误 :\n\n{1}",url, ex.Message);
}
out 参数,获取页面编码
不用url 用ip吗?
不用url是不可能的,url是获取页面数据的唯一方法(我所知的)。所以 你还是换一种思路吧
如果仅仅是抓取数据 httpWebRequest足够了
读取网络资源,返回字节数组
http://blog.csdn.net/sxldfang/archive/2010/04/12/5478078.aspx
for(i=0;i<ck.length;i++){
ck[i].style.background="#9c0";
}
HttpWebRequest request = WebRequest.Create(URL) as HttpWebRequest;
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
Stream responseStream = response.GetResponseStream();取得流之后 你就把字符串读出来,再用上面人教你的正则表达式提取你要的信息!至于人家把URL隐藏很好解决,你找个HTTP嗅探工具,任何和服务器的通信都会被嗅探工具截获,你模仿就行了!
System.Net.WebClient wc = new System.Net.WebClient();
Byte[] pageData = wc.DownloadData("网页地址");
string s= System.Text.Encoding.Default.GetString(pageData);你得到数据要,希望做什么处理?