Если API-интерфейс веб-службы отсутствует, единственным вариантом может быть Screen Scrape, но как вы это делаете в С#?
Как вы думаете, как это сделать?
Если API-интерфейс веб-службы отсутствует, единственным вариантом может быть Screen Scrape, но как вы это делаете в С#?
Как вы думаете, как это сделать?
Анализ HTML может быть затруднен, особенно если он искажен. Если вы очищаете очень и очень простую страницу, тогда могут работать регулярные выражения. В противном случае используйте структуру синтаксического анализа, такую как HTML Agility Pack.
Веб-сайты - движущаяся цель. Вам нужно будет обновлять свой код каждый раз, когда исходный веб-сайт изменяет структуру разметки.
Скребок экрана плохо работает с Javascript. Если целевой сайт использует какой-либо динамический script, чтобы манипулировать веб-страницей, вам будет очень сложно соскрести его. Легко захватить HTTP-ответ, гораздо сложнее очистить то, что браузер отображает в ответ на клиентскую сторону script, содержащуюся в этом ответе.
Если экранная скребка является единственным вариантом, вот некоторые ключи к успеху:
Сделайте как можно проще изменение шаблонов, которые вы ищете. Если возможно, сохраните шаблоны в виде текстовых файлов или в файле ресурсов где-нибудь. Сделать это очень легко для других разработчиков (или самостоятельно через 3 месяца), чтобы понять, какую разметку вы ожидаете найти.
Проверять ввод и выдавать значимые исключения. В вашем синтаксическом коде обязательно позаботьтесь о том, чтобы ваши исключения были очень полезными. Целевой сайт изменится на вас, и когда это произойдет, вы хотите, чтобы ваши сообщения об ошибках сообщали вам не только о том, какая часть кода не удалась, но и почему она не удалась. Упомяните как шаблон, который вы ищете, так и текст, который вы сравниваете.
Напишите множество автоматических тестов. Вы хотите, чтобы было очень легко запустить ваш скребок в неразрушающем режиме, потому что вы будете делать много итеративного развития, чтобы получить правильные образцы. Автоматизируйте столько тестов, сколько сможете, оно будет окупиться в долгосрочной перспективе.
Рассмотрим инструмент автоматизации браузера, например Watin. Если вам требуется сложное взаимодействие с целевым веб-сайтом, может быть проще написать ваш скребок с точки зрения самого браузера, а не сбрасывать запросы HTTP и ответы вручную.
Что касается того, как скринировать скрины на С#, вы можете использовать Watin (см. выше) и очистить полученный документ с помощью DOM, или вы можете использовать класс WebClient
[см. MSDN или Google], чтобы получить исходное HTTP, включая HTML-контент, а затем использовать какой-то текстовый анализ для извлечения необходимых данных.
Используйте Html Agility Pack. Он обрабатывает плохой и искаженный HTML. Он позволяет вам запрашивать XPath, что позволяет легко находить нужные вам данные. НЕ пишите парсер вручную и НЕ используйте регулярные выражения, это слишком неуклюже.
Термин, который вы ищете, на самом деле называется Screen Scraping.
Одна вещь, которую вы должны учитывать, касающуюся соскабливания веб-сайтов, заключается в том, что они находятся вне вашего контроля и могут меняться часто и значительно. Если вы все-таки соскоблите, то факт изменения должен быть частью вашей общей стратегии. Например. вам нужно будет обновить свой код раньше или позже, чтобы иметь дело с "движущейся мишенью".
Вот несколько ссылок на С#, чтобы вы начали:
Вот пример кода С#, который поможет вам
Uri url = new Uri("http://msdn.microsoft.com/en-US/");
if (url.Scheme == Uri.UriSchemeHttp)
{
//Create Request Object
HttpWebRequest objRequest = (HttpWebRequest)HttpWebRequest.Create(url);
//Set Request Method
objRequest.Method = WebRequestMethods.Http.Get;
//Get response from requested url
HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();
//Read response in stream reader
StreamReader reader = new StreamReader(objResponse.GetResponseStream());
string tmp = reader.ReadToEnd();
objResponse.Close();
//Set response data to container
this.pnlScreen.GroupingText = tmp;
}
Только одно замечание: несколько человек упомянули о том, чтобы вытащить веб-сайт в виде XML, а затем использовать XPath для итерации по узлам. Вероятно, важно убедиться, что вы работаете с сайтом, который был разработан в XHTML, чтобы убедиться, что HTML представляет собой хорошо сформированный XML-документ.
С практической точки зрения (я на протяжении многих лет написали десятки "веб-интерактивных" приложений), я, наконец, остановился на Watin в сочетании с CSQuery.
Watin предоставляет основы автоматизации браузера (взаимодействие с кнопками и т.д.), в то время как CSQuery позволяет использовать синтаксис стиля jQuery для анализа содержимого страницы.
Я использовал Selenium некоторое время (также предназначенное для автоматического тестирования веб-сайтов) с IE и FireFox, но обнаружил, что он подвержен сбою при использовании для долгосрочного соскабливания. Все мои текущие производственные системы Watin + CSQuery и обеспечивают надежную очистку нескольких веб-сайтов на ежедневной основе.
Примечание. Я понимаю, что Ватин не обновлялся какое-то время, но "если он не сломался, используйте его!":)