用什么方法可以采集这个地址?
用什么方法可以采集这个地址? http://my.xingkong.com/zhangyiping/blog/rss.htmlWebRequest和WebClient我都试过了..
其它的网址可以读出来,但是这个网址就是读不出来...
高手请教一下...
--------------------编程问答-------------------- 这个是RSS的,没做过这方面的,楼主可以搜索一下RSS抓取的文章
或者看下这篇blog的回复,提供了很多有用信息
http://www.cnblogs.com/lbk/archive/2007/01/23/628203.html --------------------编程问答-------------------- 我抓取其它的RSS都能读出来..唯独是抓取这个"http://my.xingkong.com/zhangyiping/blog/rss.html"地址不行... --------------------编程问答-------------------- string PageUrl = "http://my.xingkong.com/zhangyiping/blog/rss.html";
System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(PageUrl);
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1) Web-Sniffer/1.0.24";
System.Net.WebResponse response = request.GetResponse();
System.IO.Stream resStream = response.GetResponseStream();
System.IO.StreamReader sr = new System.IO.StreamReader(resStream, System.Text.Encoding.Default);
ContentHtml.Text = sr.ReadToEnd();
resStream.Close();
sr.Close(); --------------------编程问答-------------------- 不过如果楼主只是想采集到其中的有关内容
http://my.xingkong.com/zhangyiping/blog
上面的就是它的html页面,可以用WebRequest采集到的 --------------------编程问答-------------------- 可以得到
string PageUrl = "http://my.xingkong.com/zhangyiping/blog/rss.html";
System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(PageUrl);
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1) Web-Sniffer/1.0.24";
System.Net.WebResponse response = request.GetResponse();
System.IO.Stream resStream = response.GetResponseStream();
System.IO.StreamReader sr = new System.IO.StreamReader(resStream, System.Text.Encoding.Default);
MessageBox.Show(sr.ReadToEnd());
resStream.Close();
sr.Close();
--------------------编程问答-------------------- 哦,孟子大哥已经回了,收下备用 --------------------编程问答-------------------- MessageBox.Show(sr.ReadToEnd()); //出错
无法从传输连接中读取数据: 连接已关闭。 --------------------编程问答-------------------- 我也试了,确实有点问题... --------------------编程问答-------------------- 孟子大哥的方法抓什么网址都没问题....
就是抓这个网址就不能...
有没有人成功抓取过这个网址啊???? --------------------编程问答-------------------- 是不是你给的这个地址就有问题?错误的? --------------------编程问答-------------------- 我用IE能打开浏览啊...
你可以试一下啊.. --------------------编程问答-------------------- 晕,我用IE都打不开... --------------------编程问答-------------------- 是不是这个网站输出的时候做了一些限制啊?
用浏览器可以正常浏览..就是抓取不了它.. --------------------编程问答-------------------- http://my.xingkong.com/zhangyiping/blog/rss.html
这个网址啊..我能打开啊..只是抓取不了.. --------------------编程问答-------------------- 估计是这个网页或网站的问题,我用浏览器能打开,但是抓不到
后来我试着抓
http://my.xingkong.com/zhangyiping/blog
就可以抓到,但是速度很慢
然后我把sr.ReadToEnd()改为sr.ReadLine()来抓取
http://my.xingkong.com/zhangyiping/blog/rss.html
也可以得到数据,但是速度更慢,还不如上面抓取html整页的速度快 --------------------编程问答-------------------- 我发现了..可能是Transfer-Encoding: chunked的问题..
很多网站为了节省带宽,都会用这种方法,把内容压缩了后,传给客户端..而IE是支持这种压缩加密的....
它是放在Headers里的...可以去掉它吗? --------------------编程问答-------------------- 谁说不可以阿?
http://dotnet.aspx.cc/Exam/GetPageHtml.aspx
输入
http://my.xingkong.com/zhangyiping/blog/rss.html
看看 --------------------编程问答-------------------- WebRequest和WebClient我都试过了..
就是抓取不了....
能给代码吗? --------------------编程问答-------------------- 代码和活生生的例子都在你面前,不知道你还要什么代码?
aspx 1.1的代码如下。asp.net 2.0的关键代码一样。
没有任何区别,上面也贴出来了
<%@ Page language="c#" Codebehind="WebForm2.aspx.cs" AutoEventWireup="false" Inherits="WebForm2" ValidateRequest="false"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>WebForm2</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body>
<form id="Form1" method="post" runat="server">
<asp:TextBox id="TextBox1" runat="server" Width="656px"></asp:TextBox>
<asp:Button id="Button1" runat="server" Text="Button"></asp:Button>
<asp:TextBox id="TextBox2" runat="server" Width="728px" Height="464px" TextMode="MultiLine"></asp:TextBox>
</form>
</body>
</HTML>
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
public class WebForm2 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.TextBox TextBox1;
protected System.Web.UI.WebControls.TextBox TextBox2;
protected System.Web.UI.WebControls.Button Button1;
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
}
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
private void Button1_Click(object sender, System.EventArgs e)
{
string PageUrl = "http://my.xingkong.com/zhangyiping/blog/rss.html";
System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(PageUrl);
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1) Web-Sniffer/1.0.24";
System.Net.WebResponse response = request.GetResponse();
System.IO.Stream resStream = response.GetResponseStream();
System.IO.StreamReader sr = new System.IO.StreamReader(resStream, System.Text.Encoding.Default);
TextBox2.Text=(sr.ReadToEnd());
resStream.Close();
sr.Close();
}
}
--------------------编程问答-------------------- 孟子的红宝石怎么来的? --------------------编程问答-------------------- 孟子大哥
请你试一下,新建一个windows 应用程序,插入以下你给出来的代码..试运行一下...
private void main_Load(object sender, EventArgs e)
{
string PageUrl = "http://my.xingkong.com/zhangyiping/blog/rss.html";
System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(PageUrl);
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1) Web-Sniffer/1.0.24";
System.Net.WebResponse response = request.GetResponse();
System.IO.Stream resStream = response.GetResponseStream();
System.IO.StreamReader sr = new System.IO.StreamReader(resStream, System.Text.Encoding.Default);
MessageBox.Show(sr.ReadToEnd());
resStream.Close();
sr.Close();
} --------------------编程问答-------------------- 没有任何等问题。我的第一次代码就是windows form的。
另外,.net的大多数类是通用的。与用在什么地方无关
--------------------编程问答-------------------- request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1) Web-Sniffer/1.0.24";
无耻啊,伪造IE的http头
--------------------编程问答-------------------- 我用.net 2.0 的
运行到 -> MessageBox.Show(sr.ReadToEnd()); 出错了...无法从传输连接中读取数据: 连接已关闭。 --------------------编程问答-------------------- up --------------------编程问答-------------------- 用server端 xmlhttp封装
添加microsoft xml组件 --------------------编程问答-------------------- 用WebRequest或者WebClient不行吗? --------------------编程问答-------------------- private void main_Load(object sender, EventArgs e)
{
string PageUrl = "http://my.xingkong.com/zhangyiping/blog/rss.html";
System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(PageUrl);
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1) Web-Sniffer/1.0.24";
System.Net.WebResponse response = request.GetResponse();
System.IO.Stream resStream = response.GetResponseStream();
System.IO.StreamReader sr = new System.IO.StreamReader(resStream, System.Text.Encoding.Default);
MessageBox.Show(sr.ReadToEnd()); //动行到这一行报错"无法从传输连接中读取数据: 连接已关闭。"
resStream.Close();
sr.Close();
}
我的代码有问题吗? --------------------编程问答-------------------- 楼下不要回帖了,因为孟子的方法完全没有问题!rss 理论上也不会对聚合器做任何限制!尤其是商业 blog rss 更不可能!
lz 是张一平?怀疑为炒作帖或广告帖! --------------------编程问答-------------------- 晕...
我真的是运行不了......
图片可以看: --------------------编程问答-------------------- 孟子大哥的方法抓取其它地址是没问题的..
就是抓取这个地址就不行..
我是用.net 2.0的...有影响吗? --------------------编程问答-------------------- 我也试过了,抓不到东西,其他网址就可以。 --------------------编程问答-------------------- 楼上的..你也用.net 2.0吧??? --------------------编程问答-------------------- 有这种事。 --------------------编程问答-------------------- 用.net 2.0的请测试一下.... --------------------编程问答-------------------- 我用2.0的,测试完全没有问题 --------------------编程问答-------------------- 刚测试了一下。孟大哥的代码可以抓取。
没有任何问题~
2。0的改一下也可以抓取,没问题的呀 --------------------编程问答-------------------- 是的,NET2。0 --------------------编程问答-------------------- 那为什么有些人会报错呢??
报这样的错..图片:: --------------------编程问答-------------------- 我也觉得很奇怪...
我测试也无法抓取...
--------------------编程问答-------------------- 晕.....
真的是.net 1.1 与.net 2.0的问题吗? --------------------编程问答-------------------- 奇怪了,我用2.0没报你那个错误啊 --------------------编程问答-------------------- 楼上的..可以贴上你的源码吗? --------------------编程问答-------------------- 我用的2.0也没问题,但我没有试过楼主那个的URl --------------------编程问答-------------------- 就是http://my.xingkong.com/zhangyiping/blog/rss.html这个URL有问题
其它的URL都能抓取 --------------------编程问答-------------------- 在这里sr.ReadToEnd()出错...
我可以肯定它是超出了sr的长度....造成出错... --------------------编程问答-------------------- 同意。调试的时候发现,事实上代码可以抓到东西,但在读取返回的流到数组的时候,读着读着就出错了,说是流已经关闭。后来用try{}封了这个读流的函数,保证出错时之前读的还在,就可以了。 --------------------编程问答-------------------- 嗯 --------------------编程问答-------------------- 这样的话就抓取不了完整的内容了...
经测试....内容因为有了编辑所以多了"1cfea"这几个字符出来,
用try{}封了这个读流的函数,保证出错时之前读的还在,
这样抓取来的内容就缺少了"</rss>"
郁闷......... --------------------编程问答-------------------- 上面更正"内容因为有了编辑" --> "内容因为chunked编码过了," --------------------编程问答-------------------- 楼主,虽然是中间有异常抛出,但我拿到的确实是完整的内容啊:"……</item>\r\n </channel>\r\n</rss>"。
我的代码是将流读进数组里:
ArrayList arBuffer = new ArrayList();
const int BUFFSIZE = 4096;
try
{
byte[] buffer = new byte[BUFFSIZE];
int offset = BUFFSIZE;
int count = stream.Read(buffer, 0, offset);
while (count > 0)
{
for (int i = 0; i < count; i++)
{
arBuffer.Add(buffer[i]);
}
count = stream.Read(buffer, 0, offset);
}
}
catch {}
return (byte[])arBuffer.ToArray(System.Type.GetType("System.Byte"));
至于为何会有“无法从传输连接中读取数据: 连接已关闭”异常抛出,原因真是不知道,哪位高手愿意说一下?
--------------------编程问答-------------------- 用楼上的方法..的确能抓取完整的内容..
如果用这种方法的话,抓取其它地址会不会有抓取内容不全的情况出现呢??
--------------------编程问答-------------------- 经测试..
ArrayList arBuffer = new ArrayList();
const int BUFFSIZE = 4096;
try
{
byte[] buffer = new byte[BUFFSIZE];
int offset = BUFFSIZE;
int count = stream.Read(buffer, 0, offset);
while (count > 0)
{
for (int i = 0; i < count; i++)
{
arBuffer.Add(buffer[i]);
}
count = stream.Read(buffer, 0, offset);
}
}
catch {}
return (byte[])arBuffer.ToArray(System.Type.GetType("System.Byte"));
用这种方法能抓取....
不过抓取的内容不是一个标准xml字符串...
用XmlDocument解析此字符串的时候报错... --------------------编程问答-------------------- 能抓取就行了,换换编码方式
Encoding.UTF8;
Encoding.ASCII;
Encoding.Unicode;
--------------------编程问答-------------------- using System.Net;
using System.IO;
protected void Page_Load(object sender, EventArgs e)
{
Response.Write(GetContentFromUrll("http://my.xingkong.com/zhangyiping/blog/rss.html"));
}
private string GetContentFromUrll(string _requestUrl)
{
string _StrResponse = "";
HttpWebRequest _WebRequest = (HttpWebRequest)WebRequest.Create(_requestUrl);
_WebRequest.Method = "GET";
WebResponse _WebResponse = _WebRequest.GetResponse();
StreamReader _ResponseStream = new StreamReader(_WebResponse.GetResponseStream(), System.Text.Encoding.GetEncoding("gb2312"));
_StrResponse = _ResponseStream.ReadToEnd();
_WebResponse.Close();
_ResponseStream.Close();
return _StrResponse;
} --------------------编程问答-------------------- 这是Encoding.UTF8啊..
编码后发现内容前边多了一个特殊符号,其它都是正常的.不有乱码
高手请看...
http://community.csdn.net/Expert/topic/5404/5404609.xml?temp=.1052362
--------------------编程问答-------------------- hertcloud(·£孙子兵法£·) 大哥
你的方法就是目前所有人用的方法,是不能抓取"http://my.xingkong.com/zhangyiping/blog/rss.html"这个网址的..
_StrResponse = _ResponseStream.ReadToEnd();
因为这个站点是以chunked编码一段一段输出的,所以根本不能获取它的长度.因此ReadToEnd()就会报错.. --------------------编程问答-------------------- 问一个问题。如何抓取这个网址:
http://portal.gd-n-tax.gov.cn/Portal/appmanager/gz/index/
补充:.NET技术 , C#