X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

2 страниц V   1 2 >
Открыть тему
Тема закрыта
> Парсер вебархива на php
k0ttee
k0ttee
Topic Starter сообщение 30.10.2014, 22:47; Ответить: k0ttee
Сообщение #1


Допилил парсер чтобы восстанавливать заброшенные сайты из вебархива.

Файл webarchive.php
У него в 1й строке вставляем ссылку на "копию главной в вебархиве". Это со страницы вида
Прикрепленное изображение

И можно запускать...
Если в браузере получаете ошибку по тайм-ауту (выполняться то будет долго) запускайте через терминал.
переходим в каталог с файлом командой cd
Запускаем... На линухе командой php webarchive.php (как на винде - погуглите).

<?php
$target=''; //ссылка на главную в вебархиве
set_time_limit(0);
$domain=preg_replace("#(.*)http://#",null,$target);
$domain=str_replace('/',null,$domain);
$way=preg_replace("#http://$domain(.*)#",null,$target);
function extract_all_links($target,$domain){
    if(@$file=file_get_contents($target)){
        $file=preg_replace("#\r\n#",null,$file);
        $file=preg_replace("#\n\r#",null,$file);
        $file=preg_replace("#\n#",null,$file);
        if(preg_match("#Wayback Machine doesn't have that page archived.#",$file)){
            global $crashed;
            $crashed[]=$target;
            return;
        }
        preg_match_all("/<[Aa][\s]{1}[^>]*[Hh][Rr][Ee][Ff][^=]*=[ '\"\s]*([^ \"'>\s#]+)[^>]*>/",$file,$matches);
        $urls=preg_replace("#(.*)http://#","http://",$matches[1]);
        $urls=array_unique($urls);
        foreach($urls as $url){
          if((preg_match("#".$domain."#",$url)) || (preg_match("#".str_replace('www.',null,$domain)."#",$url))){
            $links[]=$url;
            }
          }
        $links=str_replace('http://'.$domain.'/',null,$links);
        $links=str_replace('http://'.$domain,null,$links);
        $links=str_replace('http://'.str_replace('www.',null,$domain).'/',null,$links);
        $links=str_replace('http://'.str_replace('www.',null,$domain),null,$links);
        $links=array_filter($links);
        $links=implode("\n",$links);
        return $links;
    }else{
    global $crashed;
    $crashed[]=$target;
    return;
    }
}
echo "\n###\n#1#\n###\n";
$site_map1=extract_all_links($target,$domain);
$index=explode("\n",$site_map1);
echo 'ONE='.count($index)."\n";
echo "\n###\n#2#\n###\n";;
foreach($index as $second){
    $site_map2[]=extract_all_links($way.'http://'.$domain.'/'.$second,$domain);
}
$site_map2=implode("\n",$site_map2);
$site_map2=explode("\n",$site_map2);
$site_map2=array_unique($site_map2);
$site_map2=array_filter($site_map2);
$index2=$site_map2;
echo 'TWO='.count($site_map2)."\n";
$end=implode("\n",$index)."\n".implode("\n",$site_map2);
$end=explode("\n",$end);
$end=array_unique($end);
$end=array_filter($end);
file_put_contents('site-map.txt',implode("\n",$end));
if(count($crashed)!=0){
    file_put_contents('crashed-map.txt',implode("\n",$crashed));
}
echo 'CRASHED='.count($crashed)."\n";
?>


Отчетности будет минимум.
Прикрепленное изображение


###
#1#
###

Это значит, идет сбор ссылок с главной страницы.
ONE=118

Количество ссылок на главной.

Далее скрипт проходит по всем (внутрисайтовым) ссылкам с главной.
###
#2#
###

Это значит, пошло посещение внутренних страниц... Процесс может быть до-о-олгим...
TWO=426

Это значит, что на сайте найдено 426 страниц расположенных в двух кликах от главной.

CRASHED=12

Отчет о количестве неоткрывшихся (по разным причинам) страниц.

На выхлопе получаете 2 файла:
site-map.txt со всеми страницами на сайте
crashed-map.txt со списком страниц, которые есть и не смогли быть открыты

Битые страницы можете попытаться открыть руками в браузере и посмотреть в чем отстой.

- - - -

Переходим к файлу rider.php который занимается скачиванием страниц

В 1 строке путь на все ту же главную сайта в веб-архиве.
2 строка - имя файла, из которого брать список ссылок
3 строка - как обозвать файлы: 'name' или 'number' под именами или номерами (под номерами удобнее, если вас интересуют статьи а не сайт целиком).

Файлы сохраняются в папку out (создайте её руками перед запуском).

Код файла rider.php
<?php
$way=''; //ссылка на главную в вебархиве
$all=file('site-map.txt'); //из какого файла брать сипсок
$save='name'; //'name' или 'number' под именами или номерами

$all=preg_replace("#\r\n#",null,$all);
$all=preg_replace("#\n\r#",null,$all);
$all=preg_replace("#\n#",null,$all);

