Чтение и публикация на веб-страницах с использованием C # - PullRequest
2 голосов
/ 25 сентября 2008

У меня есть проект на работе, который требует от меня, чтобы я мог вводить информацию на веб-страницу, читать следующую страницу, на которую я перенаправлен, и затем предпринимать дальнейшие действия. Упрощенный пример из реальной жизни - это что-то вроде перехода на google.com, ввода «Трюков кодирования» в качестве критерия поиска и чтения полученной страницы.

Небольшие примеры кодирования, такие как ссылки на http://www.csharp -station.com / HowTo / HttpWebFetch.aspx , рассказывают, как читать веб-страницу, а не как взаимодействовать с ней, отправляя информацию в форма и переход к следующей странице.

Кстати, я не создаю вредоносный продукт и / или продукт, связанный со спамом.

Так как же мне начать читать веб-страницы, для начала которых требуется несколько шагов обычного просмотра?

Ответы [ 6 ]

4 голосов
/ 25 сентября 2008

Вы можете программно создать запрос Http и получить ответ:

 string uri = "http://www.google.com/search";
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";

        // encode the data to POST:
        string postData = "q=searchterm&hl=en";
        byte[] encodedData = new ASCIIEncoding().GetBytes(postData);
        request.ContentLength = encodedData.Length;

        Stream requestStream = request.GetRequestStream();
        requestStream.Write(encodedData, 0, encodedData.Length);

        // send the request and get the response
        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
        {

            // Do something with the response stream. As an example, we'll
            // stream the response to the console via a 256 character buffer
            using (StreamReader reader = new StreamReader(response.GetResponseStream()))
            {
                Char[] buffer = new Char[256];
                int count = reader.Read(buffer, 0, 256);
                while (count > 0)
                {
                    Console.WriteLine(new String(buffer, 0, count));
                    count = reader.Read(buffer, 0, 256);
                }
            } // reader is disposed here
        } // response is disposed here

Конечно, этот код возвратит ошибку, так как Google использует GET, а не POST, для поисковых запросов.

Этот метод будет работать, если вы имеете дело с конкретными веб-страницами, поскольку URL-адреса и данные POST в основном жестко запрограммированы. Если вам нужно что-то более динамичное, вам нужно:

  1. Захват страницы
  2. Вычеркните форму
  3. Создание строки POST на основе полей формы

FWIW, я думаю, что-то вроде Perl или Python могло бы лучше подходить для такого рода задач.

edit: x-www-form-urlencoded

3 голосов
/ 26 сентября 2008

Вы можете попробовать Селен . Запишите действия в Firefox, используя Selenium IDE, сохраните сценарий в формате C #, затем воспроизведите их, используя оболочку Selenium RC C #. Как уже упоминали другие, вы также можете использовать System.Net.HttpWebRequest или System.Net.WebClient . Если это настольное приложение, см. Также System.Windows.Forms.WebBrowser .

Приложение: аналогично Selenium IDE и Selenium RC, основанных на Java, WatiN Test Recorder и WatiN на основе .NET

2 голосов
/ 25 сентября 2008

Что вам нужно сделать, это продолжать извлекать и анализировать источник HTML для каждой страницы в цепочке. Для каждой страницы необходимо выяснить, как будет выглядеть отправка формы, и отправить запрос, который будет соответствовать этому, чтобы получить следующую страницу в цепочке.

Что я делаю, так это создаю собственный класс обертки System.Net.HttpWebRequest / HttpWebResponse, поэтому получение страниц так же просто, как и использование System.Net.WebClient. Тем не менее, мой пользовательский класс также сохраняет один и тот же контейнер cookie для разных запросов и упрощает отправку данных постов, настройку пользовательского агента и т. Д.

0 голосов
/ 25 сентября 2008

Мне очень повезло с этим продуктом:

IMacros

http://www.iopus.com/

У меня есть приложение, которое работает в течение многих месяцев, возможно, более года, используя их продукт.

Продукт верхнего уровня имеет графический интерфейс, который можно использовать для записи и редактирования макросов, и библиотеки C #, которые можно вызывать из кода .Net.

ИМХО, это одна из тех областей программирования, которая кажется простой при запуске («Я просто ПОЛУЧУ HTML для страницы, обработаю строку, затем ПОЛУЧУ следующую страницу ...»), но на практике это получается быть настоящей питой.

0 голосов
/ 25 сентября 2008

В вашем примере с Google вы не должны вводить что-либо в критерии поиска, а вместо этого сразу перейти на страницу, на которую вас ведет кнопка поиска.

Для вашего примера: http://www.google.com/search?hl=en&q=coding%20tricks

0 голосов
/ 25 сентября 2008

В зависимости от того, как работает сайт, вы можете либо манипулировать URL, чтобы выполнить то, что вы хотите. например, чтобы найти слово «битлз», вы можете просто открыть запрос на google.com?q=beetles, а затем просто прочитать результаты.

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

...