我正在编写一个从网站上删除数据的个人应用程序。它目前在分析它们之前会拉出整个页面,这些页面的范围可以从300到600 KiB。我测试的10页总计高达4 MiB。该页面包含动态内容,因此我不确切知道数据的起始位置。我确实有分隔符,以便在扫描页面时知道数据的位置。有没有办法只下载到我需要的部分?这将使这10页的总下载量降至2 MiB。
答案 0 :(得分:3)
只需使用WebRequest
代替WebClient
,您就可以只检索所需流中的数据:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://google.com");
using (var response = request.GetResponse())
using(Stream stream = response.GetResponseStream())
{
//..
}
答案 1 :(得分:2)
这是一个简单的示例,您可以从流中读取,直到匹配与您自己匹配的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
是一种扩展方法,可以简单地比较两个字符数组是否相等 - 没有什么特别之处。
答案 2 :(得分:0)
这不仅仅要求你改变你的逻辑来抓取所有页面并处理它们以找到数据 - >阅读页面,进程,如果它不包含您想要的数据,那么继续下一页?
通过对上下文的更多了解,您可以自定义代码对页面进行爬网的方式,以便通过抓取最可能的数据页面来获得最佳结果,从而使其最佳。