Сегодня я попробую рассказать, как можно написать пука — поискового робота, который будет собирать все внутренние ссылки сайта в файл. Механизм не претендует на надежность, но он однозначно работает. Если у вас будет желание, то вы можете его доработать, и кто знает, может появится новый google???

1268512466 untitled 62 300x247 пишем паукаПисать паука будем на C++ (если еще не догадались). Я не буду использовать какие либо сторонние библиотеки, типа cURL или LWP. Зачем они нам? Нам и стандартного winsock хватит.

Для начала, сделаем функцию Spider, которая будет принимать url и путь к файлу, в котором будут сохранятся внутренние ссылки. Мне кажется, она не будет очень примечательной, и реализовать ее будет весьма простой задачей. Все что нужно от нее, это запросить страничку, получить весь текст странички, и проанализировать ее содержимое. Код данной функции:

void Spider(char *szHost,char *szOutFile)
{
        WSADATA wsaData;
        WSAStartup(MAKEWORD(2,2),&wsaData);

        char szPattern[900] = "GET / HTTP/1.1\r\nHost: %s\r\nUser-Agent: %s\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3\r\nDNT: 1\r\nConnection: close\r\n\r\n";

        char cIp[20] = {0};
        GetIpByHostName(szHost,cIp,sizeof(cIp));

        SOCKET s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
        SOCKADDR_IN ssin = {0};
        ssin.sin_family = AF_INET;
        ssin.sin_port = htons(80);
        ssin.sin_addr.s_addr = inet_addr(cIp);
        connect(s,(SOCKADDR *)&ssin,sizeof(ssin));

        char szFirstQuery[1024] = {0};
        sprintf(szFirstQuery,szPattern,szHost,"GoogleBot");

        send(s,szFirstQuery,strlen(szFirstQuery),0);

        char *szResponse = NULL;

        char szBuffer[0x200] = {0};
        while(recv(s,szBuffer,sizeof(szBuffer)-1,NULL)>0)
        {
                if(szResponse == NULL)
                {
                        szResponse = new char[strlen(szBuffer)+1];
                        strcpy(szResponse,szBuffer);
                }
                else
                {
                        char *szR = new char[strlen(szResponse)+strlen(szBuffer)+1];
                        strcpy(szR,szResponse);
                        strcat(szR,szBuffer);
                        delete []szResponse;
                        szResponse = szR;
                }
        }

        closesocket(s);

        HANDLE hFile = CreateFile(szOutFile,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,NULL,NULL);
        DWORD dwWrite = 0;

        char *link;
        link = strtok(szResponse,"\"");
        while(link!=NULL)
        {
                if(IsGoodLink(link,szHost)&&IsGoodLen(link,szHost))
                {
                        WriteFile(hFile,link,strlen(link),&dwWrite,NULL);
                        WriteFile(hFile,"\r\n",strlen("\r\n"),&dwWrite,NULL);
                }
                link = strtok(NULL,"\"");
        }

        CloseHandle(hFile);
        delete []szResponse;
        WSACleanup();
}

Вот и вся функция. Получаем ip хоста, создаем сокет, и настраиваем его на хост. Затем соединяемся, генерируем и посылаем запрос. Как только запрос послан, то приступаем к приему. Получаем данные сначала в буфер, а затем прибавляем к переменной-указателю приемнику. Главное не напутать в первом while с размерами, иначе, если, к примеру в recv указать полный размер буферной переменной, то начнется кошмар. Можете поэксперементировать с этим… Во втором цикле мы ищем все ссылки, подходящие нашим двум условиям. Вот они:

bool IsGoodLink(char *szCheckLink,char *szHost)
{
        if(strlen(szCheckLink)>=strlen(szHost))
        {
                for(unsigned int i = 0;i
                      

Если словами, то условия такие:

  1. Ссылка должна быть на анализируемый нами сайт
  2. Ссылка не должна быть очень глубоко

После этого, если ссылка удовлетворяет вышесказанному, то записываем ссылку в файл. Исходник данного паука можно скачать тут.

tt twitter big4 пишем паука tt digg big4 пишем паука tt facebook big4 пишем паука tt gmail big4 пишем паука tt myspace big4 пишем паука tt reddit big4 пишем паука

Оставить комментарий

CAPTCHA изображение
Обновить изображение
*

RSS-подписка NIG Twitter-подписка NIG

Метки
Друзья
Блог линуксоида Программы для диагностики компьютера
Супер Pixel
Убивалка флешаБэкконект шелл. Часть вторая.Бэкконект шелл. Начало.НАМ для деления чиселПростая арифметикаПередача файлов. Часть третья. Клиент.Dll injectionСканер портовКодировка текста в BMPРухнул на два дняПередача файлов. Часть вторая. Сервер.Поворот и BMPCRC32 суммаBMP форматфайловые вирусыассемблер, строкиАссемблер и матрицапримеры ассемблерМногопоточное программированиеАрхитектура клиент — серверРаздача ICQПишем шуткупишем паукаПривет от ДжеймсаОбход firewallЗагрузка картинок на Gyazo, прямо из ThunarКейлоггер 3Плюшки в контекстном меню Thunarc по сетиКейлоггер 2КейлоггерСкачать Ассемблер!VirusCheckerОтморозки мешают жить ?! Не проблемма !Cкрипты для взлома аккаунтов QIPWinAPI. Работа с файлами. Часть третья. ЧтениеDlink exploitБрут сайта etxt.ruКрасивая раскладка клавиатуры в GnomeМои безделушки на PerlКак запускать Perl скрипты под WindowsБрутфорс партнёрки ZipCoinПарсер upwap.ruИзменения в блогеЧудо ЗаливалкаСкрипт для загрузки файлов на Zalil.ruЯндекс «чоткий» поисковик!WinAPI. Работа с файлами. Часть вторая. ЗаписьWinAPI. Работа с файлами. Часть первая. ПоискПолучение MD5 хеша средствами C++Что нам стоить letitfile.com забрутить?WarCraft III запуск под LinuxЭнтропия файлаWinsock и C++. Мини прокси. Часть |\\/. Завершающая.Перепилил чекер для 4gameЧекер акаунтов YoupornCMailSend v 1.1. Отправка почы без проблемСлучайные числаWinsock и C++. Часть |||. smtp монстр.Брутфорс LetitFile.comИспользование X-Forwarded-For, для обмана веб-сервера, подмена IP подручными средствамиДело было вечером, делать было нечего…Мысли о аудио сервереПарсер ников из твиттераКонец школоло…Perl+Linux. Заметка первая (Удобный Paste bin).Бэкконект шелл.E-MAIL + winsocket + Cpp. Сложно?winsock и C++. Часть ||. Атака клоунов.C++ резолвинг адресаPerl, анализ HTML кода и определение CMSМатематика в C++winsock и C++