使用c#只下载网页的第一部分(长度未知)

本文关键字:一部分 未知 第一部 下载 下载网 网页 使用 | 更新日期: 2023-09-27 18:05:07

我正在写一个个人应用程序,从一个网站刮数据。它目前在分析整个页面之前提取整个页面,这些页面可以从300 - 600kib不等。我测试的10个页面总共有4个MiB。该页面包含动态内容,所以我不知道确切的数据开始在哪里。我确实使用了分隔符,以便在扫描页面后立即知道数据的位置。有没有办法只下载到我需要的那部分?这将使这10个页面的总下载减少到2 MiB。

使用c#只下载网页的第一部分(长度未知)

只需使用WebRequest而不是WebClient,那么您可以仅从需要的流中检索数据:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://google.com");
using (var response = request.GetResponse())
using(Stream stream = response.GetResponseStream())
{
    //..
}

下面是一个简单的示例,从流中读取,直到匹配到与您自己的分隔符匹配的10字节分隔符。虽然具体由你来决定,但我认为这是一种实现你想要的目标的简单方法。

StringBuilder sb = new StringBuilder();
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://example.com");
using (var resp = request.GetResponse())
{
    using(StreamReader sr = new StreamReader(resp.GetResponseStream()))
    {
        char[10] block;
        sr.ReadBlock(block, 0, 10);
        if (block.CharEquals(myDelim))
            break;
        sb.Append();
    }
}
// Process the StringBuilder here.

请注意,CharEquals是一个扩展方法,它只是比较两个字符数组是否相等-它没有什么特别的。

这难道不需要您将逻辑从抓取所有页面并处理它们以查找数据->更改为读取页面,处理,如果它不包含您想要的数据,则继续进行下一页吗?

有了更多关于上下文的知识,您可以定制代码抓取页面的方式,以便通过抓取最有可能的数据页面来获得最佳结果。