当前位置:编程学习 > C#/ASP.NET >>

用什么方法可以采集这个地址?

用什么方法可以采集这个地址?  http://my.xingkong.com/zhangyiping/blog/rss.html 

WebRequest和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#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,