Здравствуйте уважаемые программисты. Решил я себе написать парсер статей из VK для сайта.
По урлу, допустим
Этому, скачиваю страницу:
$res = array();
$options = array(
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => false, // do not return headers
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_USERAGENT => "spider", // who am i
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
CURLOPT_TIMEOUT => 120, // timeout on response
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
);
$ch = curl_init( $_POST['Url'] );
curl_setopt_array( $ch, $options );
$content = curl_exec( $ch );
$err = curl_errno( $ch );
$errmsg = curl_error( $ch );
$header = curl_getinfo( $ch );
curl_close( $ch );
$res['content'] = $content;
Далее я начинаю перебирать контент:
# Получаем список ссылок на изображения в статье
preg_match_all('/"(.*)":\["(.*)",[0-9]{3},[0-9]{3}\]/S', $res['content'], $retData);
# Получаем текст из статьи, если он есть
preg_match_all('/<p class="article_decoration_first article_decoration_last" >(.*)<\/p>/S', $res['content'], $retText);
preg_match_all('/<p class="article_decoration_first" >(.*)<\/p>/S', $res['content'], $retTextFirst);
# Получаем заголовки к каждому параграфу, если они есть
preg_match_all('/<strong>(.*)<\/strong>/S', $res['content'], $retTextStrong);
# Получим нумерованные списки, если есть
preg_match_all('/<\/span>(.*)<\/h2>/S', $res['content'], $retNum);
# Получаем Основной заголовок для статьи, если он есть
preg_match_all('|\<h1.*\><span class=\'article_anchor_title\'>(.*)<\/span>(.*)<\/h1>|isU', $res['content'], $retZag);
if(isset($retZag[2])){
$string = implode(", ", $retZag[2]);
$stringStrip = strip_tags($string);
$strEx = substr($stringStrip, 5);
}
Дальше я считаю кол-во элементов в каждом массиве
if(isset($retData[2])){$retDataCount = count($retData[2]);}
if(isset($retText[1])){$retTextCount = count($retText[1]);}
if(isset($retTextFirst[1])){$retTextFirstCount = count($retTextFirst[1]);}
if(isset($retNum[1])){$retNumCount = count($retNum[1]);}
if(isset($retTextStrong[1])){$retTextStrongCount = count($retTextStrong[1]);}
# находим максимальный счетчик из представленных массивов
$maxCount = max($retDataCount, $retTextCount, $retTextFirstCount, $retTextStrongCount);
# Начинаем формировать строчку
$retSTR = '';
Ну а далее, по максимальному счетчику выполняю кол-во циклов сбора строки.
for($i=0;$i<$maxCount;$i++){
# Если есть заголовок для параграфа - добавляем в строку
if(isset($retTextStrong[1][$i])){$retSTR .= ''.$retTextStrong[1][$i].'<br /><br />';}
if(isset($retData[2][$i])){$retData[2] = array_map('stripslashes', $retData[2]);}
# Если есть изображения в статье, добавляем их в строку
# Скачиваем картинки на сервер
if(isset($retData[2][$i])){
$link = $func->urlLoadFile($retData[2][$i],$cat_upload,$cat_dnload,$url_dnload,$tmpPath,$author,$_SESSION['AID']);
$retSTR .= '<img src="'.$link.'" style="max-width:640px;width:auto;"><br />';
}
# Если есть текст в статье, добавляем в строку
if(isset($retText[1][$i])){$retSTR .= '<br />'.strip_tags($retText[1][$i]).'<br />';}
if(isset($retTextFirst[1][$i])){$retSTR .= '<br />'.strip_tags($retTextFirst[1][$i]).'<br />';}
# Если есть Нумерованный список, добавляем в строку
if(isset($retNum[1][$i])){$retSTR .= '<h2>'.$retNum[1][$i].'</h2>';}
}
Я получил все необходимые данные из статьи, НО, порядок публикации этих элементов я не знаю и собираю строку "на угад". Можно как-то это определять или может подход изначально другой должен быть?