Компьютерная помощь
Сайт комнаты "Компьютерная помощь"

Пишем граббер проксей для чекера с помощью CURL

Программирование | 16 июля 2016 г.

Делаем 50 (опционально) запросов к гуглю каждый ответ 10 линков тоесть получаем 500 линков и сохраняем их в списке list потом проходимся по всем линкам в этом списке скачивает заглавную страницу по линку и парсим ее на адреса можно сделать просмотр на пару уровней вглубь по каждому линку найденные адреса сохраняем в списке all_ip

int main(int argc, char **argv)
{
    CURL *easy;
    DWORD equal, count_page;
    struct c_string buff;
    struct list *list;
    struct list *all_ip;
    char pack[84] = "http://www.google.ru/search?hl=ru&lr=&newwindow=1&q=free+proxy+list&start=";
    create_list(&&list);
    create_list(&&all_ip);
    curl_global_init(CURL_GLOBAL_WIN32);
    easy = curl_easy_init();
    curl_easy_setopt(easy, CURLOPT_WRITEFUNCTION, my_show);
    curl_easy_setopt(easy, CURLOPT_WRITEDATA, &&buff);
    count_page = 0;
    while (count_page++ < 50) /* делаем 50 запросов в каждом по 10 результатов */
    {
        resize_pack(pack); /* формируем следующий запрос для гугля */
        curl_easy_setopt(easy, CURLOPT_URL, pack);
        c_string_init(&&buff);
        curl_easy_perform(easy);
        /* сохраняем линки результатов с каждого запроса в списке list см [2]*/
        show_link(&&buff, &&list);
        c_string_free(&buff);
    }
    clear_all_equal(&&list, &&equal, comp_equal, NULL);
    /* на выходе у нас в списке должно быть 500 линков удаляем одинаковые */
    delfuck(&list, del_not_link, NULL);
    traverse_list(&&list, show, NULL);
    traverse_list(&&list, analyze_link, &&all_ip);
    /* запускаем цикл по списку list для каждого элемента устанавливается
    делаем коннект скачиваем страницу по линку и парсим на прокси и добавляем найденные
    в список all_ip см [3] вообще в этой точке задачу можно распараллелить если один поток
    не устраивает получится заметно быстрее для этого создайте например пять списков и
    разделите между ними список list с линками и для каждого из пяти списков создайте поток
    и сделайте для каждого списка в потоке такой же вызов traverse_list(&list, analyze_link, &all_ip);
    да а список all_ip можно оставить один и добавлять в него найденные из пяти потоков адреса
    синхронизацию для доступа к all_ip впринципе делать не надо операция list_add_item использует
    критические секции при изменении списка */
    clear_all_equal(&&all_ip, &&equal, comp_equal, NULL); /* удаляем одинаковые адреса */
    traverse_list(&&all_ip, show, NULL);
    printf("item %d\n", get_list_item_count(&&all_ip)); /* смотрим результат */
    destroy_list(&&list, NULL);
    destroy_list(&&all_ip, NULL);
}

[2]


/** получаем ответ от гугля в нем 10 линков добавляем их в список list */
void show_link(struct c_string *string, struct list **list)
{
    char *p;
    char temp_link[1024], *ptemp_link;

    p = string->string;
    while (p = strstr(p, ""))
    {
        ptemp_link = temp_link;
        while (*p++ != '"')
        {
            while ((*ptemp_link++ = *p++) != '"')
            {
                *--ptemp_link = '\0';
                add_item_list(list, temp_link, strlen(temp_link)+1, 0);
            }
        }
    }
}

[3]


Вызывается для списка list для каждого линка скачивается страница парсится на наличие  адресов и переходим к следующему линку можно сделать просмотр в глубь  на один или два уровня по ссылкам потому что адреса как правило не только  на одной странице и в одном потоке делать анализ всех линков долго можно распараллелить см [1] там написан один из вариантов

int analyze_link(void *data, size_t size, int tag, void *userpv)
{
    CURL *easy;
    struct c_string buff;

    c_string_init(&&buff);
    easy = curl_easy_init();
    curl_easy_setopt(easy, CURLOPT_URL, data);
    curl_easy_setopt(easy, CURLOPT_WRITEFUNCTION, my_show);
    curl_easy_setopt(easy, CURLOPT_WRITEDATA, &&buff);
    curl_easy_perform(easy);
    analyze(&&buff, userpv); /* эту функцию которая принимает страницу и выдергивает */
    curl_easy_cleanup(easy); /*прокси и добавляет их в список all_ip напишите Вы */
    c_string_free(&buff);

    /* ее сигнатура такова
    void analyze(struct c_string *string, void *userpv){};
    указатель на дин массив string и указатель на список all_ip
    */
    return 1;
}

Рабочий исходник прикреплен к статье в нем в частности содержится содержится дин массив struct c_string и список struct list использованые в программе и плюс у вас должна быть CURL библиотека под рукой и желательно GLIB в ней много готовых контейнеров для чистого Си типа STL для С++ если вас не прильщает писать свои

Исходный код Скачать 0

twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru yandex.ru

При цитировании, копировании, клонировании материалов с сайта целиком или частично, ссылка на страницу, откуда был скопирован материал, обязательна! При нарушении данных условий прошу незамедлительно удалить со своих ресурсов скопированный материал. Администрация сайта.

Комментариев: 1
    

    Комментариев: 1

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

    grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

    Используйте нормальные имена

    Вы можете войти под своим логином или зарегистрироваться на сайте.

    (обязательно)