рабочий парсер вебархива

D
На сайте с 23.01.2014
Offline
28
1244

пил и решил поделиться,

...хотя хотел поделиться и когда не пил....

код все еще должен быть рабочим...

капчу в процессе не спрашивало ни разу.

в имя домена $domen пишите нужный вам.

запускается с командной строки, типа: php 'имя скрипта'

парсит полностью все что есть,

раскладывает по папкам,

создается имитация знаков вопроса в УРЛ

выслушаю вопросы и предложения по улучшению


<?php

global $domen;
$domen = 'DESIGN-FOR-BUSINESS.RU'; // адрес домена-сайта

$wayback = 'http://wayback.archive.org/web/*/' . $domen . '*'; // шаблон запроса

set_time_limit(0); // таймаут работы скрипта
ini_set('default_socket_timeout', '60'); // Исключаем большие таймауты запросов

$block_query = '<?php
$file_name = basename(__FILE__) . "_";
$query_string = $_SERVER["QUERY_STRING"];
$query_string = urlencode($query_string);

if (!file_exists($file_name . $query_string)) {
if (!file_exists("index.html")) {
header($_SERVER["SERVER_PROTOCOL"] . " 404 Not Found");
exit("Error 404. Page Not Found.");
} else
$query_string = "index.html";
}

$content = file_get_contents($file_name . $query_string);
echo $content;
?>';

if (file_exists('cookies_wayback.txt'))
unlink('cookies_wayback.txt');


echo $wayback . "\n";
if (!$res = download($wayback)) {
echo "Not find!\n";
exit;
}

file_put_contents('wayback.html', $res);
echo date("d.m.y H:i:s") . "\n";
$now = date("YmdHis") . "\n";

preg_match("#<h2 class=\"green\">(.*)</h2>#Usi", $res, $num); // показать количество файлов

echo $num[1] . "\n";

preg_match_all("#<a href=\"/web/query\?q=type\%3Aurlquery\+url\%3A(.*)\">(.*)</a>#Usi", $res, $url_one); // прямые ссылки
preg_match_all("#<a onclick=\"SetAnchorDate\('(.*)'\);\" href=\"/web/(.*)\">(.*)</a>#Usi", $res, $url_multi); // множественные ссылки

echo 'url_one: ' . count($url_one[0]) . "\n";
echo 'url_multi: ' . count($url_multi[0]) . "\n";

$urls = $url_one[2];
$urls = array_merge($urls, $url_multi[3]);
$i = 0;

