Чтение и публикация на веб-страницах с использованием C#
У меня есть проект на работе, который требует от меня возможности вводить информацию на веб-страницу, читать следующую страницу, на которую я перенаправлен, и затем предпринимать дальнейшие действия. Упрощенный пример из реальной жизни - это что-то вроде перехода на google.com, ввода "Трюков кодирования" в качестве критериев поиска и чтения полученной страницы.
Небольшие примеры кодирования, такие как ссылки на http://www.csharp-station.com/HowTo/HttpWebFetch.aspx рассказывают, как читать веб-страницу, а не как взаимодействовать с ней, отправляя информацию в форму и продолжая на следующую страницу.
Кстати, я не создаю вредоносный продукт и / или продукт, связанный со спамом.
Итак, как мне перейти к чтению веб-страниц, для начала которых требуется несколько шагов обычного просмотра?
6 ответов
Вы можете программно создать запрос 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 в основном жестко запрограммированы. Если вам нужно что-то более динамичное, вам нужно:
- Захватить страницу
- Раздень форму
- Создать строку 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 Test Recorder и WatiN на основе.NET.
Что вам нужно сделать, это продолжать извлекать и анализировать источник HTML для каждой страницы в цепочке. Для каждой страницы необходимо выяснить, как будет выглядеть отправка формы, и отправить запрос, который будет соответствовать этому, чтобы получить следующую страницу в цепочке.
Что я делаю, так это создаю собственный класс обертки System.Net.HttpWebRequest/HttpWebResponse, поэтому получение страниц так же просто, как и использование System.Net.WebClient. Тем не менее, мой пользовательский класс также поддерживает один и тот же контейнер cookie для разных запросов и упрощает отправку данных постов, настройку пользовательского агента и т. Д.
В зависимости от того, как работает сайт, вы можете либо манипулировать URL, чтобы выполнить то, что вы хотите. Например, чтобы найти слово "битлз", вы можете просто открыть запрос на google.com?q=beetles, а затем просто прочитать результаты.
В качестве альтернативы, если веб-сайт не использует значения строки запроса (url) для обработки действий страницы, вам нужно будет выполнить веб-запрос, который вместо этого публикует требуемые значения на веб-сайте. Поиск в Google для работы с WebRequest и веб-ответ.
В вашем примере с Google вы не должны вводить что-либо в критерии поиска, а вместо этого переходить непосредственно на страницу, на которую вас ведет кнопка поиска.
Для вашего примера: http://www.google.com/search?hl=en&q=coding%20tricks
Мне очень повезло с этим продуктом:
IMacros
У меня есть приложение, которое работает уже много месяцев, возможно, более года, используя их продукт.
Продукт верхнего уровня имеет графический интерфейс, который вы можете использовать для записи и редактирования макросов, и библиотеки C#, которые вы можете вызывать из кода.Net.
ИМХО, это одна из тех областей программирования, которая кажется простой при запуске ("Я просто ПОЛУЧУ HTML для страницы, обработаю строку, затем ПОЛУЧУ следующую страницу..."), но на практике это оказывается настоящая пита.