[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Пишем парсер статей (парсер разделов- постраничка)
Страницы: 1, 2
Игорь_Vasinsky
Пишем сложный парсер статей (разделы, постраничка)
Задача данной статьи ознокомить Вас с алгоритмом сложного парсинга и осветить всю эту задачу с технической стороны, для обработки полученных данных будем использовать не только регулярные выражение, но и попробуем получить опыт по работе с Simple HTML Dom

Статья ориентирована на программистов, которые имеют уже достаточно-хороший опыт программирования на PHP.

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

При этом по окончанию - мы получим статическую страницу с меню, в котором будут как ссылки на локальную версию материала, так и на оригиналы в интернете.

Итак:

Объект: http://secretworlds.ru/publ/33-1-0-6045 (справа - меню "Разделы")
Задачи:
  • Построение аналогичного меню навигации
  • Парсинг разделов меню
  • Парсинг статей отдельных разделов
  • Создание файлов в отдельной директории нашего сайта с последующим сохранением материала в виде html страниц.
Сразу хочу предупредить: сайт-донор имеет не хитрую защиту от DDOS атак, поэтому очень легко получить бан по IP адресу, именно поэтому будем юзать multi_curl() со списком прокси серверов.

Вооружение:
  • Класс мультикурла
  • Файл со списком прокси-серверов с портами
  • Функция транслита (для создания имён файлов по заголовку материала)
  • SIMPLE HTML DOM
Ожидаемый результат: Получить статическую версию сайта (с навигацией), с материалом с сайта-донора

Итак, начнём:

Файл с адресами прокси-серверов proxi.txt (для своих опытов-список придётся обновить, часть прокси может не работать)
Свернутый текст
93.153.167.152:8080
195.96.85.61:8080
108.67.222.29:3128
108.41.50.99:6515
107.21.104.252:80
107.22.253.43:80
107.21.125.86:80
107.10.230.215:6515
101.44.1.110:80
101.44.1.109:80
216.155.139.115:3128
193.138.185.51:3128
91.202.144.77:80
109.251.143.22:8080
80.64.80.78:3128
80.91.180.66:8080
82.207.109.251:3128
88.81.235.214:8080
195.85.214.7:3128
91.202.144.77:8080
62.149.25.80:45848
91.214.48.38:3128
195.138.88.105:3128
195.24.142.166:3128
213.160.143.150:3128
190.144.186.170:3128
82.222.19.54:8080
49.156.158.4:8080
221.122.53.228:3128
187.49.121.21:8080
180.244.208.185:8080
212.182.64.86:3128
119.97.146.152:80
91.200.157.254:8080
173.22.47.106:25557
27.2.0.3:1080
41.66.193.117:1080
66.252.152.157:18454
68.185.247.125:1565
61.163.240.1:1080
62.243.224.180:1080
220.113.15.21:1080
194.0.229.54:9050
187.45.218.216:1080
218.104.55.28:1080
218.200.181.52:1080
219.223.252.137:1080
218.91.154.201:1080
27.2.0.5:1080
218.26.170.196:1080
50.22.88.81:3128
174.139.255.196:80
97.81.243.127:8080
67.227.162.188:3128
184.173.123.109:80
64.6.43.63:3128
75.101.244.39:8123
206.53.155.129:3128
74.86.121.229:3128
71.63.104.189:36081
4.79.231.188:1000
174.126.164.160:6515
64.152.0.215:81
64.152.0.217:81
198.164.129.13:80
86.120.31.185:80
217.28.177.58:8080
31.25.137.202:80
109.160.76.32:3128
190.144.92.42:3128
93.184.13.76:8080
210.43.128.18:3128
81.198.69.63:8080
89.35.78.126:8080
173.243.93.138:8080
114.255.217.10:1080
112.197.8.7:1080
112.197.8.24:1080
112.197.8.19:1080
108.38.161.46:1644
180.211.91.226:8082
190.241.116.2:8080
46.19.136.200:8080
190.253.213.196:3128
190.90.36.191:8000
201.72.195.70:3128
62.5.177.84:3128
187.108.236.3:3128
190.85.33.179:3129
210.0.205.70:80
202.77.107.35:3128
59.57.15.195:80
84.41.105.1:8080
187.32.81.130:8080
202.57.4.30:8080
117.79.237.91:8080
93.184.13.74:8080
77.245.210.161:3128
84.204.195.156:3128
41.75.201.146:3128
210.23.70.87:80
89.143.12.77:8088
49.156.158.17:8080
89.216.53.65:8080
186.225.106.150:3128
217.28.177.58:80
190.98.248.114:80
114.112.63.37:8080
61.135.208.184:80
122.97.252.95:8080
190.121.135.179:8080
119.160.192.121:8080
89.121.242.246:3128
212.55.225.162:8080
218.201.159.130:8080
180.149.253.185:3128
85.195.96.141:8080
85.248.233.10:8080
184.107.108.42:3128
82.117.198.198:8080
111.1.33.138:80
122.72.21.151:80
186.42.212.234:3128
217.147.231.50:3128
222.124.207.26:8080
82.222.49.81:8080
186.201.169.177:8080
217.96.70.150:8080
217.96.70.146:8080
212.36.221.35:80
67.158.59.64:1728
200.29.238.228:80
186.46.91.90:80
213.187.113.127:8080
188.247.133.186:80
210.19.8.218:8080
58.64.193.174:6666
223.4.21.108:80
180.139.139.13:8080
72.159.131.3:554
50.57.152.132:80
116.247.78.34:80
163.30.176.9:8080
42.83.47.5:8080
76.180.218.142:6515
24.18.132.63:6515
24.61.56.55:6515
186.201.111.34:8080
71.85.208.67:6515
201.213.42.251:8080
72.28.184.129:6515
98.196.221.242:6515
200.11.228.189:3128
178.20.151.242:8080
219.95.233.114:8080
202.67.13.86:8080
88.202.124.121:8080
69.133.123.14:6515
80.63.56.147:1080
200.161.103.213:8080
218.22.80.61:3128
202.67.13.85:3128
201.25.100.210:8080
70.171.71.157:36081
218.28.235.42:3128
81.223.49.107:8080
88.191.148.142:8888
58.67.147.198:8080
77.105.45.59:8080
190.37.110.206:8080
180.241.26.76:8080
118.96.148.17:8080
186.192.240.194:3128
125.162.171.51:8080
81.223.49.99:8080
85.72.35.240:8080
125.162.171.51:8080
85.15.46.243:8080
200.75.51.148:8080
200.107.148.138:3128
175.41.226.140:443
219.122.44.250:3128
122.152.183.180:80
106.187.36.30:80
67.177.183.103:4049
223.255.165.37:8080
61.54.26.44:80
117.79.235.94:80
61.164.40.37:3128
109.191.240.175:3128
85.214.248.178:8080
187.58.200.182:80
41.189.36.26:3128
221.134.198.15:80
88.131.82.241:3128
189.112.189.28:3128
212.119.71.201:80
41.209.22.92:8080
62.14.253.27:3128
27.2.0.49:808
218.106.183.140:808
190.226.225.16:8080
61.54.26.43:80
95.65.27.202:3128
189.14.204.202:8080
200.46.123.194:8080
93.166.121.107:8118
112.197.8.24:808
151.1.216.176:80
79.170.50.25:80
203.66.83.46:8080
202.185.32.12:8080
222.88.95.66:8080
182.163.72.148:8080
221.12.38.135:808
210.22.153.98:3128
221.132.90.104:80
77.92.157.60:8080
196.29.220.154:6588
61.141.21.34:8080
201.88.250.83:808
201.213.78.43:8080
182.71.162.27:3128
118.98.19.98:8080
132.248.97.213:8080
61.35.191.250:8080
195.222.83.75:3128
193.111.244.21:8118
210.61.102.243:808
119.167.245.38:8080
190.255.49.38:6588
60.216.101.232:808
178.219.243.114:3128
60.213.44.50:3128
202.46.149.66:3128
46.36.109.10:3128
112.197.8.7:808
201.65.255.34:8080
202.107.44.108:8080
202.57.1.109:8080
27.2.0.27:808
67.165.64.84:36081
69.138.40.86:36081
190.196.19.28:3128
190.182.18.109:3128
103.22.248.99:3128
98.242.143.193:6515
182.23.38.70:8080
201.47.80.167:3128
113.43.162.61:81
176.9.1.72:80
91.143.80.6:8080
213.27.233.181:80
59.125.82.23:8080
96.18.18.8:36081
221.122.69.70:8080
85.214.84.104:8080
190.5.124.163:3128
217.15.117.58:3128
92.47.180.18:3128
222.88.95.66:80
200.52.196.123:8080
196.1.178.254:3128
82.103.117.185:3128
211.157.227.84:81
82.165.143.89:80
46.51.224.252:9999
46.49.81.17:3128
200.46.3.223:3128
175.139.169.245:80
74.195.219.21:36081
196.220.96.14:80
211.140.189.244:80
91.183.109.156:8080
177.19.134.66:8080

Класс мультикурла class.mcurl.php
Свернутый текст
<?php
/**
$urls = array("
http://site.com/page1.php","http://site.com/page2.php","ht&# 116;p://site.com/page3.php");
$mcurl = new MCurl;
$mcurl->threads = 20;
$mcurl->timeout = 5;
$mcurl->proxy = file("proxi.txt");
unset($results);
$mcurl->multiget($urls, $results);
// в массиве $results - контент страниц
*/


class MCurl
{

var $timeout = 2000; // максимальное время загрузки страницы в секундах
var $threads = 60; // количество потоков
var $proxy = array();

var $all_useragents = array(
"Opera/9.23 (Windows NT 5.1; U; ru)",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.8) Gecko/20071008 Firefox/2.0.0.4;MEGAUPLOAD 1.0",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; Alexa Toolbar; MEGAUPLOAD 2.0; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7;MEGAUPLOAD 1.0",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; MyIE2; Maxthon)",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; MyIE2; Maxthon)",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; MyIE2; Maxthon)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64; Maxthon; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; Media Center PC 5.0; InfoPath.1)",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; MyIE2; Maxthon)",
"Opera/9.10 (Windows NT 5.1; U; ru)",
"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1; aggregator:Tailrank; http://tailrank.com/robot) Gecko/20021130",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.8) Gecko/20071008 Firefox/2.0.0.8",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; MyIE2; Maxthon)",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.8) Gecko/20071008 Firefox/2.0.0.8",
"Opera/9.22 (Windows NT 6.0; U; ru)",
"Opera/9.22 (Windows NT 6.0; U; ru)",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.8) Gecko/20071008 Firefox/2.0.0.8",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MRSPUTNIK 1, 8, 0, 17 HW; MRA 4.10 (build 01952); .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9"
);

function multiget($urls, &$result)
{
$threads = $this->threads;
$useragent = $this->all_useragents[array_rand($this->all_useragents)];

$i = 0;

for($i=0;$i<count($urls);$i=$i+$threads)
{
$urls_pack[] = array_slice($urls, $i, $threads);
}
foreach($urls_pack as $pack)
{
$mh = curl_multi_init(); unset($conn);

foreach ($pack as $i => $url)
{
$conn[$i]=curl_init(trim($url));

curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER, 1);
curl_setopt($conn[$i],CURLOPT_TIMEOUT, $this->timeout);
curl_setopt($conn[$i],CURLOPT_USERAGENT, $useragent);
curl_setopt($conn[$i], CURLOPT_PROXY, $this->proxy[array_rand($this->proxy)]);
curl_multi_add_handle ($mh,$conn[$i]);
}

do { $n=curl_multi_exec($mh,$active); usleep(100); } while ($active);

foreach ($pack as $i => $url)
{
$result[]=curl_multi_getcontent($conn[$i]);
curl_close($conn[$i]);
}

curl_multi_close($mh);
}

}
}

?>

Функция транслитации func.translit.php
Свернутый текст
<?php
/**
* transliterate text
*
*
@param string $text
*
@return string
*/


function translit($text) {
$trans = array(
"а" => "a",
"б" => "b",
"в" => "v",
"г" => "g",
"д" => "d",
"е" => "e",
"ё" => "e",
"ж" => "zh",
"з" => "z",
"и" => "i",
"й" => "y",
"к" => "k",
"л" => "l",
"м" => "m",
"н" => "n",
"о" => "o",
"п" => "p",
"р" => "r",
"с" => "s",
"т" => "t",
"у" => "u",
"ф" => "f",
"х" => "kh",
"ц" => "ts",
"ч" => "ch",
"ш" => "sh",
"щ" => "shch",
"ы" => "y",
"э" => "e",
"ю" => "yu",
"я" => "ya",
"А" => "A",
"Б" => "B",
"В" => "V",
"Г" => "G",
"Д" => "D",
"Е" => "E",
"Ё" => "E",
"Ж" => "Zh",
"З" => "Z",
"И" => "I",
"Й" => "Y",
"К" => "K",
"Л" => "L",
"М" => "M",
"Н" => "N",
"О" => "O",
"П" => "P",
"Р" => "R",
"С" => "S",
"Т" => "T",
"У" => "U",
"Ф" => "F",
"Х" => "Kh",
"Ц" => "Ts",
"Ч" => "Ch",
"Ш" => "Sh",
"Щ" => "Shch",
"Ы" => "Y",
"Э" => "E",
"Ю" => "Yu",
"Я" => "Ya",
"ь" => "",
"Ь" => "",
"ъ" => "",
"Ъ" => "",
" " => "_"
);
if(preg_match("/[а-яА-Я]/", $text)) {
return strtr($text, $trans);
}
else {
return $text;
}

}

?>


Подключаем всё необходимое

 //Установим кодировку
header("Content-type: text/html; charset=utf-8");
//Снимим лимит для выполнения работы скрипта
set_time_limit(0);
include "./class.mcurl.php";
include "./func.translit.php";
include "shd/simple_html_dom.php";


ПОЛУЧАЕМ МЕНЮ САЙТА С ИНТЕРЕСУЮЩИМИ НАС РАЗДЕЛАМИ

Используем наш класс с мультикурлом (раз уж он у нас есть) для получения контента странички с
 //Массив со список прокси
$proxi = file('proxi.txt');
//Передадим массив ссылок для последущего парсинга с них данных (не важно, что ссылка всего одна)
$urls = array("http://secretworlds.ru/publ/33-1-0-6045");
//Инициализация объекта класса
$mcurl = new MCurl;
//Кол-во каналов для курла
$mcurl->threads = 1;
//Тайм аут между попытками получения данных
$mcurl->timeout = 5;
//Используем наш список прокси
$mcurl->proxy = $proxi;
//Рабтаем с методом класса - указали url-ы, в $result - массив с полученным контентом
$mcurl->multiget($urls, $results);

ТЕПЕРЬ СТРАНИЧКА У НАС в $result[0];
Получим блок меню
 preg_match("#<table border=\"0\" cellspacing=\"1\" cellpadding=\"0\" width\=\"100%\" class\=\"catsTable\">(.+)</table>#iusU", $results[0], $menu);
