C# 使用C语言只下载网页的第一部分(长度未知)#
我正在写一个个人应用程序,可以从网站上抓取数据。目前,它会在分析之前提取整个页面,这些页面的大小可以在300-600kib之间。我测试的10个页面总共有4个MiB。该页面包含动态内容,因此我不知道数据从何处开始。我确实有分隔符,以便在扫描页面后立即知道数据的位置。有没有办法只下载到我需要的部分?这将使这10个页面的总下载量减少到2 MiB。只需使用C# 使用C语言只下载网页的第一部分(长度未知)#,c#,.net,screen-scraping,web-scraping,C#,.net,Screen Scraping,Web Scraping,我正在写一个个人应用程序,可以从网站上抓取数据。目前,它会在分析之前提取整个页面,这些页面的大小可以在300-600kib之间。我测试的10个页面总共有4个MiB。该页面包含动态内容,因此我不知道数据从何处开始。我确实有分隔符,以便在扫描页面后立即知道数据的位置。有没有办法只下载到我需要的部分?这将使这10个页面的总下载量减少到2 MiB。只需使用WebRequest而不是WebClient,您就可以从流中检索所需的数据: HttpWebRequest request = (HttpWebReq
WebRequest
而不是WebClient
,您就可以从流中检索所需的数据:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://google.com");
using (var response = request.GetResponse())
using(Stream stream = response.GetResponseStream())
{
//..
}
只需使用
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
是一种扩展方法,它可以简单地比较两个字符数组是否相等-没有什么特别之处。这里是一个简单的示例,您从流中读取数据,直到匹配与您自己的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
是一种扩展方法,它可以简单地比较两个字符数组是否相等-没有什么特别之处