c #: гусеничный проект - PullRequest
2 голосов
/ 07 октября 2010

Могу ли я очень легко следовать примерам кода по следующему:

  1. Используйте управление браузером для запуска запроса на целевой веб-сайт.
  2. Захватите ответ с целевого сайта.
  3. преобразовать ответ в объект DOM.
  4. Итерация по объекту DOM и запись таких вещей, как «FirstName», «LastName» и т. Д., Если они являются частью ответа.

спасибо

Ответы [ 5 ]

2 голосов
/ 07 октября 2010

Вот код, который использует объект WebRequest для извлечения данных и захватывает ответ в виде потока.

    public static Stream GetExternalData( string url, string postData, int timeout )
    {
        ServicePointManager.ServerCertificateValidationCallback += delegate( object sender,
                                                                                X509Certificate certificate,
                                                                                X509Chain chain,
                                                                                SslPolicyErrors sslPolicyErrors )
        {
            // if we trust the callee implicitly, return true...otherwise, perform validation logic
            return [bool];
        };

        WebRequest request = null;
        HttpWebResponse response = null;

        try
        {
            request = WebRequest.Create( url );
            request.Timeout = timeout; // force a quick timeout

            if( postData != null )
            {
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                request.ContentLength = postData.Length;

                using( StreamWriter requestStream = new StreamWriter( request.GetRequestStream(), System.Text.Encoding.ASCII ) )
                {
                    requestStream.Write( postData );
                    requestStream.Close();
                }
            }

            response = (HttpWebResponse)request.GetResponse();
        }
        catch( WebException ex )
        {
            Log.LogException( ex );
        }
        finally
        {
            request = null;
        }

        if( response == null || response.StatusCode != HttpStatusCode.OK )
        {
            if( response != null )
            {
                response.Close();
                response = null;
            }

            return null;
        }

        return response.GetResponseStream();
    }

Для управления ответом у меня есть собственный анализатор Xhtml, который я использую, но это тысячи строк кода. Есть несколько общедоступных парсеров (см. Комментарий Дарина).

РЕДАКТИРОВАТЬ: в соответствии с вопросом ОП, заголовки могут быть добавлены к запросу для эмуляции агента пользователя. Например:

request = (HttpWebRequest)WebRequest.Create( url );
                request.Accept = "application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, */*";
                request.Timeout = timeout;
                request.Headers.Add( "Cookie", cookies );

                //
                // manifest as a standard user agent
                request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US)";
1 голос
/ 07 октября 2010

Если вы хотите использовать чистый C # способ просмотра веб-страниц, вам стоит поискать WatiN .Он позволяет легко открывать веб-браузер и просматривать веб-страницу (и действия) с помощью кода C #.

Вот пример поиска в Google с помощью API (взят из их документов)

using System;
using WatiN.Core;

namespaceWatiNGettingStarted
{
  class WatiNConsoleExample
  {
    [STAThread]
    static void Main(string[] args)
    {
      // Open a new Internet Explorer window and
      // goto the google website.
      IE ie = new IE("http://www.google.com");

      // Find the search text field and type Watin in it.
      ie.TextField(Find.ByName("q")).TypeText("WatiN");

      // Click the Google search button.
      ie.Button(Find.ByValue("Google Search")).Click();

      // Uncomment the following line if you want to close
      // Internet Explorer and the console window immediately.
      //ie.Close();
    }
  }

}

1 голос
/ 07 октября 2010

Здесь вы можете найти учебник из 4 частей к тому, что вы хотите.

это первая, 4 части здесь (Как написать поисковую систему)

1 голос
/ 07 октября 2010

Вы можете взглянуть на Html Agility Pack и / или SgmlReader . Вот пример использования SgmlReader, который выбирает все узлы в DOM, содержащие некоторый текст:

class Program
{
    static void Main()
    {
        using (var reader = new SgmlReader())
        {
            reader.Href = "http://www.microsoft.com";
            var doc = new XmlDocument();
            doc.Load(reader);
            var nodes = doc.SelectNodes("//*[contains(text(), 'Products')]");
            foreach (XmlNode node in nodes)
            {
                Console.WriteLine(node.OuterXml);
            }
        }
    }
}
0 голосов
/ 07 октября 2010

Вы также можете использовать селен, чтобы легко перемещаться по DOM и получать значения полей. Он также автоматически откроет для вас браузер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...