Получение HTML-страниц со стороннего веб-сайта с помощью ASP.NET - PullRequest
0 голосов
/ 23 декабря 2009

Наша ситуация: Наша команда должна извлечь информацию журнала из стороннего веб-сайта (в частности, этот журнал Информация - это журналы звонков - наш клиент арендует 866 номер. Когда приходят звонки, они помогают люди и должны сделать соответствующие записи в нашем приложении, которые будут соответствовать текущий звонок). У нашего клиента есть веб-аккаунт с третьей стороной, который позволяет им просматривать текущие журналы вызовов (дата / время, номер телефона, количество времени на каждый вызов и т. д.).

Я связался с разработчиком их сайта и спросил об API или любых других средствах синхронизации. наша база данных с их постоянно обновляемой базой данных. В настоящее время они не поддерживают API. я проинформировали их о моей ситуации, и они прекрасно справляются с любым способом, которым мы можем получить информация (бот / сканер). * Третья сторона сказала, что работает над API, но не может дать нам общий график времени, когда это будет ... и как с каждым клиентом, они должны начать производство как можно скорее.

Я полностью понимаю, что если сторонняя организация изменит свой HTML-макет, это может вызвать легкая головная боль для нас (сортировка данных с веб-страницы). Это, как говорится, это временное решение долгосрочной проблемы. Как только они реализуют свой API, мы переключим их на него.

Итак, мой вопрос таков: Как лучше всего войти на сторонний сайт (см. Изображение: http://i903.photobucket.com/albums/ac239/jreedinc/customtf.jpg) и получить определенные HTML-страницы? Мы рассмотрели исходные коды веб-сканеров, но ни один из них иметь возможность хранения файлов cookie и размещения информации на веб-сайте (с информацией для входа). Мы бы предпочли сделать это в ASP.NET.

Есть ли другой способ выполнить вход на веб-сайт, а затем получить указанную информацию?

Ответы [ 3 ]

2 голосов
/ 24 декабря 2009

Классы, которые вам нужно использовать, находятся в пространстве имен System.Net. Ниже приведено краткое и грязное доказательство концепции кода. Чтобы войти на сайт, который использует форму логин + куки для безопасности, а затем очистить вывод HTML страницы.

Для разбора результатов HTML вам понадобится дополнительный инструмент.

Возможные инструменты разбора HTML.

SgmlReader, может конвертировать HTML в XML. Затем вы используете возможности XML .NET для извлечения данных из XML.
http://code.msdn.microsoft.com/SgmlReader

HTML Agility Pack, разрешает запросы XPath к документам HTML.
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");  
0 голосов
/ 23 декабря 2009

Это на самом деле довольно простая операция. Что вам нужно сделать, так это получить страницу, на которую снимок экрана возвращается (что-то вроде login.php и т. Д.), А затем создать веб-запрос на этой странице с вашими данными для входа. Скорее всего, вы получите cookiecontainer, который будет использовать ваш cookie-файл для входа при всех последующих запросах.

Вы можете посмотреть в этой статье MSDN основы того, как это сделать, но их рецензия немного запутана. Посмотрите на комментарии сообщества в конце для примера того, как публиковать переменные на обратной странице (например, имя пользователя и пароль). Вам нужно будет убедиться, что вы передаете cookiecontainer при последующих запросах.

К сожалению, в .NET изначально нет чего-то вроде WWW :: Mechanize, но у Webclient есть «значение загрузки», которое может упростить его. Вам все равно придется вручную проанализировать страницу, чтобы выяснить, какие поля вам нужно пропустить.

0 голосов
/ 23 декабря 2009

Я недавно использовал инструмент под названием WebQL (это инструмент веб-скребка, который позволяет разработчику использовать синтаксис, подобный SQL, для очистки информации с веб-страниц.

WebQL в Википедии

...