foreach ($urls as $url) {
$temp_url = str_replace(':80/', '/', $url);

echo (string)$i++ . ' - ' . $temp_url . "\n";

list($dir, $file_name, $query_file, $flag_query) = path_create($temp_url); // разбираем путь

$get_url = 'http://wayback.archive.org/web/' . date("YmdHis") . '/' . $temp_url;

if (!file_exists('./' . $dir))
mkdir('./' . $dir, 0777, true);
else {
if (is_file('./' . $dir)) { // если уже файл создан с именем каталога, то переименовать в index.tmp, создать каталог, и перекинуть в него index.html
rename('./' . $dir, './index.temp');
mkdir('./' . $dir, 0777, true);
rename('./index.temp', './' . $dir . '/index.html');
}
if (file_exists('./' . $dir . '/' . $file_name)) {
if (is_dir('./' . $dir . '/' . $file_name)) { // это на случай если каталог уже создан с таким именем, то файл создается в этом каталоге
$dir = $dir . '/' . $file_name;
$file_name = 'index.html';
} else {
echo "Already saved!!! - " . $get_url . "\n";
continue;
}
}
}

$res = download($get_url);
if (strlen($res) < 10) {
echo "Empty page $get_url \n";
file_put_contents('error_page.txt', "Empty page $get_url \n");
continue;
}
if (strpos('Wayback Machine doesn&apos;t have that page archived.', $res) > 0) {
echo "Not found page $get_url \n";
file_put_contents('error_page.txt', "Not found page $get_url \n");
continue;
}
if (strpos('was not found on this server', $res) > 0) {
echo "Not page $get_url \n";
file_put_contents('error_page.txt', "Not page $get_url \n");
continue;
}

// чистка файла
$res = preg_replace("#<!-- BEGIN WAYBACK TOOLBAR INSERT -->(.*)<!-- END WAYBACK TOOLBAR INSERT -->\n\n#Usi", '', $res);
$res = preg_replace("#<!-- BEGIN WAYBACK TOOLBAR INSERT -->(.*)<!-- END WAYBACK TOOLBAR INSERT -->\n#Usi", '', $res);
$res = preg_replace("#<!-- BEGIN WAYBACK TOOLBAR INSERT -->(.*)<!-- END WAYBACK TOOLBAR INSERT -->#Usi", '', $res);
$res = preg_replace("#/web/\d{14}cs_/#Usi", '', $res);
$res = preg_replace("#/web/\d{14}js_/#Usi", '', $res);
$res = preg_replace("#/web/\d{14}im_/#Usi", '', $res);
$res = preg_replace("#/web/\d{14}if_/#Usi", '', $res);
$res = preg_replace("#/web/\d{14}\*/#Usi", '', $res);
$res = preg_replace("#/web/\d{14}/#Usi", '', $res);

$res = preg_replace("#\n\n\n\n\n<!--\n FILE ARCHIVED ON (.*)-->\n#Usi", '', $res);

if ($flag_query == 1) {
if (!file_exists('./' . $dir . '/' . $query_file))
file_put_contents('./' . $dir . '/' . $query_file, $block_query); // Сохраняем файл РНР для запроса
file_put_contents('./' . $dir . '/' . $file_name, $res); // Сохраняем файл запроса
} else {
file_put_contents('./' . $dir . '/' . $file_name, $res); // Сохраняем файл
}
}
echo "end\n";

function path_create($cache_url)
{
$flag_query = 0;
$query_file = '';
$file_name = 'index.html';

$dir = explode('://', $cache_url, 2); // отбрасываем протокол
if (isset($dir[1]))
$dir = trim($dir[1]);
else
$dir = trim($cache_url);
// $dir = urldecode(urldecode($dir));
//echo ' --- ' . $dir . "\n";

// $dir = iconv('UTF-8', 'CP1251', $dir); // конвертация русских урл

$dir = explode('?', $dir); // получаем текст запроса для имени файла
if (isset($dir[1])) {
$file_name = urlencode(urldecode(trim($dir[1])));
$dir = trim($dir[0]);
$flag_query = 1;
} else
$dir = trim($dir[0]);

if (strrpos($dir, '/') == strlen($dir) - 1) { // получаем имя файла
if ($flag_query == 1) {
$query_file = 'index.php';
$file_name = $query_file . '_' . $file_name;
}
} else {
if ($flag_query == 1) {
$query_file = substr($dir, strrpos($dir, '/') + 1);
$file_name = $query_file . '_' . $file_name;
} else {
$file_name = substr($dir, strrpos($dir, '/') + 1);
}
$dir = substr($dir, 0, strrpos($dir, '/'));
}
/*
echo "DIR - " . $dir . "\n";
echo "FILE NAME - " . $file_name . "\n";
echo "QUERY FILE - " . $query_file . "\n";
echo "FLAG QUERY - " . $flag_query . "\n";
*/
return array($dir, $file_name, $query_file, $flag_query);
}

function download($url)
{
global $domen;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, 'Links (2.3pre1; Linux 2.6.32-5-686-bigmem i686; 197x50)');

curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_MAXREDIRS, 6);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies_wayback.txt'); // куда сохранять
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies_wayback.txt'); // откуда брать

$res = curl_exec($ch);
if(curl_errno($ch)){
echo 'Curl error: ' . curl_error($ch);
}
curl_close($ch);
return $res;
}

?>

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий