2013-08-16 2 views
0

지정된 Google 검색과 관련된 결과 수를 정렬 할 수있는 프로그램을 만들려고합니다. 매우 큰 테이블이 필요하므로 루프를 사용할 생각입니다. 내가 시도 할 때마다 "System.Windows.Markup.XamlParseException"로 인해 디버거가 충돌합니다.HttpWebRequest를 성공하지 않고 반복하려고 시도했습니다.

이 모든 방법은 단순히 같은 for 루프를 메인에 사용되는
public long resultStat(string a) 
    { 
     var req = (HttpWebRequest)WebRequest.Create("https://www.google.ca/search?hl=fr&output=search&sclient=psy-ab&q=a" + a + "&btnK="); 
     using (req as IDisposable) 
     { 
      WebResponse rep = req.GetResponse(); 
      Stream str = rep.GetResponseStream(); 
      StreamReader rdr = new StreamReader(str); 
      string res = rdr.ReadToEnd(); 
      rdr.Close(); 
      //This is my code to get the number results (it works perfectly) 
      int index = res.IndexOf(">Environ"); 
      int cond = 0; 
      string final = ""; 
      try 
      { 
       while (res[++index] != '<') 
       { 
        if (cond-- == 0 && res[index] != '&') 
        { final += res[index]; cond = 0; } 
        else if (res[index] == '&') cond = 5; 
       } 
      } 
      catch { return 0; } 
      string temp = ""; 
      foreach (char i in final) if (i < 48 && i > 58) temp += i; 
      return Int64.Parse(temp); 
     } 
    } 

: 나는 그것이 문제 알고

public void main() 
{ 
    //Other code 
    for (int i = 0; i < 3; i++) resultStat(i.ToString()); // For example 
    //Other code 
} 

최대한 빨리 루프를 언급, 또는 하나 명의 담당자로 낮추기로 인해 아무것도 잘못되지 않습니다. 나는 시도했다 :

HttpWebRequest(). Abort(); HttpWebRequest(). KeepAlive = false;

+0

return int64.Parse (temp);를'long l = 0; Int64.TryParse (temp, out l); return l;'? – I4V

+0

작동했지만 그 다음 각 결과를 목록에 저장하려고 시도했지만 다시 충돌했습니다 ... 팁을 주셔서 감사 드리며 다른 유사한 오류를 찾아 보겠습니다. – Hadron

답변

0

내가 멀리 당신이하고있는이 작업을 수행 할 수있는 올바른 방법이라고 생각하지 않습니다 작동하지 않았다. 내가 말할 수있는 간단한 것은 Lib curl C#을 사용하는 것입니다. 당신은 배열의 URL로 보내고 배열로 응답을 얻을 수 있습니다. 그것은 당신이 여기서 요구하는 것에 완벽 할 것입니다. 다음은 멀티 태스킹 자체를 수행하는 샘플 클래스 코드입니다. 당신은 단지 URL을 보냅니다.

String[] url= new String[2]; 
url[1]="https://www.google.ca/search?hl=fr&output=search&sclient=psy-ab&q=a1&btnK="; 
url[2]="https://www.google.ca/search?hl=fr&output=search&sclient=psy-ab&q=a2&btnK="; 

string postString=""; // IF YOU DO NOT WANT TO POST ANYTHING YOU CAN DO THE SAME  THING KEEP URL THE SAME SEND POST ARRAY AND CHANGE THE CLASS IT WORKS BOTH WAYS 
String[] result = MultiHttp.MultiPost(url, postString, timeOut); 

그것의 단지 샘플을하지만, 문제를 분류하는 당신에게 작업 아이디어를 얻을 것이다 :

public class MultiHttp 
{ 
    public static string UserAgent = "Mozilla 5.0"; 
    public static string Header = "Content-Type: application/x-www-form-urlencoded; charset=UTF-8"; 
    private static string[] Result; 

    public static string[] MultiPost(string[] Url, string post, int timeOut) 
    { 
     Result = new string[post.Length];   
     try 
     { 
      Curl.GlobalInit((int)CURLinitFlag.CURL_GLOBAL_ALL); 

      Easy.WriteFunction wf = new Easy.WriteFunction(OnWriteData); 
      //Easy.HeaderFunction hf = new Easy.HeaderFunction(OnHeaderData); 

      Easy[] easy = new Easy[Url.Length]; 
      Multi multi = new Multi(); 
      for (int i = 0; i < Url.Length; i++) 
      { 
       if (Url[i] != null) 
       { 
        easy[i] = new Easy(); 
        easy[i].SetOpt(CURLoption.CURLOPT_URL, Url[i]); 
        easy[i].SetOpt(CURLoption.CURLOPT_WRITEFUNCTION, wf); 
        easy[i].SetOpt(CURLoption.CURLOPT_WRITEDATA, i); 
        //easy[i].SetOpt(CURLoption.CURLOPT_HEADERFUNCTION, hf); 
        //easy[i].SetOpt(CURLoption.CURLOPT_HEADERDATA, i); 
        easy[i].SetOpt(CURLoption.CURLOPT_TIMEOUT, timeOut); 
        easy[i].SetOpt(CURLoption.CURLOPT_USERAGENT, UserAgent); 
        Slist sl = new Slist(); 
        sl.Append(Header); 
        easy[i].SetOpt(CURLoption.CURLOPT_HTTPHEADER, sl); 
        easy[i].SetOpt(CURLoption.CURLOPT_POSTFIELDS, post); 
        easy[i].SetOpt(CURLoption.CURLOPT_FOLLOWLOCATION, true); 
        easy[i].SetOpt(CURLoption.CURLOPT_POST, true); 
        //easy[i].SetOpt(CURLoption.CURLOPT_NOBODY, true); 

        if (Url[i].Contains("https")) 
        { 
         easy[i].SetOpt(CURLoption.CURLOPT_SSL_VERIFYHOST, 1); 
         easy[i].SetOpt(CURLoption.CURLOPT_SSL_VERIFYPEER, 0); 
        } 
        multi.AddHandle(easy[i]); 
       } 
      } 

      int stillRunning = 1; 

      while (multi.Perform(ref stillRunning) == CURLMcode.CURLM_CALL_MULTI_PERFORM) ; 

      while (stillRunning != 0) 
      { 
       multi.FDSet(); 
       int rc = multi.Select(1000); // one second 
       switch (rc) 
       { 
        case -1: 
         stillRunning = 0; 
         break; 

        case 0: 
        default: 
         { 
          while (multi.Perform(ref stillRunning) == CURLMcode.CURLM_CALL_MULTI_PERFORM) ; 
          break; 
         } 
       } 
      } 

      // various cleanups 
      multi.Cleanup(); 
      for (int i = 0; i < easy.Length; i++) 
      { 
       easy[i].Cleanup(); 
      } 
      Curl.GlobalCleanup(); 
     } 
     catch (Exception) 
     { 
      //r = ex+""; 
     } 
     return Result; 
    } 

    public static Int32 OnWriteData(Byte[] buf, Int32 size, Int32 nmemb, 
     Object extraData) 
    { 
     int tmp = Convert.ToInt32(extraData.ToString()); ; 
     Result[tmp] += System.Text.Encoding.UTF8.GetString(buf); 
     return size * nmemb; 
    }  
} 

전화는 좋아한다.