2011-11-12 37 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(); 
     } 
    }