АРМАДА
Внеси свой вклад в копилку знаний о тех. части
На страницу 1, 2  След.
Новая тема Написать ответ

Rabbit
Кролики - это не только ценный мех
Зарегистрирован: 01.08.2005
Сообщений: 19788
Star (Сумма: 1)
Обратиться по нику
# Добавлено:Пт Июн 29, 2007 7:18 pmДобавить в избранноеОтветить с цитатой
Подробнее о конкурсе

Призовой фонд - спамилка Spam it! b или Spam it! на выбор + 100$

Спонсоры данного раздела:

kaiser Zaido и его великолепные спамилки Smile

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

Spam it! - исторически лучшая серверная спамилка
или
Spam it! b - исторически лучшая десктопная спамилка

Форум Armadaboard.com - 100$
Новое. Прибыльное. Скоро!

Apple_Macintosh
Русский Стив Джобс
Зарегистрирован: 08.12.2005
Сообщений: 3208
Contest (Сумма: 2)
Обратиться по нику
# Добавлено:Вс Июл 01, 2007 6:26 pmОтветить с цитатой
ну что же, попробую начать. :mrgreen:
Дизайн - это искусство и к нему надо подходить с творчеством. Одного фотошопа будет мало, нужна фантазия и чувства.
Дизайн начинается либо с галлеры, либо с фрихи, либо с чего-нибудь другого (с чего начать поподробнее, можно прочитать тута).
К допалнению к фотошопу я бы советовал обзавестись плагинами (хватит даже одного - Еаканди 2000. Хотя я плагинами не пользуюсь Smile).
Для всяких дополнительных выкрутасов качайте кисти, экшены, узорчики и тому подобное. Еще качайте шрифты и побольше Smile, только не какую-нибудь шнягу, а красивые, так сказать редкие фонты.

Ну а дальше, если руки ростут от туда от куда надо и голова на месте, дерзайте!!!!

p.s. не задерживайтесь в дизайнге слишком долго, помимо этого изучайте и еще что-нибудь, поверьте мне, вам это пригодится, ибо из дизайна вы уйдете, так как ваше место займут новенькие Smile Хотя может и станете покруче Артемки Лебедя (не придираться, имя первое, что пришло в голову), то пожалуйста, оставайтесь в дизе навсегда. Drinks or Beer

Желаю успеха в начинаниях.
С уважением, Apple_Macintosh

p.s.s. совсем забыл добавить, не забывайте читать мануалы по созданию каких-либо эффектов в фотошопе, тоже очень пригодится в будущем.
Вы спросите, есть ли у меня синдром Бога? Я и есть БОГ!!!

mizhgan
Свой
Зарегистрирован: 19.02.2007
Сообщений: 3
Обратиться по нику
# Добавлено:Чт Июл 05, 2007 8:16 amОтветить с цитатой
Не секрет, что при раскрутке проекта, будь то дорвей или бело-серая аптека, большое значение имеет доменное имя или попросту - домен. Хороших доменов сейчас осталось мало, все разобрали, кудаж податься бедному вебмастеру, где взять хороший домен (да еще желательно б\у с живыми беками и пиаром Smile )?
Есть выход в этой ситуации. Многие хозяева доменов, в том числе и очень "вкусных", частенько забывают оплатить продление своего домена на следующий год, и регистратор выставляет данный домен как свободный, и любой человек может зарегистрировать его на себя. Только нужно поймать момент, когда данный домен освободится и быстренько зарегистрировать его на себя, т.к. мы можем оказаться не одни, кому нужен этот домен и он уйдет налево от нас. Вручную мониторить домен не очень удобно, поэтому я предлагаю написать небольшой скрипт на PHP, который по расписанию будет проверять на доступность для регистрации заданный(е) домен(ы) и автоматически регистрировать его на ваше имя.

Итак, начнем.

В первую очередь нам понадобится API какого либо регистратора. Я сам пользуюсь klikdomains.com, поэтому и буду все показывать на примере его API, но при желании можно переделать все под любого регистратора доменов.
Регистрируемся на кликдомайнсах, в админке получаем API key и скачиваем инструментарий API в меню Tools. Распаковываем скачанный архив и помещаем файл klikdomains.php в подпапку incs нашего скрипта. Также в админке кликдомайнс необходимо создать контакты по умолчанию, на которые будут регистрироваться домены (это имя, емейл и т.д, которые показываются в хуизе) - можно писать реальные данные, можно левые =)

Теперь собственно начинаем писать непосредственно наш скрипт:
Код:

<?php

include("incs/klikdomains.php");
$klikd = new klikdomains("[email protected]","API_KEY_HERE");


Здесь
[email protected] - тот емейл с которым вы регились на кликдомейнсах;
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("[email protected]","Ура. Перехватили домен","Домен $target_domain был успешно перехвачен. ID задания - $id."); //Шлем емейл себе, что перехват сработал.

}

?>


Называете данный файл например "hunter.php" Wink и заливаете все на сервер, вместе с подпапкой 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.

Как видно, функции достаточно универсальные и используя их можно сваять все что угодно.

Удачи в кодинге, поверьте мне - это очень интересно и полезно =)
http://www.domenator.net - разные домены.

Rayden
Опытный
Зарегистрирован: 25.09.2007
Сообщений: 310
Обратиться по нику
# Добавлено:Вт Сен 25, 2007 5:35 pmОтветить с цитатой
Как программно распознавать графические капчи.

Интро.

При написании некоторого специфического программного обеспечения (читай «спамелки» Smile) перед разработчиком возникает проблема: многие вкусные ресурсы с хорошим PR защищены от надоедливых спамботов с помощью т.н. капчи (CAPTCHA – автоматизированный тест Тьюринга для различения человека и компьютера).

Капчи бывают разных видов:
- Текстовые (вопросы типа «Ты человек или компьютер?», «Сколько пальцев на руке у человека?», «Сколько будет 2+2?» и т.п.). Предполагается, что спамбот не может распознать смысл вопроса, а значит и дать на него правильный ответ. Предположение правильное, но не учитывается один факт: генерировать вопросы самостоятельно компьютер тоже не может. Поэтому, взлом такой капчи, как правило, сводится к определению всего множества вопросов и правильных ответов на них, и забивания этой информации в спамилку. Может использоваться небольшая эвристика: например, если в вопросе есть слово, отличающее стилем – написанное, к примеру, жирным шрифтом или заглавными буквами – это скорее всего и есть нужное слово. Часто в текстовых капчах используются арифметические выражения – их можно легко вычислить с помощью функции eval(), которая есть в большинстве скриптовых языков. Но, по правде говоря, распознавать текстовые капчи приходится редко, т.к. из-за своей врожденной уязвимости они не очень сильно распространены.

