具有大型数据集的不完整HttpWebResponse

时间:2011-07-18 20:58:02

标签: c# .net httpwebrequest screen-scraping httpwebresponse

我有一些代码可以下载我已经使用了一段时间的网页内容。这段代码工作正常,从未提供过问题但仍然没有...但是,有一个相当大的页面(2MB,没有图像),4个表分别有4,20,100,600行,大约20个列宽。

当尝试获取所有数据时,它没有任何明显的错误或异常,但只返回到第4行中的第60行 - 有时更多,有时更少。 broswer在大约20-30秒内完成加载,持续,看起来像是冲洗,直到页面完成。

我尝试了很多来自搜索引擎优化和搜索的解决方案而没有任何不同的结果。下面是当前代码,但我有:代理,异步,没有超时,虚假保持活动...

我不能使用WebClient(作为另一个远程获取尝试)因为我需要使用cookiecontainer登录。

        HttpWebRequest pageImport = (HttpWebRequest)WebRequest.Create(importUri);
        pageImport.ReadWriteTimeout = Int32.MaxValue;
        pageImport.Timeout = Int32.MaxValue;
        pageImport.UserAgent = "User-Agent  Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3";
        pageImport.Accept = "Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
        pageImport.KeepAlive = true;
        pageImport.Timeout = Int32.MaxValue;
        pageImport.ReadWriteTimeout = Int32.MaxValue;
        pageImport.MaximumResponseHeadersLength = Int32.MaxValue;

        if (null != LoginCookieContainer)
        {
            pageImport.CookieContainer = LoginCookieContainer;
        }

        Encoding encode = System.Text.Encoding.GetEncoding("utf-8");


        using (WebResponse response = pageImport.GetResponse())
        using (Stream stream = response.GetResponseStream())
        using (StreamReader reader = new StreamReader(stream, encode))
        {
            stream.Flush();
            HtmlRetrieved = reader.ReadToEnd();
        }

3 个答案:

答案 0 :(得分:1)

尝试以块为单位而不是reader.ReadToEnd(); 只是为了给你一个想法:

//使用所需的编码格式将流传输到更高级别的流读取器。      StreamReader readStream = new StreamReader(ReceiveStream,encode);      Console.WriteLine(“\ n \ nResponse stream received”);      Char [] read = new Char [256];

    // Read 256 charcters at a time.    
 int count = readStream.Read( read, 0, 256 );
    Console.WriteLine("HTML...\r\n");

while (count > 0) 
{
        // Dump the 256 characters on a string and display the string onto the console.
    String str = new String(read, 0, count);
    Console.Write(str);
    count = readStream.Read(read, 0, 256);
}

答案 1 :(得分:0)

我怀疑这是作为服务器端的配置设置处理的。顺便说一句,我认为您可能错误地设置了您的属性。从文字中删除“user-agent”和“accept”,如下:

pageImport.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3";         
pageImport.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";      

答案 2 :(得分:0)

虽然我仍然会尝试提供的建议,如果有效,我会改变我的答案,似乎在这种情况下,问题是代理。我在代理前面,代码按预期工作,速度更快。

我必须查看一些代理优化,因为此代码必须在代理后面运行。