#echo '<pre>' . print_r($menu[1], 1) . '</pre>';

на выходе таком массив, ввиде ссылок, просто тут вы не увидите, и в 0 элементе ещё всякий мусор, по этому мы будем использовать элемент массива с индексом - 1
Свернутый текст
Array
(
[0] =>
Славянская мифология [45] Мифы Северной Европы [72]
Мифология древнего Рима [12] Мифы и легенды Египта [45]
Мифология Азии и Ирана [28] Мифы и легенды Индостана [66]
Мифы и легенды Греции [162] Легенды и мифы Крыма [89]
Японская мифология [21] Мифы ацтеков и майя [23]
Бразильские мифы [19] Легенды белых поселенцев Америки [15]
Мифы бушменов [40] Мифы народов Океании [17]
Легенды Австралии [13] Мифы Израиля [14]
Кетские мифы и легенды [40] Татарские легенды [10]
Китайская мифология [24]

[1] => Славянская мифология [45]Мифы Северной Европы [72]Мифология древнего Рима [12]Мифы и легенды Египта [45]Мифология Азии и Ирана... ... ...
)

Получим кол-во материала в разделе, чтоб потом вывести в своём меню для наглядности о кол-ве материала в разделе
 preg_match_all("#\[\d+\]<\/span>#ius", $results[0], $counts); 
