Advertisement
Guest User

Untitled

a guest
Jan 7th, 2015
488
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 6.09 KB | None | 0 0
  1. <?php
  2.  
  3. require_once('misc.php');
  4. set_time_limit(0);
  5.  
  6.  
  7. // http://geektimes.ru/post/207962/ + 1
  8. $from = 207963;
  9.  
  10. // http://habrahabr.ru/post/247201/ - 1
  11. $to = 247201;
  12.  
  13.  
  14. if (!file_exists('posts'))
  15. {
  16.     $posts = array();
  17.  
  18.     for ($i = $from; $i < $to; $i++)
  19.     {
  20.         if (file_exists('stop'))
  21.             die('stop');
  22.  
  23.         $url = 'http://habrahabr.ru/post/' . $i . '/';
  24.  
  25.         $data = _get($url);
  26.  
  27.         preg_match('#<span class="post_title">(.*?)</span>#si', $data, $m);
  28.         if ($m)
  29.         {
  30.             $post = array('url' => $url, 'title' => $m[1]);
  31.  
  32.             preg_match_all('#<a href="([^"]+)" class="hub[^>]+>([^<]+)</a>\s*(<span class="profiled_hub"[^>]+)?#si', $data, $m);
  33.  
  34.             foreach ($m[1] as $k=>$v)
  35.             {
  36.                 $hub = array(
  37.                     'url' => $v,
  38.                     'title' => $m[2][$k],
  39.                     'profiled' => $m[3][$k] ? 1 : 0
  40.                 );
  41.  
  42.                 $hubs[$hub['url']] = $hub;
  43.  
  44.                 $post['hubs'][] = $hub;
  45.             }
  46.  
  47.             preg_match('#<div class="infopanel_wrapper">.*?<div class="clear"></div>#si', $data, $ip);
  48.  
  49.             preg_match('#<span class="score"[^>]+>([^<]+)</span>#si', $ip[0], $m);
  50.             $m[1] = htmlentities($m[1], ENT_QUOTES, 'utf-8');
  51.             $post['score'] = (int)str_replace('&ndash;', '-', $m[1]);
  52.  
  53.             preg_match('#<div class="pageviews"[^>]+>(\d+)</div>#si', $ip[0], $m);
  54.             $post['pageviews'] = $m[1];
  55.  
  56.             preg_match('#<div class="favs_count"[^>]+>(\d+)</div>#si', $ip[0], $m);
  57.             $post['favs'] = $m[1];
  58.  
  59.             preg_match('#<span id="comments_count"[^>]*>(\d+)</span>#si', $data, $m);
  60.             $post['comments'] = $m[1];
  61.  
  62.             $posts[] = $post;
  63.  
  64.         }
  65.  
  66.  
  67.  
  68.         file_put_contents('done', $i);
  69.     }
  70.  
  71.     file_put_contents('posts', json_encode($posts));
  72.     file_put_contents('hubs', json_encode($hubs));
  73. }
  74. else
  75. {
  76.     $posts = json_decode(file_get_contents('posts'), true);
  77.     $hubs = json_decode(file_get_contents('hubs'), true);
  78. }
  79.  
  80.  
  81. //p(sizeof($posts));
  82.  
  83. $plus = $minus = array();
  84. foreach ($posts as $k=>$post)
  85. {
  86.     if ($post['score'] > 0)
  87.         $plus[] = $post;
  88.     else
  89.         $minus[] = $post;
  90. }
  91.  
  92.  
  93. usort($plus, '_compare_posts_plus');
  94. $top = array_slice($plus, 0, 20);
  95.  
  96. usort($minus, '_compare_posts_minus');
  97. $minus = array_slice($minus, 0, 10);
  98.  
  99.  
  100. usort($plus, '_compare_posts');
  101. $rating = $misc = array();
  102. foreach ($plus as $post)
  103. {
  104.     $hub = $post['hubs'][0];
  105.  
  106.     if (sizeof($rating[$hub['title']]) < 15 && $post['score'] >= 20)
  107.         $rating[$hub['title']][] = $post;
  108. }
  109.  
  110. ksort($rating);
  111. foreach ($rating as $title=>$posts)
  112. {
  113.     if (sizeof($posts) < 10)
  114.     {
  115.         foreach ($posts as $post)
  116.             $misc[] = $post;
  117.  
  118.         unset($rating[$title]);
  119.     }
  120. }
  121.  
  122.  
  123. usort($misc, '_compare_posts_plus');
  124. $misc = array_slice($misc, 0, 30);
  125.  
  126.  
  127.  
  128. function _compare_posts($a, $b)
  129. {
  130.     $ra = $a['score'] * 5 + $a['favs'] * 2 + $a['comments'];
  131.     $rb = $b['score'] * 5 + $b['favs'] * 2 + $b['comments'];
  132.  
  133.     if ($ra == $rb)
  134.         return 0;
  135.  
  136.     return $ra > $rb ? -1 : 1;
  137. }
  138.  
  139.  
  140. function _compare_posts_minus($a, $b)
  141. {
  142.     if ($a['score'] == $b['score'])
  143.         return 0;
  144.  
  145.     return $a['score'] > $b['score'] ? 1 : -1;
  146. }
  147.  
  148.  
  149. function _compare_posts_plus($a, $b)
  150. {
  151.     if ($a['score'] == $b['score'])
  152.         return 0;
  153.  
  154.     return $a['score'] > $b['score'] ? -1 : 1;
  155. }
  156.  
  157.  
  158.  
  159.  
  160. ?>
  161. <h2>Топовые посты</h2>
  162. <br />
  163. Эти посты были наиболее популярны, судя по количеству плюсов. Особенно зацепил редизайн Хабра.
  164. <br />
  165. <? foreach ($top as $i => $post): ?>
  166.     <br /><?= ($i + 1); ?>. <a href="<?= $post['url']; ?>"><?= $post['title']; ?></a>
  167.     <sup>(<?= $post['score']; ?> / <?= $post['favs']; ?> / <?= $post['comments']; ?> / <?= $post['pageviews']; ?>)</sup>
  168. <? endforeach; ?>
  169.  
  170. <br /><br />
  171. <h2>Фатальные посты</h2>
  172. <br />
  173. А вот такое, как показалось Хабру, лучше здесь не писать. По заголовками оценить сложно, нужно смотреть сам пост и его комментарии.
  174. <br />
  175. <? foreach ($minus as $i => $post): ?>
  176.     <br /><?= ($i + 1); ?>. <a href="<?= $post['url']; ?>"><?= $post['title']; ?></a>
  177.     <sup>(<?= $post['score']; ?> / <?= $post['favs']; ?> / <?= $post['comments']; ?> / <?= $post['pageviews']; ?>)</sup>
  178. <? endforeach; ?>
  179.  
  180. <br /><br />
  181.  
  182.  
  183. <h2>Интересные посты</h2>
  184. <br />
  185. Эти публикации чаще всего плюсовали, добавляли в избранное и комментировали. В основном, учитывалось количество добавлений в избранное. В скобках рейтинг/в избранном/комментарии/просмотры. Записей много, даже если только ТОП5, поэтому <b>искать желаемый хаб лучше браузерным поиском</b>. Если хаб не найдет, то в нем было меньше 10 постов с рейтингом +20 и более. Критерии отсева взяты, можно считать, с потолка. Показалось, что это еще не популярные хабы. Среди постов, которые не попали под эти условия, в конце списка есть рейтинг "Разное" по количеству плюсов.
  186.  
  187.  
  188. <? foreach ($rating as $hub=>$posts): ?>
  189.     <br /><br />
  190.     <strong><?= $hub; ?></strong>
  191.     <br />
  192.     <? foreach ($posts as $i => $post): ?>
  193.         <?= ($i + 1); ?>. <a href="<?= $post['url']; ?>"><?= $post['title']; ?></a>
  194.         <sup>(<?= $post['score']; ?> / <?= $post['favs']; ?> / <?= $post['comments']; ?> / <?= $post['pageviews']; ?>)</sup>
  195.         <br />
  196.  
  197.         <? if ($i == 2): ?>
  198.             <spoiler title="Продолжение">
  199.         <? endif; ?>
  200.     <? endforeach; ?>
  201.             </spoiler>
  202. <? endforeach; ?>
  203.  
  204.  
  205. <br /><br />
  206. <h2>Разное</h2>
  207. <br />
  208. Здесь топ по плюсам из всех хабов, которые не попали в группировки интересных постов.
  209. <br />
  210. <? foreach ($misc as $i => $post): ?>
  211.     <br /><?= ($i + 1); ?>. <a href="<?= $post['url']; ?>"><?= $post['title']; ?></a>
  212.     <sup>(<?= $post['score']; ?> / <?= $post['favs']; ?> / <?= $post['comments']; ?> / <?= $post['pageviews']; ?>)</sup>
  213. <? endforeach; ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement