Ежедневный Дамп базы сайтов сервиса комплексного анализа

Автор Sevab, 30-05-2015, 02:16:22

« назад - далее »

SevabTopic starter

Друзья, наверное многие из вас знают он нашем сервисе комплексного анализа, а также об АПИ, разработанным на его основе, для получения информации по определенным сайтам.
Там дается выборка данных по запрашиваемым сайтам. В итоге по 9 параметрам для каждого сайта.
Всего этих параметров несколько сотен, но эти девять основные.

Теперь необходимость в API сервиса отпала (наверное скоро будет закрыт), т.к. мы решили делать ежедневный дамп базы данных комплексного анализа по тем же характеристикам, как и в АПИ.

У кого может быть потребность в таких данных?
1) У сервисов, в которых сайты ранжируются в зависимости от их характеристик. Например каталоги.
2) Всевозможные биржи ссылок, где есть возможность выбора и сортировки сайтов, в зависимости от их показателей.
3) Софт, использующий подобные данные.

Теперь нет необходимости обращаться к нам за доступом к API, а также получать в других источниках подобную информацию за деньги.
Скачивайте полные свежие данные, и пользуйтесь ими.

Скачать свежую версию основных характеристик сайта по слетающему адресу:
http://www.sbup.com/ratings/гггг/мм/дд.txt.gz

Где "гггг" - год четырехзначным числом, "мм" - месяц двузначным числом, "дд" - день двузначным числом.
Например для сегодняшнего дня (30 мая, 2015 года) ссылка будет:
http://www.sbup.com/ratings/2015/05/30.txt.gz

Т.е. если вам нужна самая свежая версия, в которой находятся как обновленные данные по проверенным за сутки старым (уже находящихся в базе) сайтам, так и характеристики вновь добавленных ресурсов. При наличии более старых архивов, можно скачать и их.
Данные находятся в gzip архиве, который создается ежедневно в 5 утра по Москве. Т.е. после 5 утра можно скачивать свежую версию.

Скачивать можно как обычным образом (напр. через браузер), так и программным, в том числе по крону.
В архиве находится текстовый файл, в котором расположены основные характеристики сайтов, разделенные табуляцией. См. рис. ниже:



1 столбец - Домен.
2 столбец - PageRank.
3 столбец - Реальный PageRank.
4 столбец - TrustRank.
5 столбец - YandexRank.
6 столбец - Яндекс тИЦ.
7 столбец - Стоимость сайта.
8 столбец - Alexa Rank.
9 столбец - Этот параметр важен только для поддоменов. Если у поддомена алекса рейтинг отличен (редкий случай) от вышестоящего домена, то значение будет 1, иначе 0. Т.е. если значение этого параметра 1, то алекса реальный, если ноль, то рейтинг алексы можно не учитывать.
10 столбец - Заспамленность сайта, в процентах. Обращу внимание, что здесь значение 101 означает, что заспамленность не определена (N/A), т.е. недостаточно данных.

Что делать с этими данными?
По вашему усмотрению, но для начала вероятно их либо нужно поместить в базу данных, либо пользоваться самим файлом как базой данных. Рассмотрим для примера оба варианта.

1) Помещаем в базу данных.
Специально скрипт писать не стал, приведу пример подобного скрипта, который извлекает данные из подобного файла, где показатели также разделены табуляцей:


<?php
ob_start
("ob_gzhandler");
set_time_limit(3000); // указываем, чтобы скрипт не ограничивался временем по умолчанию
ignore_user_abort(1); // указываем, чтобы скрипт продолжал работать даже при разрыве
ini_set("display_errors","1");

// настройки для подключения к БД
$SERVER 'localhost';
$DB_NAME 'test_db'// название ВАШЕЙ базы данных
$DB_USER 'fdrerwew'// имя пользователя ВАШЕЙ бд
$DB_PASS 'luoogrtur'// пароль от ВАШЕЙ бд



// Соединяемся с базой данных
// авторизация на сервере базы
if (!($db mysql_pconnect($SERVER$DB_USER$DB_PASS)))
{
    echo 
"Нет соединения с сервером базы<br />*проверьте параметры подключения";
    exit;
}
// подключение к базе
if (!mysql_select_db($DB_NAME$db))
{
    echo 
"База даных не найдена<br />*проверьте, существует ли данная база";
    exit;
}
mysql_query('set charset utf8'$db);
mysql_query('SET names utf8'$db);
mysql_query('set character_set_client="utf8"'$db);
mysql_query('set character_set_connection="utf8"'$db);
mysql_query('set character_set_result="utf8"'$db);



// проверяем наличие файла cities.txt в папке рядом с этим скриптом
if(file_exists('cities.txt'))
{
    
mysql_query("TRUNCATE TABLE `geo__cities`"); // очищаем таблицу перед импортом актуальных данных
    
$file file('cities.txt');
    
$pattern '#(\d+)\s+(.*?)\t+(.*?)\t+(.*?)\t+(.*?)\s+(.*)#';
    foreach (
$file as $row)
    {
        
$row iconv('windows-1251''utf-8'$row);
        if(
preg_match($pattern$row$out))
        {
            
mysql_query("REPLACE INTO `geo__cities` (`city_id`, `city`, `region`, `district`, `lat`, `lng`) VALUES('$out[1]', '$out[2]', '$out[3]', '$out[4]', '$out[5]', '$out[6]')");
        }        
    }   
    echo 
mysql_error(); 
}else
{
    echo 
'Ошибка! Файл cities.txt должен лежать рядом с этим файлом!';
}

// проверяем наличие файла cidr_optim.txt в папке рядом с этим скриптом
if(file_exists('cidr_optim.txt'))
{
    
mysql_query("TRUNCATE TABLE `geo__base`"); // очищаем таблицу перед импортом актуальных данных

    
$file file('cidr_optim.txt');
    
$pattern '#(\d+)\s+(\d+)\s+(\d+\.\d+\.\d+\.\d+)\s+-\s+(\d+\.\d+\.\d+\.\d+)\s+(\w+)\s+(\d+|-)#';
    foreach (
$file as $row)
    {
        if(
preg_match($pattern$row$out))
        {
            
mysql_query("REPLACE INTO `geo__base` (`long_ip1`, `long_ip2`, `ip1`, `ip2`, `country`, `city_id`) VALUES('$out[1]', '$out[2]', '$out[3]', '$out[4]', '$out[5]', '$out[6]')");
        }        
    }
    echo 
mysql_error();
}else
{
    echo 
'Ошибка! Файл cidr_optim.txt должен лежать рядом с этим файлом!';
}


?>



Обращу лишь внимание, что в примере выше используется функция file(), которая целиком считывает файл в массив. Дело в том, что файл у нас слишком большой, и иногда может не хватить установленной по умолчанию памяти.
В этом случае нужно будет либо увеличить память для исполняемого скрипта (ini_set('memory_limit', '1024M')), либо считывать файл построчно (fgets()).
Либо разделять файл на несколько более мелких.


2) Работаем напрямую с файлом:
Не буду перечислять всех способов (надеюсь, кому нужен наш дамп, сами смогут с этим справиться), дам лишь ссылку на статью Как правильно читать файлы с помощью PHP, также напомню про функции strpos, strstr, preg_match и связку функций list-explode для разделения найденной строки на переменные (разделитель в строке у нас табуляция - "\t").

Не забываем, что файл с данными у нас очень большой, и могут возникнуть проблемы с памятью при чтении. Решение этих проблем я привел в конце предыдущего пункта №1.

--------------------

Еще один момент: имена доменов у нас в ASCII формате. Если вы ищите домен в IDNA формате (напр. президент.рф), то вам его сначала нужно перевести в ASCII формат (т.к. он в таком виде находится в базе данных). Для php для этого есть замечательный класс idna-convert.


Также хочу обратить внимание, что если вы используете наши данные на своем сайте или в программном продукте, то где-то (отдельная страница или пояснительный текст) должно быть пояснение откуда берутся эти данные. В любом случае ваши пользователи будут вас спрашивать, так что лучше сразу об этом подумать.


Жду ваши замечания и предложения по описанному выше.

-----------

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


Clever

Полезное нововведение, Игорь респект, уже обдумываю реализацию на новом сайте.
Дамп сохраняется из текущего состояния БД на тот момент в 5мск, значит новый сайт проверенный в 4.30 по мск тоже попадет в дамп, я правильно понимаю?


SevabTopic starter

Цитата: Roffun от 12-06-2015, 16:20:28сайт проверенный в 4.30 по мск тоже попадет в дамп, я правильно понимаю?

Да, правильно.