#echo '<pre>' . print_r($counts[0], 1) . '</pre>';

массив такого вида
Свернутый текст
Array
(
[0] => [45]
[1] => [72]
[2] => [12]
[3] => [45]
[4] => [28]
[5] => [66]
[6] => [162]
[7] => [89]
[8] => [21]
[9] => [23]
[10] => [19]
[11] => [15]
[12] => [40]
[13] => [17]
[14] => [13]
[15] => [14]
[16] => [40]
[17] => [10]
[18] => [24]
)

Сформируем своё меню, для этого мы используем SHD и из полученного ранее меню вытащим названия и ссылки разделов, сформируем массивы
 //Полная инструкция по работе с Simple HTML Dom на http://simplehtmldom.sourceforge.net/manual.htm
//Сам я стараюсь избежать использование этой библии, т.к. она кушает много ресурсов, но для многосторонности решений решил показать её применение,
//т.е. просто для наглядности, на скромном примере))
//Создадим DOM из полученного контента блока меню

$html = str_get_html($menu[1]);
$menus = $html->find('a');
//Получим ссылки на разделы
foreach($menus as $link)
{
$links[] = $link->href;
}
#echo '<pre>' . print_r($links, 1) . '</pre>';

Такой вот массив
Свернутый текст
Array
(
[0] => http://secretworlds.ru/publ/33
[1] => http://secretworlds.ru/publ/34
[2] => http://secretworlds.ru/publ/35
[3] => http://secretworlds.ru/publ/36
[4] => http://secretworlds.ru/publ/37
[5] => http://secretworlds.ru/publ/38
[6] => http://secretworlds.ru/publ/39
[7] => http://secretworlds.ru/publ/51
[8] => http://secretworlds.ru/publ/53
[9] => http://secretworlds.ru/publ/54
[10] => http://secretworlds.ru/publ/62
[11] => http://secretworlds.ru/publ/63
[12] => http://secretworlds.ru/publ/64
[13] => http://secretworlds.ru/publ/65
[14] => http://secretworlds.ru/publ/66
[15] => http://secretworlds.ru/publ/67
[16] => http://secretworlds.ru/publ/68
[17] => http://secretworlds.ru/publ/69
[18] => http://secretworlds.ru/publ/70
)


//Получим имена разделов из ссылок
foreach($menus as $name)
{
$names[] = $name->innertext;
}
#echo '<pre>' . print_r($names, 1) . '</pre>';

такой вот массив
Свернутый текст
Array
(
[0] => Славянская мифология
[1] => Мифы Северной Европы
[2] => Мифология древнего Рима
[3] => Мифы и легенды Египта
[4] => Мифология Азии и Ирана
[5] => Мифы и легенды Индостана
[6] => Мифы и легенды Греции
[7] => Легенды и мифы Крыма
[8] => Японская мифология
[9] => Мифы ацтеков и майя
[10] => Бразильские мифы
[11] => Легенды белых поселенцев Америки
[12] => Мифы бушменов
[13] => Мифы народов Океании
[14] => Легенды Австралии
[15] => Мифы Израиля
[16] => Кетские мифы и легенды
[17] => Татарские легенды
[18] => Китайская мифология
)


