Программное чтение веб-страницы - PullRequest
30 голосов
/ 23 декабря 2008

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

Ответы [ 6 ]

41 голосов
/ 23 декабря 2008

Посмотрите библиотеку cURL :

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

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

17 голосов
/ 11 сентября 2012

Код 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;
}
4 голосов
/ 23 декабря 2008

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

Окончательный TCP / IP

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

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

3 голосов
/ 30 декабря 2008

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

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

2 голосов
/ 23 декабря 2008

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

2 голосов
/ 23 декабря 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...