Подтвердить что ты не робот

Как вы скрипируете экран?

Если API-интерфейс веб-службы отсутствует, единственным вариантом может быть Screen Scrape, но как вы это делаете в С#?

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

4b9b3361

Ответ 1

Ответы Мэтта и Пола верны. "Скребок экрана" путем разбора HTML-кода с веб-сайта обычно является плохой идеей, потому что:
  • Анализ HTML может быть затруднен, особенно если он искажен. Если вы очищаете очень и очень простую страницу, тогда могут работать регулярные выражения. В противном случае используйте структуру синтаксического анализа, такую ​​как HTML Agility Pack.

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

  • Скребок экрана плохо работает с Javascript. Если целевой сайт использует какой-либо динамический script, чтобы манипулировать веб-страницей, вам будет очень сложно соскрести его. Легко захватить HTTP-ответ, гораздо сложнее очистить то, что браузер отображает в ответ на клиентскую сторону script, содержащуюся в этом ответе.

Если экранная скребка является единственным вариантом, вот некоторые ключи к успеху:

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

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

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

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

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

Ответ 2

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

Ответ 3

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

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

Вот несколько ссылок на С#, чтобы вы начали:

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

Ответ 4

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

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;
}

Ответ 5

Только одно замечание: несколько человек упомянули о том, чтобы вытащить веб-сайт в виде XML, а затем использовать XPath для итерации по узлам. Вероятно, важно убедиться, что вы работаете с сайтом, который был разработан в XHTML, чтобы убедиться, что HTML представляет собой хорошо сформированный XML-документ.

Ответ 6

С практической точки зрения (я на протяжении многих лет написали десятки "веб-интерактивных" приложений), я, наконец, остановился на Watin в сочетании с CSQuery.

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

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

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