@RightScripts
Учусь, познаю, пытаюсь что то делать

Как решить проблему с парсингом динамического контента?

Всем доброго времени суток. Суть вопроса в следующем.
Ко мне обратился друг, с проблемой, невозможности скопировать эту страницу в таблицу ексель
www.statarea.com/predictions
посмотрев на код, я понял что нужно спарсить данные и вывести их в html таблицу. Так как в программировании я совсем новичек, прошу сильно не пинать, но аргументиованная критика очень даже приветствуется.
Я начал с php, создал парсер, который тянул DOM, с помошью phpQuery, потом выводил в виде таблицы, все получилось, но стал боком самый главный вопрос, там возле каждого матча, есть кнопка, которая раскрывала более подробную информацию о матче. Этот контент как раз и был очень важен для моего друга, по гуглив немного я нашел статью, в которой описывался парсер через расширение для хрома, я переписал код на jQuery и он делает все то же самое что и первый, а вот как стащить динамический контент - так и не нашел. После очередного поиска по гуглу, я нашел рекомендации в двух отдельных направлениях, это node.js и nightmare.js, и второй это python и beautifulsoup. Сейчас начал изучать node.js и python. Извиняюсь за столь длинный текст, вот собственно и назрел вопрос, который я все таки решился задать, так как не нашел на него ответа.

Каким методом, возможно получить DOM, уже после клика на этот элемент? Реально ли это сделать по средствам jQuery в расширении для браузера, или все таки нужен питон или нод,джиес?

Пока ищу ответ изучаю ajax, надеясь найти там ответы)

Вот код на php
function getCurlContent ($url){
	
	$ch = curl_init($url);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	$res = curl_exec($ch);
	curl_close($ch);
	return $res;
}

function getStatareaTable ($url){

$statarea_content = file_get_contents($url); //Получаем HTML код страницы 
$doc = phpQuery::newDocument($statarea_content); // Создаем обьект phpQuery

/*========================== Цикл, который парсит данные и создает таблицу ===========================*/
echo '<DIV ALIGN="center">
         <TABLE BORDER="2">';
		 
foreach($doc->find('.match') as $matches){
		$matches = pq($matches);
		$hostteam = '<td>'.$matches->find('.hostteam .name')->text().'</td>';
		$guestteam = '<td>'.$matches->find('.guestteam .name')->text().'</td>';
		$dateTime = '<td>'.$matches->find('.date')->text().'</td>';
		$hostteamGoals = '<td>'.$matches->find('.hostteam .goals')->text().'</td>';
		$guestteamGoals = '<td>'.$matches->find('.guestteam .goals')->text().'</td>';
		$tip = '<td>'.$matches->find('.tip .value')->text().'</td>';
		$likePositive = '<td>'.$matches->find('.likepositive .value')->text().'</td>';
		$likeNegative = '<td>'.$matches->find('.likenegative .value')->text().'</td>';
				foreach ($matches->find('.coefbox .value') as $value){
						$value = pq($value);
						$coefRow .= '<td>'.$value->text().'</td>';
						}
		echo '<tr>';
		echo "$dateTime $hostteam $hostteamGoals - $guestteamGoals $guestteam $tip" 
    .	" $likePositive $likeNegative $coefRow" ;
		echo '</tr>';
		unset($coefRow);
}
echo '</TABLE>
</DIV>';
}
/*============================================================================================*/
?>


Вот на jquery

(function($){
function ajaxStart(){
  $('#progress').show();
}
function ajaxStop(){
  $('#progress').hide();
}
	
function parserGo(){
  ajaxStart();
  var b = $.ajax('http://www.statarea.com/predictions/');
  b.done(function (d) {
    analysisSite(d);
    ajaxStop();
  });
  b.fail(function (e, g, f) {
    alert('Epic Fail');
    ajaxStop();
  })
}
function analysisSite(data){
  var res = '';
  $(data).find('.match').each(function(){
	var hostteam = '<td>'+$(this).find('.hostteam').find('.name').text()+'</td>';
	var guestteam = '<td>'+$(this).find('.guestteam').find('.name').text()+'</td>';
	var dateTime = '<td>'+$(this).find('.date').text()+'</td>';
	var hostteamGoals = '<td>'+$(this).find('.hostteam').find('.goals').text()+'</td>';
	var guestteamGoals = '<td>'+$(this).find('.guestteam').find('.goals').text()+'</td>';
	var tip = '<td>'+$(this).find('.tip').find('.value').text()+'</td>';
	var likePositive = '<td>'+$(this).find('.likepositive').find('.value').text()+'</td>';
	var likeNegative = '<td>'+$(this).find('.likenegative').find('.value').text()+'</td>';
	var coefRow;
	$(this).find('.bet').trigger('click');
		$(this).find('.coefbox').each(function(){
						coefRow += '<td>'+$(this).find('.value').text()+'</td>';
						})
			/*$(this).find('.coefbox').each(function(){
							coefRow += '<td>'+$(this).find('.value').text()+'</td>';
							})*/
	
	var avrggoals = '<td>'+$(this).find('.avrggoals').text()+'</td>';
	res += '<tr>'+dateTime+ hostteam +hostteamGoals+guestteamGoals+
	guestteam+tip+likePositive+likeNegative+coefRow+avrggoals+'</tr>';

  })
  
  $('#resultbox').html(res);
}
$(function(){
  $('#progress').hide();
  $('#starter').click(parserGo);
});
})(jQuery);
  • Вопрос задан
  • 1392 просмотра
Пригласить эксперта
Ответы на вопрос 4
p00h
@p00h
Фехтовальщик-стропальщик
Вам нужно понять какой именно запрос делает браузер во время нажатия кнопки, затем повторить его каким-угодно способом. Это, вероятнее всего, ajax. Запрос идёт на один и тот же урл, меняется только некий id статьи/ресурса. Скажем, example.com/get_details/3007, где 3007 - айди ресурса.
Ответ написан
Взгляните в строну selenium, она предоставляет интерфейс для управления браузерами.

Я ей пользовался, когда писал автотесты для сайта, правда на python. Фишка в том, что браузер работает как будто управляется пользователем. И при этом после получения динамического контента, можно получить подгруженный html.

сейчас погуглил по теме: fb написал php-webdriver для selenium, так что для Вас это даже удобнее будет.
Ответ написан
x67
@x67
Скажите вашему другу, что ему нужен профессионал, который хотя бы умеет гуглить.
Я не понимаю, с чего вы решили, что имея заголовок вопроса похожий на тысячу других, ваш конкретный случай будет чем-то отличаться?
Ответ написан
@Historian111
Что то получилось сделать? и как, если не секрет?)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы