2014-07-19 4 views
1

http://www.morningstar.com에 로그인하고 http://financials.morningstar.com/income-statement/is.html?t=BTDPF&region=usa&culture=en-US에 대한 정보를 검색하려면 C# 및 Chrome 웹 검사기를 사용하려고합니다.C# HttpClient를 사용하여 웹 사이트에 로그인하고 다른 페이지의 정보를 긁음

Web Inspector의 정보를 해석하여 로그인을 시뮬레이트하고 세션을 유지하고 정보를 수집하기 위해 다음 페이지로 이동하는 데 사용해야하는 정신적 프로세스가 무엇인지 이해하지 못합니다.

자원에 대한 설명이나 지적이 가능한 사람이 있습니까? 지금은

, 나는 홈 페이지의 내용과 로그인 페이지를 얻기 위해 일부 코드가 있습니다 :

public class Morningstar 
{ 
    public async static void Ru4n() 
    { 
     var url = "http://www.morningstar.com/"; 
     var httpClient = new HttpClient(); 

     httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml"); 
     httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate"); 
     httpClient.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0"); 
     httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Charset", "ISO-8859-1"); 

     var response = await httpClient.GetAsync(new Uri(url)); 
     response.EnsureSuccessStatusCode(); 
     using (var responseStream = await response.Content.ReadAsStreamAsync()) 
     using (var decompressedStream = new GZipStream(responseStream, CompressionMode.Decompress)) 
     using (var streamReader = new StreamReader(decompressedStream)) 
     { 
      //Console.WriteLine(streamReader.ReadToEnd()); 
     } 

     var loginURL = "https://members.morningstar.com/memberservice/login.aspx"; 
     response = await httpClient.GetAsync(new Uri(loginURL)); 
     response.EnsureSuccessStatusCode(); 
     using (var responseStream = await response.Content.ReadAsStreamAsync()) 
     using (var streamReader = new StreamReader(responseStream)) 
     { 
      Console.WriteLine(streamReader.ReadToEnd()); 
     } 

    } 

편집 : 결국, 모하메드의 조언에, 나는 다음과 같은 부분을 사용 코드 :

 ScrapingBrowser browser = new ScrapingBrowser(); 

     //set UseDefaultCookiesParser as false if a website returns invalid cookies format 
     //browser.UseDefaultCookiesParser = false; 

     WebPage homePage = browser.NavigateToPage(new Uri("https://members.morningstar.com/memberservice/login.aspx")); 

     PageWebForm form = homePage.FindFormById("memberLoginForm"); 
     form["email_textbox"] = "[email protected]"; 
     form["pwd_textbox"] = "password"; 
     form["go_button.x"] = "57"; 
     form["go_button.y"] = "22"; 
     form.Method = HttpVerb.Post; 
     WebPage resultsPage = form.Submit(); 

답변

1

정신이 과정은 브라우저와 같은 해당 요청이 수행되어, 일부 로그인이 AJAX 또는 기존의 POST 요청, 그래서, 당신이 가장 먼저해야 할 일을 사용하여 만든 웹 사이트에있는 사람 로그인을 시뮬레이션입니다 , 서버 응답에서 쿠키, 헤더 및 기타 정보를 얻을 수 있습니다. 새 요청을 작성하려면 해당 정보를 사용해야합니다. 이것은 부끄러운 요청입니다.

단계는 다음과 같습니다 브라우저가하는 것처럼

1) 응용 프로그램에 자신을 인증하기 위해, 요청을 구축 할 수 있습니다. 2) 응답을 검사하고 헤더, 쿠키 또는 서버와의 세션을 지속시키기위한 기타 유용한 정보를 저장합니다. 3) 두 번째 단계에서 수집 한 정보를 사용하여 서버에 다시 요청하십시오. 4) 응답을 검사하고 데이터 분석 알고리즘 또는 다른 것을 사용하여 데이터를 추출하십시오.

팁 :

현재 사용하지 않는 자바 스크립트 엔진, 일부 웹 사이트는 그래프를 표시하거나 DOM 문서의 일부 interation을 실행하기 위해 자바 스크립트를 사용합니다. 이 경우 WebKit lib wrapper를 사용해야 할 수도 있습니다.

2

웹 사이트의 로그인 프로세스를 시뮬레이션해야합니다. 가장 쉬운 방법은 일부 디버거 (예 : Fiddler)를 통해 웹 사이트를 검사하는 것입니다. 이 검사 할 때

POST https://members.morningstar.com/memberservice/login.aspx?CustId=&CType=&CName=&RememberMe=true&CookieTime= HTTP/1.1 
Accept: text/html, application/xhtml+xml, */* 
Referer: https://members.morningstar.com/memberservice/login.aspx 
** omitted ** 
Cookie: cookies=true; TestCookieExist=Exist; fp=001140581745182496; __utma=172984700.91600904.1405817457.1405817457.1405817457.1; __utmb=172984700.8.10.1405817457; __utmz=172984700.1405817457.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmc=172984700; ASP.NET_SessionId=b5bpepm3pftgoz55to3ql4me 

[email protected]&pwd_textbox=password&remember=on&email_textbox2=&go_button.x=36&go_button.y=16&__LASTFOCUS=&__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=omitted&__EVENTVALIDATION=omited 

, 당신은 "__VIEWSTATE"와 같은 일부 쿠키 및 양식 필드를 볼 수 있습니다 :

여기에 로그인 웹 사이트의 요청입니다. 당신은 로그인을 제기 이것의 실제 값을해야합니다 당신은 다음과 같이 사용할 수 있습니다.

  1. 는 "__LASTFOCUS", "__EVENTTARGET", "__EVENTARGUMENT", "__VIEWSTATE"와 같은 요청 및 스크랩 필드를 확인을 " __EVENTVALIDATION "; 및 쿠키.
  2. 동일한 페이지에 새 POST 요청을 만들고 이전 페이지의 CookieContainer를 사용하십시오. 스크랩 된 필드, 사용자 이름 및 비밀번호를 사용하여 게시물 문자열을 작성하십시오. MIME 유형 application/x-www-form-urlencoded으로 게시하십시오.
  3. 추가 요청에 대한 성공적인 사용 쿠키는 로그인 상태를 유지하는 경우

참고 :. 당신은 HTML을 스크랩 htmlagilitypack, 또는 scrapysharp를 사용할 수 있습니다.ScrapySharp는 양식 게시 양식 및 웹 사이트 탐색을 위해 사용하기 쉬운 도구를 제공합니다.

관련 문제