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

CURLДелаем 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 = '
/** получаем ответ от гугля в нем 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);
            }
        }
    }
}
';                 add_item_list(list, temp_link, strlen(temp_link)+1, 0);             }         }     } }

[3]


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

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;
}

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