웹 크롤러를 만들고 있는데, StreamReader를 사용하여 HTML 문자열을 가져 오기 때문에 GetHTML 중 하나가 매우 느린 것으로 나타났습니다. HttpWebResponse 객체StreamReader.ReadToEnd() 매우 느립니다.
static string GetHTML(string URL)
{
HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(URL);
Request.Proxy = null;
HttpWebResponse Response = ((HttpWebResponse)Request.GetResponse());
Stream RespStream = Response.GetResponseStream();
return new StreamReader(RespStream).ReadToEnd(); // Very slow
}
내가 스톱워치로 테스트를 만들어 YouTube에서이 방법을 사용 : 여기
는 방법이다.Time it takes to get an HTTP response: 500 MS
Time it takes to convert the HttpWebResponse object to a string: 550 MS
그래서 HTTP 요청은 괜찮습니다. 단지 너무 느린 ReadToEnd()입니다.
응답 개체에서 HTML 문자열을 가져 오기 위해 ReadToEnd() 메서드를 사용할 수 있습니까? WebClient.DownloadString() 메서드를 사용하여 시도했지만 스트림을 사용하는 HttpWebRequest 주위의 래퍼 일뿐입니다.
편집 :는 소켓으로 시도하고 훨씬 빠르다 :
이static string SocketHTML(string URL)
{
string IP = Dns.GetHostAddresses(URL)[0].ToString();
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Connect(new IPEndPoint(IPAddress.Parse(IP), 80));
s.Send(Encoding.ASCII.GetBytes("GET/HTTP/1.1\r\n\r\n"));
List<byte> HTML = new List<byte>();
int Bytes = 1;
while (Bytes > 0)
{
byte[] Data = new byte[1024];
Bytes = s.Receive(Data);
foreach (byte b in Data) HTML.Add(b);
}
s.Close();
return Encoding.ASCII.GetString(HTML.ToArray());
}
소켓 함께 사용의 문제,하지만 시간이 대부분은 "영구적으로 이동"또는 오류를 반환한다는 것입니다 "브라우저가 서버가 이해할 수 없다는 요청을 보냈습니다".
여기에서 비교해보십시오. 원격 사이트에 대한 실제 호출에 대해 빈 문자열을 반환 하시겠습니까? – Steve
StreamReader.ReadToEnd()가 병목 현상인지 확인하기 위해이 비교를 수행했습니다. 응답을 받았는데 ReadToEnd() 메서드를 사용하지 않으면 반환 할 GetHTML (문자열 URL)이 약 500 MS가 걸리지 만 ReadToEnd() 메서드를 사용하면 1000 MS가 걸립니다. 이 경우 (youtube.com에서 테스트했을 때) ReadToEnd() 메소드는 500 MS 완료해야합니다. 매우 느립니다. 요청 자체는 문제가 없으며 OK로 전송되지만 문자열 변환은 매우 느립니다. – BlueRay101