C++ Как по сокетам спарсить ссылку ?

  • Автор темы Автор темы Fronis
  • Дата начала Дата начала
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
10 Апр 2022
Сообщения
183
Реакции
16
привет всем, мне надо спарсить ссылку но по сокеты пример ссылки
Пожалуйста, авторизуйтесь для просмотра ссылки.

заранее спасибо за ответ
 
привет всем, мне надо спарсить ссылку но по сокеты пример ссылки
Пожалуйста, авторизуйтесь для просмотра ссылки.

заранее спасибо за ответ
сам регекс ->
Код:
Expand Collapse Copy
/https:\/\/.*/
как использовать ->
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
привет всем, мне надо спарсить ссылку но по сокеты пример ссылки
Пожалуйста, авторизуйтесь для просмотра ссылки.

заранее спасибо за ответ

Чтобы спарсить ссылку с помощью сокетов на C++, вам необходимо выполнить следующие шаги:

  1. Установить соединение с веб-сервером, где расположена страница с нужной ссылкой, используя функцию socket(), connect(), и inet_addr().
  2. Отправить HTTP-запрос на сервер с помощью функции send().
  3. Прочитать ответ от сервера, который будет содержать HTML-код страницы с помощью функции recv().
  4. Проаналировать HTML-код и найдите нужную ссылку. Это можно сделать с помощью библиотек для работы с HTML, таких как libxml2 или libcurl, или же реализовав свой парсер.
  5. И извлекаем URL-адрес из найденного тега ссылки и сохраняем его в переменной. Всё

Пример кода по этим шагам:

C++:
Expand Collapse Copy
#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>

#define MAX_BUFFER_SIZE 1024

using namespace std;

int main() {
    int client_socket = socket(AF_INET, SOCK_STREAM, 0);
    if (client_socket < 0) {
        cerr << "Error: Failed to create socket" << endl;
        return 1;
    }

    struct sockaddr_in server_address;
    server_address.sin_family = AF_INET;
    server_address.sin_port = htons(80);
    server_address.sin_addr.s_addr = inet_addr("127.0.0.1");

    if (connect(client_socket, (struct sockaddr*)&server_address, sizeof(server_address)) < 0) {
        cerr << "Error: Failed to connect to server" << endl;
        return 1;
    }

    string request = "GET / HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n";
    if (send(client_socket, request.c_str(), request.length(), 0) < 0) {
        cerr << "Error: Failed to send request to server" << endl;
        return 1;
    }

    char buffer[MAX_BUFFER_SIZE] = {0};
    string response;

    while (true) {
        int bytes_received = recv(client_socket, buffer, MAX_BUFFER_SIZE, 0);
        if (bytes_received < 0) {
            cerr << "Error: Failed to receive data from server" << endl;
            return 1;
        } else if (bytes_received == 0) {
            break;
        } else {
            response.append(buffer, bytes_received);
        }
    }

    size_t start_pos = response.find("<a href=\"");
    if (start_pos != string::npos) {
        start_pos += strlen("<a href=\"");
        size_t end_pos = response.find("\"", start_pos);
        if (end_pos != string::npos) {
            string link = response.substr(start_pos, end_pos - start_pos);
            cout << "Link found: " << link << endl;
        }
    }

    close(client_socket);
    return 0;
}
Или можно использовать библиотеку сокетов, такую как socket.h или Winsock.h (для Windows).

Пример кода который устанавливает соединение с сервером, отправляет запрос и получает ответ:
C++:
Expand Collapse Copy
#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>

using namespace std;

int main() {
    // Создаем сокет
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == -1) {
        cout << "Ошибка создания сокета\n";
        return 1;
    }

    // Устанавливаем соединение
    sockaddr_in server;
    server.sin_addr.s_addr = inet_addr("127.0.0.1"); // IP-адрес сервера
    server.sin_family = AF_INET;
    server.sin_port = htons(80); // Порт HTTP сервера

    if (connect(sock, (sockaddr*)&server, sizeof(server)) < 0) {
        cout << "Ошибка соединения\n";
        return 1;
    }

    // Отправляем запрос на сервер
    const char* message = "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n";
    if (send(sock, message, strlen(message), 0) < 0) {
        cout << "Ошибка отправки запроса\n";
        return 1;
    }

    // Получаем ответ от сервера
    char buffer[1024] = {0};
    if (recv(sock, buffer, sizeof(buffer), 0) < 0) {
        cout << "Ошибка получения ответа\n";
        return 1;
    }

    // Ищем ссылку в ответе
    const char* link_start = strstr(buffer, "<a href=\"");
    if (link_start) {
        link_start += strlen("<a href=\"");
        const char* link_end = strchr(link_start, '\"');
        if (link_end) {
            char link[256];
            strncpy(link, link_start, link_end - link_start);
            link[link_end - link_start] = '\0';
            cout << "Ссылка: " << link << endl;
        }
    }

    // Закрываем сокет
    close(sock);

    return 0;
}

