Парсер комментариев Zen.Yandex

Албибеков

Постоялец
Заблокирован
Регистрация
24 Июн 2016
Сообщения
35
Реакции
33
Делать нечего было, на самоизоляции, сваял парсерок:
Тестите, авось накривожопил))

PHP:
<?php
header("Content-type: text/html; charset=UTF-8");
if(isset($_GET['url'])){
$urle= $_GET['url'];
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $urle);
curl_setopt($curl, CURLOPT_FAILONERROR, 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36");
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
$html = curl_exec($curl);
curl_close($curl);
$htm = stripslashes($html);
preg_match('/"publication":{"id":"(.*?)","/is', $htm, $native);
preg_match('/"publisherId":"(.*?)","/is', $htm, $pubid);
preg_match('/"ownerUid":(.*?),"/is', $htm, $ownerid);
$count = '1000'; //сколько комментов парсить
$link = 'https://zen.yandex.com/api/comments/top-comments?withUser=true&commentCount='.$count.'&enabledComments=ENABLE&retryNum=0&manualRetry=false&publisherId='.$pubid[1].'&watcherPublisherId=5d9c14783d873600b14f7e79&documentId=native%3A'.$native[1].'&commentId=0&sessionTs=1489183008260&channelOwnerUid='.$ownerid.'&clientTs=1489183008615&rid=5273796512.2292652335.4351298210729428.957695629&withProfile=true';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $link);
curl_setopt($curl, CURLOPT_FAILONERROR, 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36");
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
$rt = curl_exec($curl);
curl_close($curl);
$resultsall = json_decode($rt, true);
if(!function_exists('array_combine_')) {
function array_combine_($keys, $values)
{
$result = [];
foreach ($keys as $i => $k) {
$result[$k][] = $values[$i];
}
array_walk($result, function(&$v) {$v = (count($v) == 1)? array_pop($v): $v;});
return $result;
}
}
$ar=[];
$id=[];
foreach ($resultsall["comments"] as $sf=> $co) {
$ar[]=$co["text"];
$id[]=$co["authorId"];
}
$nm=[];
$wm=[];
foreach ($resultsall["authors"] as $jo => $ke) {
$nm[]=$ke["uid"];
$wm[]=$ke["name"];
}
$hs = array_combine($id, $ar); // соединяем id юзера и его текст
$all = array_combine($nm, $wm); // соединяем id юзера и его имя
$an = array_combine_($hs, $all);
foreach ($an as $z=> $zo) {
// на всяк случай :-)   
//$z = preg_replace('~\b\uD\S*\b~iu', '&#128077;', $z); //замена символов на смайл https://unicode-table.com/ru/sets/hands/
//$z = str_replace(array("\n", "\\"), "", $z);
if (isset($z) and !empty($z)){
print $z.'  <strong>==>  '.$zo.'</strong><br>';
}
}
}
?>
<form action="1.php">
Пример: https://zen.yandex.ru/media/history_russian/kak-aleksandr-pushkin-obrascalsia-so-svoimi-krepostnymi-5eb26d67edf71008373a5d9c
<br>
<strong>Введите ссылку на статью:</strong>
<input type="text" name="url">
<input type="submit" value="OK">
</form>
 
Мини-правка.
дописать чутка
=1489183008260&channelOwnerUid='.$ownerid.'&clientT
на так
=1489183008260&channelOwnerUid='.$ownerid[1].'&clientT
 
Неплохо, но парсит только комменты без обсуждения. Подозреваю что дело в запросе API, но вообщем вполне применимо)
 
Назад
Сверху