Подтвердить что ты не робот

Программное чтение веб-страницы

Я хочу написать программу на C/С++, которая будет динамически читать веб-страницу и извлекать из нее информацию. Например, представьте, хотите ли вы написать приложение для последующего просмотра и регистрации аукциона ebay. Есть ли простой способ захватить веб-страницу? Библиотека, которая предоставляет эту функциональность? И есть ли простой способ проанализировать страницу, чтобы получить конкретные данные?

4b9b3361

Ответ 1

Посмотрите на cURL library:

 #include <stdio.h>
 #include <curl/curl.h>

 int main(void)
 {
   CURL *curl;
   CURLcode res;

   curl = curl_easy_init();
   if(curl) {
     curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se");
     res = curl_easy_perform(curl);
      /* always cleanup */
    curl_easy_cleanup(curl);
   }
   return 0;
 }

BTW, если С++ строго не требуется. Я рекомендую вам попробовать С# или Java. Это намного проще, и есть встроенный способ.

Ответ 2

Код Windows:

#include <winsock2.h>
#include <windows.h>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
int main (){
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) {
        cout << "WSAStartup failed.\n";
        system("pause");
        return 1;
    }
    SOCKET Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    struct hostent *host;
    host = gethostbyname("www.google.com");
    SOCKADDR_IN SockAddr;
    SockAddr.sin_port=htons(80);
    SockAddr.sin_family=AF_INET;
    SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr);
    cout << "Connecting...\n";
    if(connect(Socket,(SOCKADDR*)(&SockAddr),sizeof(SockAddr)) != 0){
        cout << "Could not connect";
        system("pause");
        return 1;
    }
    cout << "Connected.\n";
    send(Socket,"GET / HTTP/1.1\r\nHost: www.google.com\r\nConnection: close\r\n\r\n", strlen("GET / HTTP/1.1\r\nHost: www.google.com\r\nConnection: close\r\n\r\n"),0);
    char buffer[10000];
    int nDataLength;
    while ((nDataLength = recv(Socket,buffer,10000,0)) > 0){        
        int i = 0;
        while (buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r') {
            cout << buffer[i];
            i += 1;
        }
    }
    closesocket(Socket);
        WSACleanup();
    system("pause");
    return 0;
}

Ответ 3

Вы не упоминаете какую-либо платформу, поэтому я даю вам ответ на Win32.

Один простой способ загрузить что-либо из Интернета - это URLDownloadToFile с параметром IBindStatusCallback, установленным на NULL. Чтобы сделать функцию более полезной, необходимо выполнить интерфейс обратного вызова.

Ответ 4

Вы можете сделать это с помощью программирования сокетов, но сложно реализовать части протокола, необходимые для надежной загрузки страницы. Лучше использовать библиотеку, например neon. Вероятно, это будет установлено в большинстве дистрибутивов Linux. В FreeBSD используйте библиотеку fetch.

Для синтаксического анализа данных, поскольку многие страницы не используют действительный XML, вам необходимо реализовать эвристику, а не реальный синтаксический анализатор на основе yacc. Вы можете реализовать их с помощью регулярных выражений или машины перехода состояния. Поскольку то, что вы пытаетесь сделать, связано с большим количеством проб и ошибок, вам лучше использовать язык сценариев, например Perl. Из-за высокой латентности сети вы не увидите никакой разницы в производительности.

Ответ 5

Попробуйте использовать библиотеку, такую ​​как Qt, которая может считывать данные из всей сети и получать данные из XML-документа. Это - пример того, как читать XML-канал. Например, вы можете использовать ebay-канал.

Ответ 6

Существует бесплатная библиотека TCP/IP, доступная для Windows, которая поддерживает HTTP и HTTPS - использование этого очень просто.

Конечный TCP/IP

CUT_HTTPClient http;
http.GET("http://folder/file.htm", "c:/tmp/process_me.htm");    

Вы также можете GET файлы и хранить их в буфере памяти (через CUT_DataSource производные классы). Вся обычная поддержка HTTP есть - PUT, HEAD и т.д. Поддержка прокси-серверов - это легкий ветерок, а также безопасные сокеты.