Теперь нам необходимо узнать сколько страниц в разделе.
Т.к. общее кол-во материалов в разделах нам уже известно ($counts[0]), нам остаётся пройти в раздел в котором максимальное кол-во материала и внизу посмотреть сколько материала размещено на одной страницы раздела.
Например в разделе http://secretworlds.ru/publ/51 внизу видно 1-50 51-89, значит на странице размещено от 1 до 50 ссылок на материал, нам остаётся подсчитать сколько страниц.

Очень просто - кол-во материала разделить на кол-во материала на одной странице и округлить в большую сторону

в массиве $counts[0] кол-во содержится данные в виде [74], вырежем скобки и произведём не хитрую математическую операцию

 foreach($counts[0] as $count)
{
$pages[] = ceil(str_replace(array('[', ']</span>'), array('', ''), $count)/50);
}
#echo '<pre>' . print_r($pages, 1) . '</pre>';


Получили кол-во страниц в разделах в массив $pages, такого вида
Свернутый текст
[/code]Array
(
[0] => 1
[1] => 2
[2] => 1
[3] => 1
[4] => 1
[5] => 2
[6] => 4
[7] => 2
[8] => 1
[9] => 1
[10] => 1
[11] => 1
[12] => 1
[13] => 1
[14] => 1
[15] => 1
[16] => 1
[17] => 1
[18] => 1
)[/code]


На данный момент мы уже имеем:
  • названия разделов
  • ссылки на разделы
  • кол-во материала в разделах
  • кол-во страниц в разделах
Теперь нам нужно сформировать ссылки на все страницы разделов, этот сайт работает с включенным ЧПУ - нам нужно пройти в раздел где больше одной страницы и увидеть как изменяется урл. И визуально не видно как изменяется URL страниц раздела т.к. разрработчик организовал работу постранички на AJAX.

Мы не будем расстраиваться, посмотрим исходный код в месте где расположена навигация постранички:
<a class="swchItem1" href="http://secretworlds.ru/publ/51-2-2" onclick="spages('2','2');return false;"><span>51-89</span></a>


Допустим раздел http://secretworlds.ru/publ/51, на вторую страницу этого раздела http://secretworlds.ru/publ/51-2-2.

Две двойки в УРЛ не много путают нас, опытным путём попробуем разобраться, проверяем
http://secretworlds.ru/publ/51-2-1 - без изменений
http://secretworlds.ru/publ/51-1-2 - вывело нас на первую страницу, тогда следует считать что при формировании урл используется следующий алгоритм
http://secretworlds.ru/publ/51-N-2, где N - номер страницы раздела.

Теперь соберём массив со всеми ссылками на все разделы, мы знаем скока страниц, знаем как выглядит урл страницы раздела и знаем как этот урл формируется, остаётся
 #Полный массив Название раздела - страницы раздела
for($j=0; $j<count($pages); $j++)
{
for($i=0; $i<$pages[$j]; $i++)
{
$fullArray[$j]['name'] = $names[$j];
$fullArray[$j]['link'] = $links[$j];
$fullArray[$j]['pages'][] = $links[$j].'-'.($i+1).'-2';
}
}

#echo '<pre>' . print_r($fullArray, 1) . '</pre>';

