У меня есть проект на работе, который требует от меня возможности вводить информацию на веб-страницу, читать следующую страницу, на которую я перенаправляюсь, а затем предпринимать дальнейшие действия. Упрощенный пример реального мира будет похож на google.com, вводя "Кодирующие трюки" в качестве критериев поиска и прочитав результирующую страницу.
Небольшие примеры кодирования, такие как те, которые связаны с http://www.csharp-station.com/HowTo/HttpWebFetch.aspx, рассказывают, как читать веб-страницу, но не как с ней взаимодействовать путем отправки информации в форму и перехода к следующей странице.
Для записи я не создаю вредоносный и/или спам-родственный продукт.
Итак, как мне перейти на прочитанные веб-страницы, для которых требуется выполнить несколько шагов обычного просмотра?
Вы можете программно создать запрос 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 в основном жестко закодированы. Если вам нужно что-то более динамичное, вам придется:
FWIW, я думаю, что что-то вроде Perl или Python может быть лучше подходит для такого рода задач.
изменить: x-www-form-urlencoded
Вы можете попробовать Selenium. Запишите действия в Firefox с помощью Selenium IDE, сохраните script в формате С#, а затем воспроизведите их с помощью оболочки Selenium RC С#. Как уже упоминалось, вы также можете использовать 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 через запросы и упрощает отправку почтовых данных, настраивает пользовательский агент и т.д.
Мне очень повезло с этим продуктом:
IMacros
У меня есть приложение, которое работает в течение многих месяцев, может быть, через год, используя свой продукт.
Продукт верхнего уровня имеет графический интерфейс, который вы можете использовать для записи и редактирования макросов, а также библиотеки С#, которые вы можете вызывать из .Net-кода.
IMHO, это одна из тех областей программирования, которые кажутся простыми при запуске ( "Я просто ПОЛУЧИТЬ HTML для страницы, обработать строку, затем ПОЛУЧИТЬ следующую страницу..." ), но на практике это становится чтобы быть реальной PITA.
В зависимости от того, как работает веб-сайт, вы можете либо манипулировать URL-адресом, чтобы выполнять то, что хотите. например, для поиска слова "битлес" вы можете просто открыть запрос на google.com?q=beetles, а затем просто прочитать результаты.
В качестве альтернативы, если веб-сайт не использует значения querystring (url) для обработки действий страницы, вам необходимо будет работать с веб-запросом, который вместо этого размещает требуемые значения на веб-сайте. Искать в Google для работы с WebRequest и webresponse.
В вашем примере Google вы не должны вводить что-либо в критерии поиска, а вместо этого переходите непосредственно к странице, на которой находится кнопка поиска.
В вашем примере: http://www.google.com/search?hl=en&q=coding%20tricks