使用ASP.NET从第三方登录网站中检索HTML页面

时间:2009-12-23 20:37:20

标签: asp.net web-crawler bots

我们的情况: 我们的团队需要从第三方网站检索日志信息(具体来说,此日志 信息是通话记录 - 我们的客户租用866号码。来电时,他们协助 人们需要在我们的应用程序中相应地做出相应的记录 当前的电话)。我们的客户有一个第三方的网络帐户,允许他们查看 当前通话记录(日期/时间,电话号码,每次通话的时间等)。

我联系了他们网站的开发者,询问了API或任何其他同步方法 我们的数据库及其不断更新的数据库他们目前不支持API。一世 告诉他们我的情况,他们完全没有任何我们可以检索的方式 信息(机器人/爬虫)。 *第三方表示他们正在研究API,但无法给予 我们是一个关于何时会出现的一般时间表...和每个客户一样,他们需要开始 尽快生产。

我完全理解,如果第三方改变他们的HTML布局,它可能会导致 对我们来说是轻微的头痛(从网页上排序数据)。话虽如此,这是暂时的 解决长期问题。一旦他们实施了API,我们就会将其切换到它。

所以我的问题是: 登录第三方网站的最佳方式是什么(见图片:http://i903.photobucket.com/albums/ac239/jreedinc/customtf.jpg) 并检索某些HTML页面?我们已经审查了webcrawler的源代码,但没有一个 能够存储cookie并将信息发布回网站(具有登录信息)。我们宁愿在ASP.NET中这样做。

是否有另一种方法可以完成登录网站,然后检索所述信息?

3 个答案:

答案 0 :(得分:2)

您需要使用的类位于System.Net命名空间中。下面是一些快速而肮脏的概念证明代码。要登录使用表单登录+ cookie以确保安全性的站点,然后刮取页面的HTML输出。

为了解析HTML结果,您需要使用其他工具。

可能的HTML解析工具。

SgmlReader,可以将HTML转换为XML。然后使用.NET的XML功能从XML中提取数据 http://code.msdn.microsoft.com/SgmlReader

HTML Agility Pack,允许针对HTML文档进行XPath查询 http://htmlagilitypack.codeplex.com/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


class WebWorker {

 /// <summary>  
 /// Cookies for use by web worker  
 /// </summary>  
 private System.Collections.Generic.List `<System.Net.Cookie` > cookies = new List < System.Net.Cookie > ();


 public string GetWebPageContent(string url) {
  System.Net.HttpWebRequest request = (System.Net.HttpWebRequest) System.Net.WebRequest.Create(url);
  System.Net.CookieContainer cookieContainer = new System.Net.CookieContainer();
  request.CookieContainer = cookieContainer;
  request.Method = "GET";

  //add cookies to maintain session state  
  foreach(System.Net.Cookie c in this.cookies) {
   cookieContainer.Add(c);
  }



  System.Net.HttpWebResponse response = request.GetResponse() as System.Net.HttpWebResponse;


  System.IO.Stream responseStream = response.GetResponseStream();

  System.IO.StreamReader sReader = new System.IO.StreamReader(responseStream);

  System.Diagnostics.Debug.WriteLine("Content:\n" + sReader.ReadToEnd());


  return sReader.ReadToEnd();

 }

 public string Login(string url, string userIdFormFieldName, string userIdValue, string passwordFormFieldName, string passwordValue) {

  System.Net.HttpWebRequest request = (System.Net.HttpWebRequest) System.Net.WebRequest.Create(url);
  System.Net.CookieContainer cookieContainer = new System.Net.CookieContainer();
  request.CookieContainer = cookieContainer;
  request.Method = "POST";
  request.ContentType = "application/x-www-form-urlencoded";
  string postData = System.Web.HttpUtility.UrlEncode(userIdFormFieldName) + "=" + System.Web.HttpUtility.UrlEncode(userIdValue) +
   "&" + System.Web.HttpUtility.UrlEncode(passwordFormFieldName) + "=" + System.Web.HttpUtility.UrlEncode(passwordValue);

  request.ContentLength = postData.Length;

  request.AllowAutoRedirect = false; //allowing redirect seems to loose cookies  
  byte[] postDataBytes = System.Text.Encoding.UTF8.GetBytes(postData);
  System.IO.Stream requestStream = request.GetRequestStream();
  requestStream.Write(postDataBytes, 0, postDataBytes.Length);
  System.Net.HttpWebResponse response = request.GetResponse() as System.Net.HttpWebResponse;

  // System.Diagnostics.Debug.Write(WriteLine(new StreamReader(response.GetResponseStream()).ReadToEnd());  

  System.IO.Stream responseStream = response.GetResponseStream();

  System.IO.StreamReader sReader = new System.IO.StreamReader(responseStream);

  System.Diagnostics.Debug.WriteLine("Content:\n" + sReader.ReadToEnd());
  this.cookies.Clear();

  if (response.Cookies.Count > 0) {
   for (int i = 0; i < response.Cookies.Count; i++) {
    this.cookies.Add(response.Cookies[i]);
   }
  }

  return "OK";
 }


} //end class  

//示例使用类

WebWorker worker = new WebWorker();  
worker.Login("http://localhost/test/default.aspx", "uid", "bob", "pwd", "secret");  
worker.GetWebPageContent("http://localhost/test/default.aspx");  

答案 1 :(得分:0)

我使用了一个最近称为WebQL的工具(它是一个Web抓取工具,它允许开发人员使用SQL语法来从网页中抓取信息。

WebQL on Wikipedia

答案 2 :(得分:0)

这实际上是一个相对简单的操作。您需要做的是获取屏幕截图发回的页面(类似于login.php等),然后使用您拥有的登录数据构建一个webrequest到那个页面。您很可能会收到一个cookie容器,它将使您的登录cookie用于所有后续请求。

你可以看看这个MSDN article有关如何做的基础知识,但是他们的写作有点令人困惑。最后查看社区评论,了解如何发布页面变量(例如用户名和密码)。您需要确保在后续请求中传递cookie容器。

不幸的是,.NET本身没有类似WWW :: Mechanize的东西,但Webclient确实有一个“上传值”,这可能会让它更容易。您仍然需要手动解析页面以确定需要传递的字段。