Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Парсить иcходник страницы после всех манипуляций JS с DOM (https://javascript.ru/forum/misc/32904-parsit-ickhodnik-stranicy-posle-vsekh-manipulyacijj-js-s-dom.html)

psixojoker 03.11.2012 16:58

Парсить иcходник страницы после всех манипуляций JS с DOM
 
В таблицу с помощью js(Ajax) при загрузке страницы сразу подгружаются данные(их и нужно спарсить). Если просмотреть исходный код страницы, то данных там нет. Понятно, что они подгружаются динамически и уже на клиентской стороне.
Вопрос, как парсить?

Я нашел статью, где описывается как написать плагин к хрому на jQuery, который вроде бы может сначала получить исходник, потом выполнить все js скрипты и дать возможность рыться в сформированном документе. Сделал все как там написано - не работает. Данных нет.
К Selenium боюсь прикасаться, потому что чувствую, не разберусь в нем.

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

Подскажите пожалуйста, как мне лучше(проще) поступить?

dmitriymar 03.11.2012 17:03

инструменты разработчика есть в любом браузере сейчас

psixojoker 03.11.2012 18:27

Спасибо, не помогло.

dmitriymar 03.11.2012 18:32

Цитата:

Сообщение от psixojoker
Спасибо, не помогло.

всем помогают вообщето. стоит изучить их возможности

DjDiablo 03.11.2012 18:55

Если данные подгружаются ajax, то спрашивается на кой хрен их вообще парсить ?

Что мешает получить данные через ajax сразу и обойтись вообще без парсера ???????

psixojoker 03.11.2012 19:36

Я уже не уверен что подгрузка идет именно через ajax. FireBug не отлавливает это. Скорее всего все манипуляции идут в основном скрипте на 26 тыс. строк. Разобраться откуда берутся данные в нем чрезвычайно сложно.

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

Мне достаточно примера получения исходника (конечного) через расширение любого браузера. Со всем остальным разберусь

melky 03.11.2012 19:53

Цитата:

Сообщение от psixojoker
Подскажите пожалуйста, как мне лучше(проще) поступить?

проследить ajax запрос.
Цитата:

Сообщение от psixojoker
Скорее всего все манипуляции идут в основном скрипте на 26 тыс. строк.

тогда придётся отслеживать все действия скрипта.

если не умеете пользоваться отладчиками, кидайте сюда ссылку на страницу, где этот скрипт находится

DjDiablo 03.11.2012 20:20

кинь адрес сайта, точнее страницы которую надо пропарсить

psixojoker 03.11.2012 20:34

http://www.oddsportal.com/soccer/arm...esults/page/2/

коэффициенты подгружаются именно динамически.

melky 03.11.2012 22:19

Цитата:

Сообщение от psixojoker (Сообщение 213925)
http://www.oddsportal.com/soccer/arm...esults/page/2/

коэффициенты подгружаются именно динамически.

тама web socket - я хз, с ними ещё не работал.

данные забираются отсюда, и они приходят в ввиде шифра.

wss://oppush.livesport.eu/WebSocketConnection-Secure

DjDiablo 04.11.2012 09:43

ну а что если парсить, при помощи php ?.

если парсить ручками, раз в день или раз в неделю :)
<?
	$ch = curl_init (); // инициализация
	curl_setopt ($ch , CURLOPT_URL , "http://www.oddsportal.com/soccer/armenia/premier-league-2010/results/page/2/");
	curl_setopt ($ch , CURLOPT_USERAGENT , "Mozilla/5.0"); // каким браузером будем прикидываться
	curl_setopt ($ch , CURLOPT_RETURNTRANSFER , 1 ); // вывод страницы в переменную
	$content = curl_exec($ch); // скачиваем страницу
	curl_close($ch); // закрываем соединение 

        echo $content;
?>

<script>
   setTimeout(function(){
		alert("Привет я внедрённый скрипт, когда страница будет открыта я извлеку все понравившиеся мне данные");     
   },1000)
</script>


если хочешь чтобы парсилось при открытии страницы пользователем.
<?
	$ch = curl_init (); // инициализация
	curl_setopt ($ch , CURLOPT_URL , "http://www.oddsportal.com/soccer/armenia/premier-league-2010/results/page/2/");
	curl_setopt ($ch , CURLOPT_USERAGENT , "Mozilla/5.0"); // каким браузером будем прикидываться
	curl_setopt ($ch , CURLOPT_RETURNTRANSFER , 1 ); // вывод страницы в переменную
	$content = curl_exec($ch); // скачиваем страницу
	curl_close($ch); // закрываем соединение 
?>
<iframe id="content" style="display:hidden;"> <?=$content ?></iframe>

//вот здесь твой сайт
//бла бла бла

<script>
   setTimeout(function(){
		alert("Привет я скрипт, когда страница будет открыта я извлеку все понравившиеся мне данные из фрэйма content и вставлю их в свой сайт");     
   },1000) 
</script>


Разьясню как работает и почему.
1)сначало курл на сервере получает страницу которую надо распарсить
2) затем генерируется html, контент с вражеского сайта вставляется в фрейм. Фрейм очень важно создан на нашей странице и никакой связи с кросс доменными запросами неимеет
3) страница уходит на браузер
4) в фрейме отработают скрипты с вражеского сайта
5) наш скрипт заберёт из фрейма всё что захочет, проблем с этим небудет так как для создания в браузере кросс доменного запроса небыло. Эту операцию как вы помните мы проделали на сервере в первом шаге, и браузер о ней конечно нечего не знает

На самом деле PHP используется лишь как один из способов решения кроссдоменного ограничения, думаю контент можно вставить в фрейм любым другим из доступных способов, просто этот на мой взгляд самый изящный :D
kpps67

psixojoker 11.11.2012 00:08

Спасибо, интересный подход с iframe'ом :-)

Однако уже реализовал парсер на PhantomJS. Работает.)

Спасибо всем за помощь.

irmscher 27.08.2013 03:44

Добрый день. Можете пожалуйста привести пример как парсите Javascript с помощью phantomjs?

У меня динамическая каптча на странице которую я не могу спарсить через PHP GET:



Часовой пояс GMT +3, время: 15:23.