Этот код устанавливает соединение с HTTP сервером, отправляет запрос и получает ответ. Затем он ищет первую ссылку в HTML-коде ответа и выводит ее на экран.

Это только простой пример, и для реальной работы с сокетами тебе, возможно, потребуется реализовать более сложный код для работы с различными типами запросов и ответов.
 
Последнее редактирование:
Чтобы спарсить ссылку с помощью сокетов на C++, вам необходимо выполнить следующие шаги:

  1. Установите соединение с веб-сервером, на котором расположена страница с нужной ссылкой, используя функцию socket(), connect(), и inet_addr().
  2. Отправьте HTTP-запрос на сервер с помощью функции send().
  3. Прочитайте ответ от сервера, который будет содержать HTML-код страницы с помощью функции recv().
  4. Проанализируйте HTML-код и найдите нужную ссылку. Это можно сделать с помощью библиотек для работы с HTML, таких как libxml2 или libcurl, или же реализовав свой парсер.
  5. Извлеките URL-адрес из найденного тега ссылки и сохраните его в переменной.

Пример кода по этим шагам:

C++:
Expand Collapse Copy
#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>

#define MAX_BUFFER_SIZE 1024

using namespace std;

int main() {
    int client_socket = socket(AF_INET, SOCK_STREAM, 0);
    if (client_socket < 0) {
        cerr << "Error: Failed to create socket" << endl;
        return 1;
    }

    struct sockaddr_in server_address;
    server_address.sin_family = AF_INET;
    server_address.sin_port = htons(80);
    server_address.sin_addr.s_addr = inet_addr("127.0.0.1");

    if (connect(client_socket, (struct sockaddr*)&server_address, sizeof(server_address)) < 0) {
        cerr << "Error: Failed to connect to server" << endl;
        return 1;
    }

    string request = "GET / HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n";
    if (send(client_socket, request.c_str(), request.length(), 0) < 0) {
        cerr << "Error: Failed to send request to server" << endl;
        return 1;
    }

    char buffer[MAX_BUFFER_SIZE] = {0};
    string response;

    while (true) {
        int bytes_received = recv(client_socket, buffer, MAX_BUFFER_SIZE, 0);
        if (bytes_received < 0) {
            cerr << "Error: Failed to receive data from server" << endl;
            return 1;
        } else if (bytes_received == 0) {
            break;
        } else {
            response.append(buffer, bytes_received);
        }
    }

    size_t start_pos = response.find("<a href=\"");
    if (start_pos != string::npos) {
        start_pos += strlen("<a href=\"");
        size_t end_pos = response.find("\"", start_pos);
        if (end_pos != string::npos) {
            string link = response.substr(start_pos, end_pos - start_pos);
            cout << "Link found: " << link << endl;
        }
    }

    close(client_socket);
    return 0;
}
Или можно использовать библиотеку сокетов, такую как socket.h или Winsock.h (для Windows).

Пример кода который устанавливает соединение с сервером, отправляет запрос и получает ответ:
C++:
Expand Collapse Copy
#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>

using namespace std;

int main() {
    // Создаем сокет
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == -1) {
        cout << "Ошибка создания сокета\n";
        return 1;
    }

    // Устанавливаем соединение
    sockaddr_in server;
    server.sin_addr.s_addr = inet_addr("127.0.0.1"); // IP-адрес сервера
    server.sin_family = AF_INET;
    server.sin_port = htons(80); // Порт HTTP сервера

    if (connect(sock, (sockaddr*)&server, sizeof(server)) < 0) {
        cout << "Ошибка соединения\n";
        return 1;
    }

    // Отправляем запрос на сервер
    const char* message = "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n";
    if (send(sock, message, strlen(message), 0) < 0) {
        cout << "Ошибка отправки запроса\n";
        return 1;
    }

    // Получаем ответ от сервера
    char buffer[1024] = {0};
    if (recv(sock, buffer, sizeof(buffer), 0) < 0) {
        cout << "Ошибка получения ответа\n";
        return 1;
    }

    // Ищем ссылку в ответе
    const char* link_start = strstr(buffer, "<a href=\"");
    if (link_start) {
        link_start += strlen("<a href=\"");
        const char* link_end = strchr(link_start, '\"');
        if (link_end) {
            char link[256];
            strncpy(link, link_start, link_end - link_start);
            link[link_end - link_start] = '\0';
            cout << "Ссылка: " << link << endl;
        }
    }

    // Закрываем сокет
    close(sock);

    return 0;
}

Этот код устанавливает соединение с HTTP сервером, отправляет запрос и получает ответ. Затем он ищет первую ссылку в HTML-коде ответа и выводит ее на экран.

Это только простой пример, и для реальной работы с сокетами тебе, возможно, потребуется реализовать более сложный код для работы с различными типами запросов и ответов.
я хочу от тебя дитей
 
Назад
Сверху Снизу