簡體   English   中英

HTTPWebResponse + StreamReader 非常慢

[英]HTTPWebResponse + StreamReader Very Slow

我正在嘗試使用 HttpWebResponse.GetResponse() 和 Streamreader.ReadToEnd() 在 C# 中實現有限的網絡爬蟲(僅限幾百個站點),還嘗試使用 StreamReader.Read() 和循環來構建我的 HTML 字符串。

我只下載大約 5-10K 的頁面。

這一切都非常緩慢! 例如,平均 GetResponse() 時間約為半秒,而平均 StreamREader.ReadToEnd() 時間約為 5 秒!

所有站點都應該非常快,因為它們離我的位置非常近,並且擁有快速的服務器。 (在 Explorer 中,D/L 幾乎沒有任何作用)而且我沒有使用任何代理。

我的爬蟲有大約 20 個線程同時從同一站點讀取。 這會導致問題嗎?

如何大幅減少 StreamReader.ReadToEnd 時間?

HttpWebRequest 可能需要一段時間來檢測您的代理設置 嘗試將其添加到您的應用程序配置中:

<system.net>
  <defaultProxy enabled="false">
    <proxy/>
    <bypasslist/>
    <module/>
  </defaultProxy>
</system.net>

您可能還會通過緩沖讀取來減少對底層操作系統套接字的調用次數,從而獲得輕微的性能提升:

using (BufferedStream buffer = new BufferedStream(stream))
{
  using (StreamReader reader = new StreamReader(buffer))
  {
    pageContent = reader.ReadToEnd();
  }
}

WebClient 的 DownloadString 是 HttpWebRequest 的一個簡單包裝器,您可以嘗試暫時使用它,看看速度是否有所提高? 如果事情變得更快,您能否分享您的代碼,以便我們看看它可能有什么問題?

編輯:

似乎 HttpWebRequest 觀察了 IE 的“最大並發連接數”設置,這些 URL 是否在同一個域中? 您可以嘗試增加連接限制,看看是否有幫助? 我找到了這篇關於這個問題的文章

默認情況下,您不能執行超過 2-3 個異步 HttpWebRequest(取決於操作系統)。 為了覆蓋它(最簡單的方法,恕我直言)不要忘記在應用程序的配置文件的部分下添加它:

<system.net>
  <connectionManagement>
     <add address="*" maxconnection="65000" />
  </connectionManagement>
</system.net>

我遇到了同樣的問題,但是當我將 HttpWebRequest 的 Proxy 參數設置為 null 時,它解決了問題。

UriBuilder ub = new UriBuilder(url);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create( ub.Uri );
request.Proxy = null;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

您是否嘗試過 ServicePointManager.maxConnections? 對於類似的事情,我通常將其設置為 200。

我遇到了同樣的問題,但最糟糕的是。 response = (HttpWebResponse)webRequest.GetResponse(); 在我的代碼中,在運行更多代碼之前延遲了大約 10 秒,此后下載使我的連接飽和。

kurt 的回答 defaultProxy enabled="false"

解決了這個問題。 現在響應幾乎是即時的,我可以以我的最大連接速度下載任何 http 文件:) 抱歉英語不好

我發現應用程序配置方法不起作用,但問題仍然是由於代理設置。 我的簡單請求過去最多需要 30 秒,現在只需要 1 秒。

public string GetWebData()
{
            string DestAddr = "http://mydestination.com";
            System.Net.WebClient myWebClient = new System.Net.WebClient();
            WebProxy myProxy = new WebProxy();
            myProxy.IsBypassed(new Uri(DestAddr));
            myWebClient.Proxy = myProxy;
            return myWebClient.DownloadString(DestAddr);
}

為什么多線程不能解決這個問題? 多線程將最大限度地減少網絡等待時間,並且由於您將緩沖區的內容存儲在系統內存 (RAM) 中,因此處理文件系統不會產生 IO 瓶頸。 因此,下載和解析需要 82 秒的 82 個頁面應該需要 15 秒(假設使用 4x 處理器)。 如果我遺漏了什么,請糾正我。

____ 下載線程_____*

下載內容

表單流

閱讀內容

_________________________*

嘗試像這樣將 cookie( AspxAutoDetectCookieSupport=1 ) 添加到您的請求中

request.CookieContainer = new CookieContainer();         
request.CookieContainer.Add(new Cookie("AspxAutoDetectCookieSupport", "1") { Domain = target.Host });

謝謝大家的回答,他們幫助我找到了正確的方向。 我遇到了同樣的性能問題,盡管提議的更改應用程序配置文件的解決方案(據我所知,該解決方案適用於 Web 應用程序)不符合我的需求,但我的解決方案如下所示:

HttpWebRequest webRequest;

webRequest = (HttpWebRequest)System.Net.WebRequest.Create(fullUrl);
webRequest.Method = WebRequestMethods.Http.Post;

if (useDefaultProxy)
{
    webRequest.Proxy = System.Net.WebRequest.DefaultWebProxy;
    webRequest.Credentials = CredentialCache.DefaultCredentials;
}
else
{
    System.Net.WebRequest.DefaultWebProxy = null;
    webRequest.Proxy = System.Net.WebRequest.DefaultWebProxy;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM