Я хочу написать программу на C/С++, которая будет динамически читать веб-страницу и извлекать из нее информацию. Например, представьте, хотите ли вы написать приложение для последующего просмотра и регистрации аукциона ebay. Есть ли простой способ захватить веб-страницу? Библиотека, которая предоставляет эту функциональность? И есть ли простой способ проанализировать страницу, чтобы получить конкретные данные?
Программное чтение веб-страницы
Ответ 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 - использование этого очень просто.
CUT_HTTPClient http;
http.GET("http://folder/file.htm", "c:/tmp/process_me.htm");
Вы также можете GET файлы и хранить их в буфере памяти (через CUT_DataSource
производные классы). Вся обычная поддержка HTTP есть - PUT, HEAD и т.д. Поддержка прокси-серверов - это легкий ветерок, а также безопасные сокеты.