$count_gets=count($all);
echo '0/'.$count_gets."_START\n";
foreach($all as $key => $all){
    $all=preg_replace("#\n\r#",null,$all);$all=preg_replace("#\r\n#",null,$all);$all=preg_replace("#\n#",null,$all);
    if(@$get_page=file_get_contents($way.$all))
    {
        $name=preg_replace("#(.*)/#",null,$all);
        if($save=='name'){
            file_put_contents('out/'.$name,$get_page);
        }
        if($save=='number'){
            file_put_contents('out/'.$key,$get_page);
        }
        echo $key.'/'.$count_gets."_ok\n";
    }else{
        $not_get[]=$way.$all;
        echo $key.'/'.$count_gets."_fail\n";
        continue;
    }
}
file_put_contents('out/index',file_get_contents($way));
echo 'Errors='.count($not_get)."\n";
?>


Отчетность в ходе работы
Прикрепленное изображение

Каждая строка показывает нам "сколько из скольки скачалось или нет"
0/428_START

Php начинает считать с нуля, так что считайте ноль первым номером.
Далее курим бамбук и ждем наблюдая длинный список "ok" или "fail"
В самом конце видим количество не скачавшихся страниц.

Итого

Получаем сайт, где надо: поправить все ссылки, заменить пути к CSS и картинкам (которые можно и не скачивать, а брать прямо с вебархива).
Допиливание для разных сайтов слишком индивидуальное. Поэтому закончим пока на этом.


--------------------
Задонь кибер-коту на крипто-вискас
btc: 3Hq7X9CosVftRFPqWis1Dkk5MdtM1u6jj9
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Aman_sf
Aman_sf
сообщение 30.10.2014, 23:45; Ответить: Aman_sf
Сообщение #2


вебархив некоторые картинки удаляет, а некоторые оставляет. Поэтому иногда там приходится искать свои картинки.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
prolisk
prolisk
сообщение 31.10.2014, 11:37; Ответить: prolisk
Сообщение #3


И главное - все абсолютно бесплатно! :beach:
1. Сколько по времени примерно сканит 100 страниц?
2. Если на линухе запустить 5-10 таких сканеров, систему тупит или нет? (плюс линухи в том, что я запускал много разных задач и она в отличии от виндовса не тупила так)


--------------------
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
k0ttee
k0ttee
Topic Starter сообщение 31.10.2014, 18:03; Ответить: k0ttee
Сообщение #4


вебархив некоторые картинки удаляет, а некоторые оставляет

Это лучше чем ничего, да и выбирать не приходится. Восстановленный сайт все равно идет во всякие сапы, так что картинки не важны - главное восстановить CSS и картинки на главной.
все абсолютно бесплатно

Свободно ≠ бесплатно. За такую бесплатность приходится расплачиваться своим временем.
Сколько по времени примерно сканит 100 страниц?

Вебархив открывается не быстро. Если не устраивает вывод отчетности, можно допилить вывод циферок.
Если на линухе запустить 5-10 таких сканеров, систему тупит или нет?

Смотря как настроено php. Если память утекает, можно и одной ногой в swap попасть. Хотя, по менеджеру процессов памяти ест копейки.
плюс линухи в том, что я запускал много разных задач и она в отличии от виндовса не тупила так

Смотря что и на чем запускать. Прикладные задачи бывают разные.


--------------------
Задонь кибер-коту на крипто-вискас
btc: 3Hq7X9CosVftRFPqWis1Dkk5MdtM1u6jj9
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
webguru77
webguru77
сообщение 23.10.2017, 12:45; Ответить: webguru77
Сообщение #5


k0ttee, как могу с вами связаться? есть вопрос по поводу платной доработки парсера
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
k0ttee
k0ttee
Topic Starter сообщение 23.10.2017, 13:21; Ответить: k0ttee
Сообщение #6


есть вопрос по поводу платной доработки парсера

А разве уже не работает в том виде, который представлен тут?


--------------------
Задонь кибер-коту на крипто-вискас
btc: 3Hq7X9CosVftRFPqWis1Dkk5MdtM1u6jj9
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
webguru77
webguru77
сообщение 23.10.2017, 14:04; Ответить: webguru77
Сообщение #7


(k0ttee)
есть вопрос по поводу платной доработки парсера

А разве уже не работает в том виде, который представлен тут?


Работает, но качает только одну страницу и все. Хотя в логе пишет "ok" для всех страниц из списка для скачивания.

