2011-11-12 50 views
1

有一個內部網站在工作中託管在與大多數內部網站不同的服務器上。該網站輸出一些我想通過屏幕抓取獲得的信息。我已經使用asp.net(C#)頁面和其他內部網站上的HTTPWebRequest完成了屏幕抓取,但與大多數情況不同,此站點需要用戶名和密碼。用戶名和密碼不是祕密,它們沿着登錄頁面,每個人都使用相同的登錄信息。自動登錄到網站以進行屏幕抓取

我在網上看到了一些實現自動登錄的例子,但沒有一個是我所需要的。我想使用一個aspx頁面登錄到該網站並從下一頁中檢索一些數據。

我見過的例子涉及到生成一個cookie並將登錄數據發佈到HTTPWebRequest流。我真的不確定如何在這種情況下做到這一點。

是否可以簡單地填充表單域並執行submitw按鈕(以編程方式和幕後)。

這裏是登錄頁面的代碼部分:

<script> 
//StartTranslate:NetLanguage 

        function window_onload() { 
                  deleteCookie("BodyURL","/Net",0); 
                  
                  document.loginform.UserName.focus(); 
                  document.loginform.UserName.value=sUserName; 
                  document.loginform.UserName.select(); 
        } 

        function doSubmit()     { 
                var sUserName = SMCookieGetUserName(); 
                loginform.submit(); 
        } 
</script> 




<form name="loginform" action="/Net//netportal.dll/SubmitLogin" method="post" > 

                <input class="textbox" type="text" name="UserName" id="UserName" maxlength="128" tabindex="1" >                                 
                <input class="textbox" type="password" name="Password" id="Password" maxlength="128" tabindex="2" > 
                <img onClick="doSubmit();" src='/net/PortalPages/Images/slogin.gif' onselectstart="return false;" tabindex="3">                                                                                                                                 
                
                <input type="hidden" value="" name="Timezone"> 
                <input type="hidden" value="" name="redirect"> 
                <input type="hidden" value="true" name="ExplicitLogin"> 
</form> 
+0

的[屏幕抓取,在C#中asp.net形式登錄一個網站?]可能重複(http://stackoverflow.com/questions/901045/screen-刮-A位點上帶有一個-ASP淨表單登錄-在-c)的 –

回答

0

我想用這樣的應用程序你只需要直接調用後到服務器的方式瀏覽器將代替試圖弄亂HTML。你只需發佈預期的表單值到動作url,它應該只是工作....

所以在你的代碼只是做一個post調用/Net//netportal.dll/SubmitLogin並添加隱藏的字段,用戶名和密碼,並在服務器登錄後開始抓取。這裏是一些你可以用來開始使用的代碼的例子...只是稍微改變它。你也可能考慮使用htmlagilitypack http://htmlagilitypack.codeplex.com/

private static string Post (string Url, string Method, string Content, string ContentType = "application/json", WebHeaderCollection headers = null) 
    { 
     var address = new Uri(Url); 
     var request = WebRequest.Create(address) as HttpWebRequest; 

     request.Method = Method; 

     if (headers != null) 
      request.Headers.Add(headers); 

     if (!String.IsNullOrEmpty(Content)) 
     { 
      var bytes = Encoding.UTF8.GetBytes(Content); 

      request.ContentLength = bytes.Length; 
      request.ContentType = ContentType; 

      using (var pStream = request.GetRequestStream()) 
      { 
       pStream.Write(bytes, 0, bytes.Length); 
      } 
     } 

     using (var response = request.GetResponse() as HttpWebResponse) 
     { 
      var reader = new StreamReader(response.GetResponseStream()); 

      return reader.ReadToEnd(); 
     } 
    }