Чтение и размещение на веб-страницах с помощью C#

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
7 094
4

Ответы 4

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

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

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

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

Вы можете программно создать запрос 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 могло бы лучше подходить для такого рода задач.

изменить: x-www-form-urlencoded

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

Приложение: Подобно Selenium IDE и Selenium RC, которые основаны на Java, Регистратор тестов WatiN и ВАТИНА основаны на .NET.

Другие вопросы по теме