Попытка парсинга веб-сайта с помощью flash-плагина

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

<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" WIDTH="250" HEIGHT="20" id="Preloader"><PARAM NAME="movie" VALUE="/images/preloader.swf">
      <PARAM NAME="quality" VALUE="high">
      <PARAM NAME**strong text**="bgcolor" VALUE="#FFFFFF"><EMBED src="/images/preloader.swf" quality="high" bgcolor="#FFFFFF" WIDTH="250" HEIGHT="20" NAME="Preloader" ALIGN="" TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer"></EMBED></OBJECT>

Я попытался найти данные, полученные на wireshark, но безуспешно. Мои знания об этом флеш-плагине или о том, как он работает, равны нулю. Я предполагаю, что в худшем случае я не смогу этого сделать.

HttpWebRequest mainRequest = (HttpWebRequest)(WebRequest.Create(URL));
            mainRequest.Method = "GET";
            mainRequest.Proxy = null;
            WebResponse mainResponse = mainRequest.GetResponse();
            StreamReader dataReader = new StreamReader(mainResponse.GetResponseStream(), System.Text.Encoding.UTF8);
            string data = dataReader.ReadToEnd();
            dataReader.Close();
            mainResponse.Close();
            return data;

Кто-нибудь знает, как я могу получить эти данные или заставить веб-ответ ждать, пока данные будут введены в html, прежде чем они будут получены. Любая помощь будет принята с благодарностью.

ОБНОВЛЕНИЕ: кажется, я немного поторопился со вспышкой. Я думаю, что это просто анимация загрузки во время заполнения таблицы. Я использовал скрипач, чтобы увидеть, что происходит. Страница возвращается после запроса с загрузочным div и флеш-объектом, содержащимся внутри. Через несколько секунд, когда данные готовы, возвращается другая страница с данными. Насколько я помню (я не дома, поэтому не могу подтвердить прямо сейчас), новая страница имеет тот же заголовок запроса, что и оригинал. В скрипаче нет данных json или ajax. Я вижу, что на клиенте нет сценария для обновления. Я не понимаю, что вызывает это обновление.

Я кратко рассмотрел объект веб-браузера, но я полагаю, что это будет довольно большой удар по производительности, когда я очищаю около 200 страниц, что в настоящее время занимает около минуты. Позже я попробую средство просмотра amf, чтобы убедиться, что объект flash не является источником обновления.

Я предполагаю, что сервер вызывает повторную отправку этой страницы, когда у него есть готовая таблица. Если сервер находит загрузочный div и заменяет его таблицей данных, приведет ли это к повторной отправке всей страницы? Или это не будет отображаться в данных ajax/json? Если это сервер повторно отправляет данные, как я могу оставить ответ открытым, пока он не будет готов отправить новую страницу?

Спасибо. Дж. М.


person JMG    schedule 12.06.2013    source источник


Ответы (3)


Если содержимое динамически загружается во Flash-ролик, скорее всего, это происходит с помощью стандартного HTTP-запроса. Wire Shark может быть немного излишним для обнаружения чего-то подобного. Я бы рекомендовал использовать утилиту, которая захватывает HTTP, например Charles, HttpFox или screen-scraper. Используя один из этих инструментов, отслеживайте HTTP-запросы, возникающие во время загрузки контента. Как только вы определите, какой это запрос, вероятно, вы сможете просто воспроизвести его в своем коде.

Тем не менее, я также видел случаи (хотя и не очень распространенные), когда данные, загружаемые во флэш-ролик, выполняются с помощью двоичного протокола, что немного усложняет ситуацию. В этих случаях часто используется протокол AMF. Прокси-сервер Charles обнаружит этот протокол, так что в этом случае можно использовать именно его. Некоторое время назад я написал сообщение в блоге об извлечении данных, которые доставляются через АМФ. Он имеет дело с библиотекой Java, но вы можете найти что-то эквивалентное в .NET.

person todd    schedule 12.06.2013
comment
Я обнаружил, что могу добавить параметр к ссылке, чтобы получить эту информацию для загрузки, прежде чем она отправит ее мне. Я отметил этот ответ как правильный, так как это то, что привело меня к окончательному решению, хотя все ответы были очень полезными, всем спасибо :) - person JMG; 15.07.2013

Вы не сможете сделать это с помощью простого HttpWebRequest, потому что Flash-контент не работает. Ответ, который вы получите, — это просто HTML. Для фактического выполнения, загрузки этого объекта и извлечения содержимого требуется браузер (или объект, подобный браузеру). Я знаю, что существуют библиотеки для выполнения Javascript, но я не знаю ничего, что позволило бы вам запускать плагин Flash вне браузера.

Возможно, вам лучше использовать объект WebBrowser. . Но даже если он выполнит Flash-контент (честно говоря, не знаю, выполнит ли), вы не сможете получить к нему доступ. Вам придется посмотреть на DOM и посмотреть.

person Jim Mischel    schedule 12.06.2013

Используйте Firebug и/или TamperData, загрузите свою страницу с flash как обычно и подождите, пока Flash выполнит HTTP POST/GET для получения данных.

У Flash есть три варианта получения данных:

  • Розетки
  • HTTP ПОЛУЧИТЬ
  • HTTP-ПОСТ

Вы можете обмануть эту штуку в любой день. Просто нужно убедиться, что ваш запрос содержит все эти мелочи:

  • Метод (GET или POST)
  • Печенье
  • Значения формы (почему? Состояние сеанса, например)
  • URL-адрес реферера
  • Агент пользователя
  • Пользовательские HTTP-заголовки? (некоторые ребята могут поместить это в HTTP-запрос, чтобы никто не мог «обмануть» сервер)

Это может иметь значение, если ответ с данными является страницей ошибки html по умолчанию.

И последнее: если контент доставляется через HTTPS, то не волнуйтесь, это всего лишь дополнительный слой где-то, но все же возможный.

Если контент доставляется через сокеты, то забудьте об этом.

person Adrian Salazar    schedule 13.06.2013
comment
Да, я уверен, что смогу его обмануть, мне просто нужно сначала понять, как он работает. Я обновил вопрос, потому что я не думаю, что проблема с флэш-объектом, это просто анимация загрузки. Спасибо :) - person JMG; 13.06.2013
comment
В любом случае, тот, кто делает запрос, пройдет через TamperData или Firebug. Остерегайтесь скрытых iFrames. Вам придется применять эти принципы к любому http-запросу. Состояние сеанса сложнее всего обмануть, но это возможно. - person Adrian Salazar; 13.06.2013