Нужно платно сделать возможность пакетного скачивания, ну то есть циклом. Я в php совсем слаб, сам хз как сделать(

Если можно ваш скайп или почту в лс. Или тут скиньте, свяжусь

Добавлено спустя 3 минуты 54 секунды:
Написал в лс
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
k0ttee
k0ttee
Topic Starter сообщение 5.11.2017, 12:01; Ответить: k0ttee
Сообщение #8


Обновленная версия, собирающая относительные ссылки.
<?php
$target=''; //ссылка на главную в вебархиве, пример http://web.archive.org/web/20150315224128/http://site.ru/

set_time_limit(0);

$domain=preg_replace("#(.*)http://#",null,$target); //выделяю домен
$domain=str_replace('/',null,$domain); //выделяю домен

$way=preg_replace("#http://$domain(.*)#",null,$target); //выделяю путь (начало ссылок в вебархиве)

#функция извлекает все ссылки на странице
function extract_all_links($target,$domain){
    if(@$file=file_get_contents($target)){
        $file=preg_replace("#\r\n#",null,$file);
        $file=preg_replace("#\n\r#",null,$file);
        $file=preg_replace("#\n#",null,$file);
        if(preg_match("#Wayback Machine doesn't have that page archived.#",$file)){
            global $crashed;
            $crashed[]=$target;
            return;
        }
        #нахожу все ссылки
        preg_match_all("/<[Aa][\s]{1}[^>]*[Hh][Rr][Ee][Ff][^=]*=[ '\"\s]*([^ \"'>\s#]+)[^>]*>/",$file,$matches);
        $urls=preg_replace("#(.*)http://#","http://",$matches[1]);

        #убираю из ссылок домен
        $urls=str_replace('http://'.$domain,null,$urls);
        $urls=str_replace('http://www.'.$domain,null,$urls);
        #чищу дубли и пустышки
        $urls=array_unique($urls);
        $urls=array_filter($urls);

        #убираю абсолютные ссылки, начинающиеся с домена отличного от целевого
        foreach($urls as $url){
            if( !preg_match("#http://#",$url) && !preg_match("#https://#",$url) ){
                $url=preg_replace("#^/#", null, $url); //убараю слеш в начале относительной ссылки
                $relative_urls[]=$url; //если нет ни http ни https - складываю в массив относительных ссылок
            }
        }
        
        #чищу дубли и пустышки
        $relative_urls=array_unique($relative_urls);
        $relative_urls=array_filter($relative_urls);
        
        $relative_urls=implode("\n",$relative_urls);
        return $relative_urls;
    }else{
        global $crashed;
        $crashed[]=$target;
        return;
    }
}

#первый проход
echo "\n###\n#1#\n###\n";
$site_map1=extract_all_links($target,$domain);
$index=explode("\n",$site_map1);
echo 'ONE='.count($index)."\n";
echo "\n###\n#2#\n###\n";;
foreach($index as $second){
    $site_map2[]=extract_all_links($way.'http://'.$domain.'/'.$second,$domain);
}
$site_map2=implode("\n",$site_map2);
$site_map2=explode("\n",$site_map2);
$site_map2=array_unique($site_map2);
$site_map2=array_filter($site_map2);
$index2=$site_map2;
echo 'TWO='.count($site_map2)."\n";
$end=implode("\n",$index)."\n".implode("\n",$site_map2);
$end=explode("\n",$end);
$end=array_unique($end);
$end=array_filter($end);
file_put_contents('site-map.txt',implode("\n",$end));
if(count($crashed)!=0){
    file_put_contents('crashed-map.txt',implode("\n",$crashed));
}
echo 'CRASHED='.count($crashed)."\n";
?>


--------------------
Задонь кибер-коту на крипто-вискас
btc: 3Hq7X9CosVftRFPqWis1Dkk5MdtM1u6jj9
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
zverr
zverr
сообщение 30.9.2020, 17:59; Ответить: zverr
Сообщение #9


Виндузятник ничего не понял :blink:


--------------------
Подпись сдается...
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Денчик
Денчик
сообщение 30.9.2020, 21:49; Ответить: Денчик
Сообщение #10


(zverr)
Виндузятник ничего не понял


PHP из под винды тоже запускается. Для этого только софтину нужно соответствующую установить. На это туториалов в сети полно.

А дальше, насколько я понял, вместо строки $target=' ';
прописываешь строку $target='http://web.archive.org/web/20150315224128/http://site.ru/';
Где вместо site.ru прописываешь нужный сайт.
И запускаешь этот скрипт, в соответствующей программе.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
2 страниц V   1 2 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Горячая тема (нет новых ответов) Тема имеет прикрепленные файлыA-Parser 1.1 - продвинутый парсер ПС, кейвордов, контента, показателей, 70+ парсеров.
351 Forbidden 277485 11.3.2024, 13:49
автор: AParser_Support
Горячая тема (нет новых ответов) Восстановление сайтов из Вебархива на Wordpress.
39 freeax 32405 14.2.2024, 14:32
автор: freeax
Открытая тема (нет новых ответов) Бесплатный парсер бот в Телеграм - [Parser Pro]
5 Parser_Pro 3265 27.1.2024, 16:12
автор: Parser_Pro
Открытая тема (нет новых ответов) СОЗДАНИЕ : / САЙтЫ / ЛЕНДЫ / БОТЫ ТГ / ВАЙТЫ / КРЕО / СОФТЫ / ДИЗАЙН [PHP, JS, HTML/CSS] и другое
5 CULA 3244 19.12.2023, 18:55
автор: CULA
Открытая тема (нет новых ответов) Услуги по созданию и доработке скриптов PHP, MySQL, JavaScript, jQuery
Разработка сайтов и сервисов под-ключ
0 alexey 1130 24.11.2023, 14:46
автор: alexey


 



RSS Текстовая версия Сейчас: 19.3.2024, 15:44
Дизайн