- Графические. Подавляющее большинство графических капч представляют из себя изображение некоторых символов, которые человек должен распознать и ввести в текстовом виде. Recaptcha (http://recaptcha.net) считается «официальной» реализацией капчи и используется на многих ресурсах (Squidoo..). Также ее можно совершенно бесплатно использовать на любом своем сайте.
Есть и другие виды графических капч – например те, в которых нужно распознавать не текстовые символы, а изображения (типа «Что это за фрукт?»). Они страдают такой же проблемой, как и текстовые капчи – существующие алгоритмы не могут самостоятельно генерировать подходящие картинки.

Распознавание капчи

К счастью, подавляющее большинство графических капч далеко не так продвинуты как Recaptcha. Более того, распознать их РЕАЛЬНО просто Smile Видимо это связано с тем, что в паблике нет серьезных распознавалок (да и серьезной инфы тоже), и разработчики капчей просто не имеют представления о том, как это действует и с чем им предстоит бороться.
Алгоритм, который я приведу ниже, реально используется мною для успешного распознавания очень многих капч и является частично универсальным, т.е. может быть применим с небольшими изменениями к большому классу капч.
Ну а чтобы повествование не было таким сухим, буду все показывать на примерах стандартной капчи phpBB2 (все знают эти шесть серых циферек-буковок...) и капчи loveplanet (http://loveplanet.ru/a-register/). Ну а чтобы совсем не палиться, параметры, используемые в алгоритмах, раскрывать не буду Smile

Шаг 1. Первичная фильтрация шума и усиление полезного сигнала.
Необходимо стереть с рисунка все, что не является собственно символами. Хотя придумать универсальный алгоритм, который бы удалял с капчи шум очень сложно, в каждом конкретном случае все достаточно просто.
phpbb – все пикселы со значением цвета более X делаем белыми, остальные – черными. Затем, заполняем все дырки – белые пикселы, окруженные черными (в радиусе Y пикселов от дырки).
Loveplanet – стираем все красные, зеленые и синие пикселы, рядом с которыми нет других пикселов такого же цвета (это удалит только часть шума, с оставшимся расправимся на следующем этапе Smile

Шаг 2. Сегментация и окончательная фильтрация шума.
На этом этапе необходимо отделить символы, изображенные на капче, друг от друга. В обоих практических примерах подходит один и тот же алгоритм – просто находим все связные объекты и выбрасываем мусор (объекты, в которых меньше X пикселей). В капче loveplanet мы можем улучшить результат, заметив то, что каждый объект имеет четко определенный цвет, и выбросив из каждого объекта «прилипшие» к нему пиксели другого цвета.
На этом этапе распознавалка уже может сама себя проверить – в phpbb должно получиться 6 объектов, в loveplanet – 4. Если количество объектов не соответствует ожидаемому, программа может скачать другую версию этой же капчи и попробовать еще раз – это позволяют и phpbb и loveplanet.

Шаг 3. Распознавание каждого из идентифицированных объектов.
Как ни странно, простейший алгоритм в данном случае является самым эффективным на большинстве капч (в которых нет сильного искажения символов): сравниваем каждый объект попиксельно с каждым из эталонных символов. Символ, где процент совпадений наибольший и есть нужный нам.
В случае phpbb все ОЧЕНЬ просто – символов всего 35, шрифт у них одинаковый, никакого искажения нет вообще. Полный набор эталонных символов уже специально приготовлен для нас разработчиками – в PNG формате в конце файла usercp_confirm.php Smile
В loveplanet все немного сложнее: хотя возможных символов только 10, они могут быть написаны одним из трех шрифтов, повернуты (на угол до 30 градусов по или против часовой стрелки) и немного искажены. Тем не менее, с использованием специальной программы набор эталонных символов составляется менее чем за полчаса (можно и вручную, но будет дольше и гиморнее). Затем производим обычное попиксельное сравнение с одним изменением – сравниваем не только с эталонными символами, но и с их повернутыми версиями.

Распознавалка готова!

PFT
Профессионал
Зарегистрирован: 14.06.2007
Сообщений: 787
Обратиться по нику
# Добавлено:Ср Сен 26, 2007 9:41 pmОтветить с цитатой
гуд. что делать с анимированными капчами? там ещё цифры попорядку меняются...
Здесь не е$ут мозг, здесь много платят! GlavMed
Русский Биллинг - начни свой SMS-бизнес с нами!

Rayden
Опытный
Зарегистрирован: 25.09.2007
Сообщений: 310
Обратиться по нику
# Добавлено:Ср Сен 26, 2007 11:24 pmОтветить с цитатой
PFT писал(а):
гуд. что делать с анимированными капчами? там ещё цифры попорядку меняются...



зависит от того как именно сделана анимированная капча. Опять же, в большинстве случаев все просто.
Например, в этом форуме недавно упоминали капчу на anoweb.ru - она распознается элементарно: в каждом кадре капчи идентифицируются отдельные символы (в этой капче это делается очень просто, т.к. символы белые и никакого шума в принципе нет). Если в кадре таких объектов оказывается ровно 4, то распознаем этот кадр дальше.
Все, задача распознавания анимированной капчи свелась к задаче распознавания обычной статической, которая сама по себе очень простая - шума нет, искажение символов минимальное, самих возможных символов всего 10.

В обсчем, у меня на программу ушло полчаса Cool

А еще в распознавалке можно использовать то, что каждый символ в этой анимированной капче дается в 3-5 разных вариантах - разработчик, наверное, специально старался, чтобы бот при распознавании не дай бог не ошибся :mrgreen:

Sirgey
Опытный
Зарегистрирован: 06.05.2007
Сообщений: 116
Обратиться по нику
# Добавлено:Пт Сен 28, 2007 12:59 pmОтветить с цитатой
Не всё так просто как ты говоришь, всё что ты пишешь относится к простым капчам, неискажённым. Если - же в капчу внести ветер - всё что ты написал к ней станет недействительным. Тебе придётся выпрямлять линии, не забывая о том что у некоторых букв линии неровны по умолчанию (Y, У) и ещё куча проблем, при грамотном оформлении.
А вообще - капча это тупик, гораздо интереснее, на мой взгляд, многослойные картинки с указанием последовательности и штрафов за неправильный ответ (таймаут).
Да, всё что может ввести человек, может ввести и робот, это факт, но базу заипёшься набивать Smile

Rayden
Опытный
Зарегистрирован: 25.09.2007
Сообщений: 310
Обратиться по нику
# Добавлено:Пт Сен 28, 2007 2:33 pmОтветить с цитатой
Sirgey писал(а):
Не всё так просто как ты говоришь, всё что ты пишешь относится к простым капчам, неискажённым. Если - же в капчу внести ветер - всё что ты написал к ней станет недействительным. Тебе придётся выпрямлять линии, не забывая о том что у некоторых букв линии неровны по умолчанию (Y, У) и ещё куча проблем, при грамотном оформлении.



Не все так сложно Smile
Необязательно пытаться выпрямить символы, можно попробовать наоборот - погнуть эталонные. Необязательно даже производить прямое сравнение символов, можно использовать нейросети или еще чего-нибудь.

На самом деле, любая капча, в которой можно выполнить сегментацию символов, заранее обречена. Искажение лишь немного усложняет задачу. Вообще, учитывая что каждый символ капчи должен уместиться в 40х40 пикселов или около того (а в некоторых капчах, вроде той что в anoweb.ru, вообще 10х10), никакое искажение неспособно помешать роботу этот символ распознать.

А вот пример гугловской капчи, в которой сегментацию выполнить практически невозможно:

никакой робот не сможет последние два (да и первые два тоже) символа разделить и в лучшем случае распознает как один символ "n"

Sirgey
Опытный
Зарегистрирован: 06.05.2007
Сообщений: 116
Обратиться по нику
# Добавлено:Пт Сен 28, 2007 11:38 pmОтветить с цитатой
угу, и именно по этому гугль имеет именно эту капчу. Но дело не в этом, если ты ориентируешь свою распознавалку на гугль - поверни разделительные линии и ты получишь то что хотел. r + i... да, это сложно, но буквы n + i не существут, потому определить всё - же можно. Не в каждом сочетании есть r+i.
чуваки из армады, я тоже хочу запостить техническую статью, но я счас в стельку пьян, разрешите мне запостить её когда я протрезвею? Smile

Rabbit
Кролики - это не только ценный мех
Зарегистрирован: 01.08.2005
Сообщений: 19788
Star (Сумма: 1)
Обратиться по нику
# Добавлено:Сб Сен 29, 2007 7:02 amОтветить с цитатой
Sirgey, давай трезвей скорее Smile А то голосование уже скоро начнется Wink
Новое. Прибыльное. Скоро!

Rayden
Опытный
Зарегистрирован: 25.09.2007
Сообщений: 310
Обратиться по нику
# Добавлено:Сб Сен 29, 2007 10:22 amОтветить с цитатой
Sirgey писал(а):
угу, и именно по этому гугль имеет именно эту капчу. Но дело не в этом, если ты ориентируешь свою распознавалку на гугль - поверни разделительные линии и ты получишь то что хотел. r + i... да, это сложно, но буквы n + i не существут, потому определить всё - же можно. Не в каждом сочетании есть r+i.



для этой конкретной капчи - ты прав, распознать можно, но у гугля очень разные капчи - определить разделительные линии в каждом случае очень сложно:





И, внимание, зачетная капча :mrgreen:



АБЛЯ, попробуй распознай Laughing

Sirgey
Опытный
Зарегистрирован: 06.05.2007
Сообщений: 116
Обратиться по нику
# Добавлено:Сб Сен 29, 2007 2:31 pmОтветить с цитатой
Да! Smile
я это ветром и называл, т.е. изменяемый наклон и скажение у каждой буквы. Вот допустим такие примеры. Если их разнообразить внеся буквы + сделать прыгающим интервал, допуская слияние - распознать такие капчи будет достаточно сложно.


Зайчёнок, я уже трезв Smile статью пишу, через час - другой повешу.

Sirgey
Опытный
Зарегистрирован: 06.05.2007
Сообщений: 116
Обратиться по нику
# Добавлено:Сб Сен 29, 2007 6:26 pmОтветить с цитатой
Итак, давайте попробуем написать парсер. Мы будем писать универсальный парсер со сменными "боеголовками - выражениями". Долго думал насчёт многопоточности... и решил что она или будет внешней или её вообще не будет. Она интересна, но в рамках сбора данных по одному запросу она не нужна. Вариант реализации многопоточности... вот:

Начнём с многопоточности, реализуем её по учебнику, внеся свои усовершенствования:
Код:
<?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&[email protected]@&btnG=Google+Search

формат сохранения в файле item.txt
@[email protected]|@[email protected]

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

Теперь про отправной урл. Он должен быть, причём он должен быть динамическим. Как правило он зависит от нашего запроса, и не меняет форму... предположим что у нас есть некоторый параметр, который мы будем вводить в командной строке, и на выходе должны получить урл, со вставленным вместо @[email protected] значением.

Для общения с поисковиками будем использовать курл.

Ещё нам понадобится вот функция, ей на вход страницу и урл - она отдаёт абсолютный урл.

в итоге мы получим вот такой код:
Код:
<?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("@[email protected]", 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 поставить.
Мой блог о SEO, водке, фотках и продвижении

Sirgey
Опытный
Зарегистрирован: 06.05.2007
Сообщений: 116
Обратиться по нику
# Добавлено:Сб Сен 29, 2007 6:28 pmОтветить с цитатой
УРА!!!! Smile
Мой блог о SEO, водке, фотках и продвижении

Rabbit
Кролики - это не только ценный мех
Зарегистрирован: 01.08.2005
Сообщений: 19788
Star (Сумма: 1)
Обратиться по нику
# Добавлено:Вс Сен 30, 2007 9:59 amОтветить с цитатой
Sirgey, это точно - ура! успел как раз под закрытие Smile
Новое. Прибыльное. Скоро!
Новая тема Написать ответ    ГЛАВНАЯ ~ ПОЛЕЗНЫЕ СТАТЬИ

Перейти:  





Генеральный спонсор



Партнеры