На страницу 1, 2 След. |
|
|
Подробнее о конкурсе
Призовой фонд - спамилка Spam it! b или Spam it! на выбор + 100$
Спонсоры данного раздела:
kaiser Zaido и его великолепные спамилки
Спамилка - незаменимый друг дорвейщика, тот кто обладает лучшей спамилкой обладает возможностью валятся на диване, ходить пить пиво и гулять когда вздумается; не обладающий лучшей спамилкой дорвейщик обрекает себя на мучения - его грызет совесть за то что его нет в топе партнерки, его грызет пиво за то что дорвейщик его не пьет и вечно занят. Выбери лучшую спамилку и живи спокойно
Spam it! - исторически лучшая серверная спамилка
или
Spam it! b - исторически лучшая десктопная спамилка
Форум Armadaboard.com - 100$ |
|
|
|
|
|
ну что же, попробую начать.
Дизайн - это искусство и к нему надо подходить с творчеством. Одного фотошопа будет мало, нужна фантазия и чувства.
Дизайн начинается либо с галлеры, либо с фрихи, либо с чего-нибудь другого (с чего начать поподробнее, можно прочитать тута).
К допалнению к фотошопу я бы советовал обзавестись плагинами (хватит даже одного - Еаканди 2000. Хотя я плагинами не пользуюсь ).
Для всяких дополнительных выкрутасов качайте кисти, экшены, узорчики и тому подобное. Еще качайте шрифты и побольше , только не какую-нибудь шнягу, а красивые, так сказать редкие фонты.
Ну а дальше, если руки ростут от туда от куда надо и голова на месте, дерзайте!!!!
p.s. не задерживайтесь в дизайнге слишком долго, помимо этого изучайте и еще что-нибудь, поверьте мне, вам это пригодится, ибо из дизайна вы уйдете, так как ваше место займут новенькие Хотя может и станете покруче Артемки Лебедя (не придираться, имя первое, что пришло в голову), то пожалуйста, оставайтесь в дизе навсегда.
Желаю успеха в начинаниях.
С уважением, Apple_Macintosh
p.s.s. совсем забыл добавить, не забывайте читать мануалы по созданию каких-либо эффектов в фотошопе, тоже очень пригодится в будущем. |
|
|
|
|
|
Не секрет, что при раскрутке проекта, будь то дорвей или бело-серая аптека, большое значение имеет доменное имя или попросту - домен. Хороших доменов сейчас осталось мало, все разобрали, кудаж податься бедному вебмастеру, где взять хороший домен (да еще желательно б\у с живыми беками и пиаром )?
Есть выход в этой ситуации. Многие хозяева доменов, в том числе и очень "вкусных", частенько забывают оплатить продление своего домена на следующий год, и регистратор выставляет данный домен как свободный, и любой человек может зарегистрировать его на себя. Только нужно поймать момент, когда данный домен освободится и быстренько зарегистрировать его на себя, т.к. мы можем оказаться не одни, кому нужен этот домен и он уйдет налево от нас. Вручную мониторить домен не очень удобно, поэтому я предлагаю написать небольшой скрипт на PHP, который по расписанию будет проверять на доступность для регистрации заданный(е) домен(ы) и автоматически регистрировать его на ваше имя.
Итак, начнем.
В первую очередь нам понадобится API какого либо регистратора. Я сам пользуюсь klikdomains.com, поэтому и буду все показывать на примере его API, но при желании можно переделать все под любого регистратора доменов.
Регистрируемся на кликдомайнсах, в админке получаем API key и скачиваем инструментарий API в меню Tools. Распаковываем скачанный архив и помещаем файл klikdomains.php в подпапку incs нашего скрипта. Также в админке кликдомайнс необходимо создать контакты по умолчанию, на которые будут регистрироваться домены (это имя, емейл и т.д, которые показываются в хуизе) - можно писать реальные данные, можно левые =)
Теперь собственно начинаем писать непосредственно наш скрипт:
Код: |
<?php
include("incs/klikdomains.php");
$klikd = new klikdomains("yourlogin@mail.com","API_KEY_HERE");
|
Здесь
yourlogin@mail.com - тот емейл с которым вы регились на кликдомейнсах;
API_KEY_HERE - API key полученный в админке кликдомейнса.
Код: |
$target_domain = "google.com"; //нужный нам домен
$return = $klikd->check_availability($target_domain); //Проверка на доступность домена.
$return = parse_results($return);
if ($return[available] == "yes") {
$return = $klikd->add_domain($target_domain,0,"","",0,0,0,0); // домен освободился, регаем его
if ($return[1] == "status=Added to API todo list") {
$id = explode("=",$return[2]);
$id = $id[1]; //id задания на добавление. По нему мы потом можем узнать статус задания.
}
mail("tvoi_email@email.com","Ура. Перехватили домен","Домен $target_domain был успешно перехвачен. ID задания - $id."); //Шлем емейл себе, что перехват сработал.
}
?>
|
Называете данный файл например "hunter.php" и заливаете все на сервер, вместе с подпапкой incs. Файл hunter.php ставится на крон. Частота запускания его зависит от вас, можно поставить его долбиться каждую минуту, можно и раз в полчаса. Все, теперь можно раз в день проверять свою почту, не лежит ли там мессадж что домен уже наш =). Ну и конечно, для успешной регистрации домена, нужно что бы баланс в системе KlikDomains был ненулевым, как минимум что бы там лежало количество денег равное стоимости регистрации =)
Как видите, скрипт крайне прост, но и он может работать. Естественно можно, да и нужно, его усовершенствовать. Вот небольшой список того, что можно улучшить и добавить, а ниже я приведу небольшое описание функций из инструментария API KlikDomains.
1. Проверка целого списка доменов. Список может браться например из текстового файла или из базы данных.
2. Проверка того, что нужный нам домен УЖЕ кем то перереген. Это можно проверить с помощью служб Whois по дате регистрации.
3.Проверка выполнения регистрации по id задания. Это выполняется с помощью функции get_status из инструментария KlikDomains (см. ниже).
4. Да много чего еще можно наворотить =) Все функции предоставлены нам в API, наше дело только реализовать наши фантазии =)
Описание функций из класса klikdomains инструментария API KlikDomains:
check_availability("domain.com") - проверяет, доступен ли данный домен.
add_domain($domain,$ncns=0,$ns1="",$ns2="",$rcid,$acid,$tcid,$bcid) - добавляет задание на регистрацию нового домена.
$domain - имя нового домена (newdomain.com)
$ncns - тип NS
если = 0 : по умолчанию KlikDomains NS
если = 1 : какие то другие NS (ns1.somedomain.com & ns1.somedomain.com)
если = 2 : создать свои NS на домене (ns1.newdomain.com & ns2.newdomain.com)
$ns1, $ns2 - NS для newdomain.com, если $ncns == 1 то они текстовые - ns1.somedomain.com & ns1.somedomain.com, если $ncns == 2 то это IP-адреса - 1.2.3.4 & 1.2.4.4
$rcid - Контакты регистранта (если == 0 то по умолчанию)
$acid - Административные контакты (если == 0 то по умолчанию)
$tcid - Технические контакты (если == 0 то по умолчанию)
$bcid - Контакты службы продаж (если == 0 то по умолчанию)
get_status($id) - возвращает статус задания
$id - ID задания, возвращенное функцией add_domain
get_balance() - возвращает ваш баланс в системе KlikDomains
change_contact($id,2,2,2,2) - Изменяет контакты для домена с ID=$id.
get_domain_id("domain.com") - Возвращает ID домена.
change_ns($id,'ns1.somedomain.com','ns2.somedomain.com') - изменяет NS-ы для домена с ID=$id.
Как видно, функции достаточно универсальные и используя их можно сваять все что угодно.
Удачи в кодинге, поверьте мне - это очень интересно и полезно =) |
|
|
|
|
|
Как программно распознавать графические капчи.
Интро.
При написании некоторого специфического программного обеспечения (читай «спамелки» ) перед разработчиком возникает проблема: многие вкусные ресурсы с хорошим PR защищены от надоедливых спамботов с помощью т.н. капчи (CAPTCHA – автоматизированный тест Тьюринга для различения человека и компьютера).
Капчи бывают разных видов:
- Текстовые (вопросы типа «Ты человек или компьютер?», «Сколько пальцев на руке у человека?», «Сколько будет 2+2?» и т.п.). Предполагается, что спамбот не может распознать смысл вопроса, а значит и дать на него правильный ответ. Предположение правильное, но не учитывается один факт: генерировать вопросы самостоятельно компьютер тоже не может. Поэтому, взлом такой капчи, как правило, сводится к определению всего множества вопросов и правильных ответов на них, и забивания этой информации в спамилку. Может использоваться небольшая эвристика: например, если в вопросе есть слово, отличающее стилем – написанное, к примеру, жирным шрифтом или заглавными буквами – это скорее всего и есть нужное слово. Часто в текстовых капчах используются арифметические выражения – их можно легко вычислить с помощью функции eval(), которая есть в большинстве скриптовых языков. Но, по правде говоря, распознавать текстовые капчи приходится редко, т.к. из-за своей врожденной уязвимости они не очень сильно распространены.
- Графические. Подавляющее большинство графических капч представляют из себя изображение некоторых символов, которые человек должен распознать и ввести в текстовом виде. Recaptcha (http://recaptcha.net) считается «официальной» реализацией капчи и используется на многих ресурсах (Squidoo..). Также ее можно совершенно бесплатно использовать на любом своем сайте.
Есть и другие виды графических капч – например те, в которых нужно распознавать не текстовые символы, а изображения (типа «Что это за фрукт?»). Они страдают такой же проблемой, как и текстовые капчи – существующие алгоритмы не могут самостоятельно генерировать подходящие картинки.
Распознавание капчи
К счастью, подавляющее большинство графических капч далеко не так продвинуты как Recaptcha. Более того, распознать их РЕАЛЬНО просто Видимо это связано с тем, что в паблике нет серьезных распознавалок (да и серьезной инфы тоже), и разработчики капчей просто не имеют представления о том, как это действует и с чем им предстоит бороться.
Алгоритм, который я приведу ниже, реально используется мною для успешного распознавания очень многих капч и является частично универсальным, т.е. может быть применим с небольшими изменениями к большому классу капч.
Ну а чтобы повествование не было таким сухим, буду все показывать на примерах стандартной капчи phpBB2 (все знают эти шесть серых циферек-буковок...) и капчи loveplanet (http://loveplanet.ru/a-register/). Ну а чтобы совсем не палиться, параметры, используемые в алгоритмах, раскрывать не буду
Шаг 1. Первичная фильтрация шума и усиление полезного сигнала.
Необходимо стереть с рисунка все, что не является собственно символами. Хотя придумать универсальный алгоритм, который бы удалял с капчи шум очень сложно, в каждом конкретном случае все достаточно просто.
phpbb – все пикселы со значением цвета более X делаем белыми, остальные – черными. Затем, заполняем все дырки – белые пикселы, окруженные черными (в радиусе Y пикселов от дырки).
Loveplanet – стираем все красные, зеленые и синие пикселы, рядом с которыми нет других пикселов такого же цвета (это удалит только часть шума, с оставшимся расправимся на следующем этапе
Шаг 2. Сегментация и окончательная фильтрация шума.
На этом этапе необходимо отделить символы, изображенные на капче, друг от друга. В обоих практических примерах подходит один и тот же алгоритм – просто находим все связные объекты и выбрасываем мусор (объекты, в которых меньше X пикселей). В капче loveplanet мы можем улучшить результат, заметив то, что каждый объект имеет четко определенный цвет, и выбросив из каждого объекта «прилипшие» к нему пиксели другого цвета.
На этом этапе распознавалка уже может сама себя проверить – в phpbb должно получиться 6 объектов, в loveplanet – 4. Если количество объектов не соответствует ожидаемому, программа может скачать другую версию этой же капчи и попробовать еще раз – это позволяют и phpbb и loveplanet.
Шаг 3. Распознавание каждого из идентифицированных объектов.
Как ни странно, простейший алгоритм в данном случае является самым эффективным на большинстве капч (в которых нет сильного искажения символов): сравниваем каждый объект попиксельно с каждым из эталонных символов. Символ, где процент совпадений наибольший и есть нужный нам.
В случае phpbb все ОЧЕНЬ просто – символов всего 35, шрифт у них одинаковый, никакого искажения нет вообще. Полный набор эталонных символов уже специально приготовлен для нас разработчиками – в PNG формате в конце файла usercp_confirm.php
В loveplanet все немного сложнее: хотя возможных символов только 10, они могут быть написаны одним из трех шрифтов, повернуты (на угол до 30 градусов по или против часовой стрелки) и немного искажены. Тем не менее, с использованием специальной программы набор эталонных символов составляется менее чем за полчаса (можно и вручную, но будет дольше и гиморнее). Затем производим обычное попиксельное сравнение с одним изменением – сравниваем не только с эталонными символами, но и с их повернутыми версиями.
Распознавалка готова! |
|
|
|
|
|
гуд. что делать с анимированными капчами? там ещё цифры попорядку меняются... |
|
|
|
|
|
PFT писал(а): |
гуд. что делать с анимированными капчами? там ещё цифры попорядку меняются...
|
зависит от того как именно сделана анимированная капча. Опять же, в большинстве случаев все просто.
Например, в этом форуме недавно упоминали капчу на anoweb.ru - она распознается элементарно: в каждом кадре капчи идентифицируются отдельные символы (в этой капче это делается очень просто, т.к. символы белые и никакого шума в принципе нет). Если в кадре таких объектов оказывается ровно 4, то распознаем этот кадр дальше.
Все, задача распознавания анимированной капчи свелась к задаче распознавания обычной статической, которая сама по себе очень простая - шума нет, искажение символов минимальное, самих возможных символов всего 10.
В обсчем, у меня на программу ушло полчаса
А еще в распознавалке можно использовать то, что каждый символ в этой анимированной капче дается в 3-5 разных вариантах - разработчик, наверное, специально старался, чтобы бот при распознавании не дай бог не ошибся |
|
|
|
|
|
Не всё так просто как ты говоришь, всё что ты пишешь относится к простым капчам, неискажённым. Если - же в капчу внести ветер - всё что ты написал к ней станет недействительным. Тебе придётся выпрямлять линии, не забывая о том что у некоторых букв линии неровны по умолчанию (Y, У) и ещё куча проблем, при грамотном оформлении.
А вообще - капча это тупик, гораздо интереснее, на мой взгляд, многослойные картинки с указанием последовательности и штрафов за неправильный ответ (таймаут).
Да, всё что может ввести человек, может ввести и робот, это факт, но базу заипёшься набивать |
|
|
|
|
|
Sirgey писал(а): |
Не всё так просто как ты говоришь, всё что ты пишешь относится к простым капчам, неискажённым. Если - же в капчу внести ветер - всё что ты написал к ней станет недействительным. Тебе придётся выпрямлять линии, не забывая о том что у некоторых букв линии неровны по умолчанию (Y, У) и ещё куча проблем, при грамотном оформлении.
|
Не все так сложно
Необязательно пытаться выпрямить символы, можно попробовать наоборот - погнуть эталонные. Необязательно даже производить прямое сравнение символов, можно использовать нейросети или еще чего-нибудь.
На самом деле, любая капча, в которой можно выполнить сегментацию символов, заранее обречена. Искажение лишь немного усложняет задачу. Вообще, учитывая что каждый символ капчи должен уместиться в 40х40 пикселов или около того (а в некоторых капчах, вроде той что в anoweb.ru, вообще 10х10), никакое искажение неспособно помешать роботу этот символ распознать.
А вот пример гугловской капчи, в которой сегментацию выполнить практически невозможно:
никакой робот не сможет последние два (да и первые два тоже) символа разделить и в лучшем случае распознает как один символ "n" |
|
|
|
|
|
угу, и именно по этому гугль имеет именно эту капчу. Но дело не в этом, если ты ориентируешь свою распознавалку на гугль - поверни разделительные линии и ты получишь то что хотел. r + i... да, это сложно, но буквы n + i не существут, потому определить всё - же можно. Не в каждом сочетании есть r+i.
чуваки из армады, я тоже хочу запостить техническую статью, но я счас в стельку пьян, разрешите мне запостить её когда я протрезвею? |
|
|
|
|
|
Sirgey, давай трезвей скорее А то голосование уже скоро начнется |
|
|
|
|
|
Sirgey писал(а): |
угу, и именно по этому гугль имеет именно эту капчу. Но дело не в этом, если ты ориентируешь свою распознавалку на гугль - поверни разделительные линии и ты получишь то что хотел. r + i... да, это сложно, но буквы n + i не существут, потому определить всё - же можно. Не в каждом сочетании есть r+i.
|
для этой конкретной капчи - ты прав, распознать можно, но у гугля очень разные капчи - определить разделительные линии в каждом случае очень сложно:
И, внимание, зачетная капча
АБЛЯ, попробуй распознай |
|
|
|
|
|
Да!
я это ветром и называл, т.е. изменяемый наклон и скажение у каждой буквы. Вот допустим такие примеры. Если их разнообразить внеся буквы + сделать прыгающим интервал, допуская слияние - распознать такие капчи будет достаточно сложно.
Зайчёнок, я уже трезв статью пишу, через час - другой повешу. |
|
|
|
|
|
Итак, давайте попробуем написать парсер. Мы будем писать универсальный парсер со сменными "боеголовками - выражениями". Долго думал насчёт многопоточности... и решил что она или будет внешней или её вообще не будет. Она интересна, но в рамках сбора данных по одному запросу она не нужна. Вариант реализации многопоточности... вот:
Начнём с многопоточности, реализуем её по учебнику, внеся свои усовершенствования:
Код: |
<?php
define("MAX_PROCESSES", 20);
$items = file("keywords.txt");
$system = $_SERVER['argv'][1];
$num_procs = 0;
foreach ($items as $item)
{
$pid = pcntl_fork();
if ($pid == -1)
{
die("could not fork");
}
elseif ($pid)
{
$num_procs++;
if ($num_procs >= MAX_PROCESSES) while ($num_procs >= round(MAX_PROCESSES/2, 0))
{
pcntl_wait($status);
$num_procs--;
echo "wait theards... actual ".$num_procs.", max: ".MAX_PROCESSES."\n";
}
}
else
{
echo date("Y-m-d H:i:s").": start ".trim($item)."\n";
shell_exec("php parser.php ".$system." ".trim($item)." > log.txt & echo \$!");
exit;
}
}
|
Моё: прибавляем не по одной нити, а ждём когда все "слоты" заполнятся, а потом освобождаем половину (так процесс будет идти более интенсивно). Не забудьте в конце нити сделать exit, иначе сервер ляжет в момент.
Далее, ближе к телу, определим механизм разбора, допустим нужный регэксп будет определяться значением переменной $system и будет считываться из папки pregs, (структуру выложу), тогда нам надо определить для каждой системы:
-выражение для поиска следующей страницы
-выражение для разбора контента
-начальную маску урла
-формат сохранения.
Определим структуру так:
pregs
*google
**pagesRegexp.txt
<td nowrap class=b><a href=\"(.[^\"]*)\">.*Next<\/a>
**regexp.txt
<h2 class=r><a href=\"(.[^\"]*)\" class=l onmousedown=\"return.[^\"]*\">(.*)<\/a><\/h2>
**startUrl.txt
http://www.google.com/search?source=ig&hl=en&q=@PARAMETR@&btnG=Google+Search
формат сохранения в файле item.txt
@1@|@2@
Теперь у нас есть регулярное выражение для поиска следйющей страницы и собственно контента. Сразу скажу, в некоторых системах это неверно, но для большинства применимо. По поводу items, будем считать что это формат сохранения, примеры файлов приведу ниже.
Теперь про отправной урл. Он должен быть, причём он должен быть динамическим. Как правило он зависит от нашего запроса, и не меняет форму... предположим что у нас есть некоторый параметр, который мы будем вводить в командной строке, и на выходе должны получить урл, со вставленным вместо @PARAMETR@ значением.
Для общения с поисковиками будем использовать курл.
Ещё нам понадобится вот функция, ей на вход страницу и урл - она отдаёт абсолютный урл.
в итоге мы получим вот такой код:
Код: |
<?php
define("MAX_PAGES", 50);
define("PREGS_FOLDER", "pregs");
define("RESULTS_FOLDER", "results");
define("ITEMS_FILE", "items.txt");
define("REGEXP_FILE", "regexp.txt");
define("PAGES_REGEXP_FILE", "pagesRegexp.txt");
define("START_URL_FILE", "startUrl.txt");
define("USER_AGENT", "Mozilla/4.0 (compatible; MSIE 5.01; Widows NT)");
$system = $_SERVER['argv'][1];
$parametr = $_SERVER['argv'][2];
function curlGetPost($url, $referer = null, $postContent = false, $init = false, $followLocation = true)
{
if ($init || !isset($ch)) $ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $followLocation);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
if ($referer) curl_setopt($ch, CURLOPT_REFERER, $referer);
curl_setopt($ch, CURLOPT_USERAGENT, USER_AGENT);
if ($postContent)
{
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postContent);
}
else
{
curl_setopt($ch, CURLOPT_POST, false);
}
if (strtolower(substr($url, 0, 5)) == 'https') {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
}
curl_setopt($ch, CURLOPT_COOKIEFILE, "cooks.txt");
return curl_exec($ch);
}
function getAbsUrl($page, $link)
{
$page = trim($page);
$link = trim($link);
if (strpos($link, "#") !== false) $link = substr($link, 0, strpos($link, "#"));
if (strpos($page, "?") !== false) $page = substr($page, 0, strrpos($page, "?"));
if (strtolower(substr($link, 0, 7)) == "http://") return $link;
if (strtolower(substr($link, 0, 8)) == "https://") return $link;
if (strtolower(substr($link, 0, 4)) == "www.") return "http://".$link;
if (strtolower(substr($link, 0, 7)) == "mailto:") return false;
if (strtolower(substr($link, 0, 11)) == "javascript:") return false;
if (substr($link, 0, 1) == "/")
{
$url = parse_url($page);
$url = "http://".$url['host'].$link;
}
elseif (substr($link, 0, 1) == "?")
{
$url = $page.$link;
}
else
{
$url = substr($page, 0, strrpos($page, "/")+1).$link;
}
while (strpos($url, "../") !== false)
{
$nstr = substr($url, 0, strpos($url, "../") - 1);
$nstr = substr($nstr, 0, strrpos($nstr, "/")+1);
if (substr($nstr, -2) == "//") return false;
$url = $nstr.substr($url, strpos($url, "../") +3);
}
$url = str_replace("./", "", $url);
return $url;
}
if (!file_exists($pregFolder = "./".PREGS_FOLDER."/".$system."/"))
{
echo "Parser regular extension dont exists\n";
exit;
}
else
{
//формат сохранения
if (!file_exists($itemsFile = $pregFolder.ITEMS_FILE))
{
echo "Items file not exists\n";
exit;
} else echo "items - ok\n";
$items = file_get_contents($itemsFile);
//регэксп для контента
if (!file_exists($regexpFile = $pregFolder.REGEXP_FILE))
{
echo "Regexp file not exists\n";
exit;
} else echo "regexp - ok\n";
$regexp = file_get_contents($regexpFile);
//регэксп для сделующей страницы
if (!file_exists($pagesRegexpFile = $pregFolder.PAGES_REGEXP_FILE))
{
echo "Pages regexp file not exists\n";
exit;
} else echo "pages - ok\n";
$pagesRegexp = file_get_contents($pagesRegexpFile);
//стартовый урл
if (!file_exists($startUrlFile = $pregFolder.START_URL_FILE))
{
echo "Start url file not exists\n";
exit;
} else echo "start page - ok\n";
$startUrl = str_replace("@PARAMETR@", urlencode($parametr), file_get_contents($startUrlFile));
$tackt = 0;
$fp = fopen("./".RESULTS_FOLDER."/result_".date("Ymd-His").".txt", 'w');
$url = $startUrl;
$grabAll = 0;
do
{
$tackt++;
$content = curlGetPost($url, $url);
if ($grab = preg_match_all("/".$regexp."/iUs", $content, $result))
{
unset($result[0]);
foreach ($result[1] as $key => $value)
{
$source = trim($items);
foreach ($result as $lineKey => $lineValue)
{
$source = str_replace("@".$lineKey."@", $result[$lineKey][$key], $source);
}
fwrite($fp, $source."\n");
}
$grabAll += $grab;
echo "Tackt ".$tackt.", grab:".$grab.", all: ".$grabAll."\n";
}
else
{
echo "Tackt ".$tackt.", current empty, all: ".$grabAll."\n";
}
if (!preg_match("/".$pagesRegexp."/iUs", $content, $result))
{
echo "Parsing ends, next page not found, tackt: ".$tackt."\n";
fclose($fp);
exit;
}
else
{
$url = getAbsUrl($url, $result[1]);
}
} while ($tackt <= MAX_PAGES);
}
|
Код работает, проверял. Исходя из описания парсить он может что угодно (что он парсит определяется 3 файлами, содержание которых я привел. полная версия вот тут лежит. http://seo-service.org/files/armadaArticle.zip
Извините за то что я плохо код описал и нет коментов... данная статья только для программистов, спрашивайте кому что интересно.
Ясное дело что на папку results нужно 777 поставить. |
|
|
|
|
|
УРА!!!! |
|
|
|
|
|
Sirgey, это точно - ура! успел как раз под закрытие |
|
|
|
|
|
|
|