Вопрос

Когда нет доступного webservice API, вашим единственным вариантом может быть очистка экрана, но как вы делаете это на c #?

как вы думаете это сделать?

Это было полезно?

Решение

Ответы Мэтта и Пола верны."Очистка экрана" путем синтаксического анализа HTML с веб-сайта обычно является плохой идеей, потому что:

  1. Синтаксический анализ HTML может быть затруднен, особенно если она деформирована.Если вы очищаете очень, очень простую страницу, то могут сработать регулярные выражения.В противном случае используйте платформу синтаксического анализа, такую как HTML Agility Pack.

  2. Веб-сайты - это движущаяся цель.Вам нужно будет обновлять свой код каждый раз, когда исходный веб-сайт изменяет свою структуру разметки.

  3. Очистка экрана плохо работает с Javascript.Если целевой веб-сайт использует какой-либо динамический скрипт для управления веб-страницей, вам будет очень сложно очистить ее.Перехватить HTTP-ответ легко, намного сложнее очистить то, что браузер отображает в ответ на клиентский скрипт, содержащийся в этом ответе.

Если очистка экрана - единственный вариант, вот несколько ключей к успеху:

  1. Сделайте так, чтобы изменить шаблоны, которые вы ищете, было как можно проще.Если возможно, сохраните шаблоны в виде текстовых файлов или где-нибудь в файле ресурсов.Сделайте так, чтобы другим разработчикам (или вам самим через 3 месяца) было очень легко понять, какую разметку вы ожидаете найти.

  2. Проверяйте входные данные и создавайте значимые исключения.В вашем коде синтаксического анализа позаботьтесь о том, чтобы ваши исключения были очень полезными.Целевой сайт будет изменение зависит от вас, и когда это произойдет, вы хотите, чтобы ваши сообщения об ошибках сообщали вам не только о том, какая часть кода завершилась ошибкой, но почему это провалилось.Укажите как шаблон, который вы ищете, так И текст, с которым вы сравниваете.

  3. Напишите множество автоматизированных тестов.Вы хотите, чтобы было очень легко управлять вашим скребком неразрушающим способом, потому что вы будет проводите много итеративной разработки, чтобы получить правильные шаблоны.Автоматизируйте как можно больше тестов, это окупится в долгосрочной перспективе.

  4. Рассмотрим инструмент автоматизации браузера Нравится Ватин.Если вам требуется сложное взаимодействие с целевым веб-сайтом, возможно, было бы проще написать свой scraper с точки зрения самого браузера, а не возиться с HTTP-запросами и ответами вручную.

Что касается как чтобы отобразить scrape в C #, вы можете либо использовать Watin (см. Выше) и очистить результирующий документ, используя его DOM, либо вы можете использовать WebClient class [см. MSDN или Google], чтобы получить необработанный HTTP-ответ, включая HTML-содержимое, а затем использовать какой-либо текстовый анализ для извлечения нужных вам данных.

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

Использование Html-пакет гибкости.Он плохо обрабатывает и искажает HTML.Это позволяет вам выполнять запросы с помощью XPath, что очень упрощает поиск данных, которые вы ищете.НЕ пишите синтаксический анализатор вручную и НЕ используйте регулярные выражения, это просто слишком неуклюже.

Термин, который вы ищете, на самом деле называется Соскабливание с экрана.

Одна вещь, которую вы должны учитывать при очистке веб-сайтов, заключается в том, что они находятся вне вашего контроля и могут часто и значительно меняться.Если вы все-таки решитесь на соскабливание, то факт изменения должен стать частью вашей общей стратегии.Например.рано или поздно вам нужно будет обновить свой код, чтобы справиться с "движущейся целью".

Вот пара ссылок на C #, которые помогут вам начать:

http://www.cambiaresearch.com/c4/3ee4f5fc-0545-4360-9bc7-5824f840a28c/How-to-scrape-or-download-a-webpage-using-csharp.aspx

Вот пример кода на C #, который поможет вам

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-документ.

С практической точки зрения (за эти годы я написал десятки "интерактивных" приложений), я, наконец, остановился на Ватин в сочетании с CsQuery ( Запрос CsQuery ).

Watin предоставляет основы автоматизации браузера (взаимодействие с кнопками и т.д.), В то время как CsQuery позволяет использовать синтаксис в стиле jQuery для анализа содержимого страницы.

Некоторое время я использовал Selenium (также предназначенный для автоматического тестирования веб-сайтов) с IE и FireFox, но обнаружил, что он подвержен сбоям при использовании для длительной очистки.Все мои текущие производственные системы - Watin + CsQuery и обеспечивают надежную очистку нескольких веб-сайтов на ежедневной основе.

Примечание:Я понимаю, что Watin некоторое время не обновлялся, но "если он не сломался, используй его!" :)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top