以编程方式阅读网页

我想用C / C ++编写一个程序,它将dynamic地读取一个网页并从中提取信息。 举个例子,假设你想写一个应用程序来跟踪和loggingeBay拍卖。 有没有简单的方法来抓取网页? 一个提供这个function的库? 有没有一种简单的方法来parsing页面以获取特定的数据?

看看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。 这是更容易,有一个内置的方式。

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

你没有提到任何平台,所以我给你一个Win32的答案。

从Internet上下载任何东西的一个简单方法是将IBindStatusCallback参数设置为NULLURLDownloadToFile 。 为了使该函数更有用,需要实现callback接口。

你可以用套接字编程来实现,但是要实现可靠地获取页面所需的协议部分是非常棘手的。 最好使用像霓虹灯的图书馆。 这可能会在大多数Linux发行版中安装。 在FreeBSD下使用fetch库。

为了parsing数据,因为许多页面不使用有效的XML,所以需要实现启发式,而不是真正的基于yacc的parsing器。 您可以使用正则expression式或状态转换机器来实现这些。 正如你想要做的事情涉及到大量的反复试验,你最好使用脚本语言,比如Perl。 由于networking延迟较高,您不会看到任何性能差异。

有一个可用于Windows的免费TCP / IP库,支持HTTP和HTTPS – 使用它非常简单。

最终的TCP / IP

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

您也可以获取文件并将其存储在内存缓冲区中(通过CUT_DataSource派生类)。 所有常见的HTTP支持 – PUT,HEAD等。支持代理服务器是一件轻而易举的事情,安全套接字也是如此。

尝试使用像Qt这样的库,它可以从networking中读取数据,并从XML文档中获取数据。 这是一个如何阅读XML提要的例子。 例如,您可以使用易趣Feed。