Получили массив такого вида, очень удобны, где видно и имя раздела, ссылку раздела и ссылки на все страницы раздела.
Свернутый текст
Array
(
[0] => Array
(
[name] => Славянская мифология
[link] => http://secretworlds.ru/publ/33
[pages] => Array
(
[0] => http://secretworlds.ru/publ/33-1-2
)

)

[1] => Array
(
[name] => Мифы Северной Европы
[link] => http://secretworlds.ru/publ/34
[pages] => Array
(
[0] => http://secretworlds.ru/publ/34-1-2
[1] => http://secretworlds.ru/publ/34-2-2
)

)

[2] => Array
(
[name] => Мифология древнего Рима
[link] => http://secretworlds.ru/publ/35
[pages] => Array
(
[0] => http://secretworlds.ru/publ/35-1-2
)

)

[3] => Array
(
[name] => Мифы и легенды Египта
[link] => http://secretworlds.ru/publ/36
[pages] => Array
(
[0] => http://secretworlds.ru/publ/36-1-2
)

)

[4] => Array
(
[name] => Мифология Азии и Ирана
[link] => http://secretworlds.ru/publ/37
[pages] => Array
(
[0] => http://secretworlds.ru/publ/37-1-2
)

)

[5] => Array
(
[name] => Мифы и легенды Индостана
[link] => http://secretworlds.ru/publ/38
[pages] => Array
(
[0] => http://secretworlds.ru/publ/38-1-2
[1] => http://secretworlds.ru/publ/38-2-2
)

)

[6] => Array
(
[name] => Мифы и легенды Греции
[link] => http://secretworlds.ru/publ/39
[pages] => Array
(
[0] => http://secretworlds.ru/publ/39-1-2
[1] => http://secretworlds.ru/publ/39-2-2
[2] => http://secretworlds.ru/publ/39-3-2
[3] => http://secretworlds.ru/publ/39-4-2
)

)

[7] => Array
(
[name] => Легенды и мифы Крыма
[link] => http://secretworlds.ru/publ/51
[pages] => Array
(
[0] => http://secretworlds.ru/publ/51-1-2
[1] => http://secretworlds.ru/publ/51-2-2
)

)

[8] => Array
(
[name] => Японская мифология
[link] => http://secretworlds.ru/publ/53
[pages] => Array
(
[0] => http://secretworlds.ru/publ/53-1-2
)

)

[9] => Array
(
[name] => Мифы ацтеков и майя
[link] => http://secretworlds.ru/publ/54
[pages] => Array
(
[0] => http://secretworlds.ru/publ/54-1-2
)

)

[10] => Array
(
[name] => Бразильские мифы
[link] => http://secretworlds.ru/publ/62
[pages] => Array
(
[0] => http://secretworlds.ru/publ/62-1-2
)

)

[11] => Array
(
[name] => Легенды белых поселенцев Америки
[link] => http://secretworlds.ru/publ/63
[pages] => Array
(
[0] => http://secretworlds.ru/publ/63-1-2
)

)

[12] => Array
(
[name] => Мифы бушменов
[link] => http://secretworlds.ru/publ/64
[pages] => Array
(
[0] => http://secretworlds.ru/publ/64-1-2
)

)

[13] => Array
(
[name] => Мифы народов Океании
[link] => http://secretworlds.ru/publ/65
[pages] => Array
(
[0] => http://secretworlds.ru/publ/65-1-2
)

)

[14] => Array
(
[name] => Легенды Австралии
[link] => http://secretworlds.ru/publ/66
[pages] => Array
(
[0] => http://secretworlds.ru/publ/66-1-2
)

)

[15] => Array
(
[name] => Мифы Израиля
[link] => http://secretworlds.ru/publ/67
[pages] => Array
(
[0] => http://secretworlds.ru/publ/67-1-2
)

)

[16] => Array
(
[name] => Кетские мифы и легенды
[link] => http://secretworlds.ru/publ/68
[pages] => Array
(
[0] => http://secretworlds.ru/publ/68-1-2
)

)

[17] => Array
(
[name] => Татарские легенды
[link] => http://secretworlds.ru/publ/69
[pages] => Array
(
[0] => http://secretworlds.ru/publ/69-1-2
)

)

[18] => Array
(
[name] => Китайская мифология
[link] => http://secretworlds.ru/publ/70
[pages] => Array
(
[0] => http://secretworlds.ru/publ/70-1-2
)

)

)


ПРОДОЛЖЕНИЕ СЛЕДУЕТ.

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.