programing

프로그래밍 방식으로 웹 페이지 읽기

shortcode 2023. 9. 20. 21:15
반응형

프로그래밍 방식으로 웹 페이지 읽기

C/C++로 웹페이지를 동적으로 읽고 그로부터 정보를 추출하는 프로그램을 작성하고 싶습니다.예를 들어, ebay 경매를 팔로우하고 기록하기 위한 신청서를 작성하고자 한다면 상상해 보세요.웹 페이지를 쉽게 잡을 수 있는 방법이 있습니까?이 기능을 제공하는 라이브러리?그리고 특정 데이터를 얻기 위해 페이지를 파싱하는 쉬운 방법이 있습니까?

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#이나 자바를 시도해보길 권장합니다.그것은 훨씬 쉽고 내장된 방법이 있습니다.

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

HTTP 및 HTTPS를 지원하는 Windows용 무료 TCP/IP 라이브러리가 있습니다. 이 라이브러리를 사용하는 것은 매우 간단합니다.

궁극 TCP/IP

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

를 통해할 수도 .CUT_DataSource파생 클래스).일반적인 HTTP 지원은 모두 여기에 있습니다 - PUT, HEAD 등. , 보안 소켓과 마찬가지로 프록시 서버에 대한 지원도 간단합니다.

네트워크를 통해 데이터를 읽고 xml 문서에서 데이터를 가져올 수 있는 Qt와 같은 라이브러리를 사용해 보십시오.다음은 xml 피드를 읽는 방법의 예입니다.예를 들어 ebay 피드를 사용할 수 있습니다.

소켓 프로그래밍으로 할 수는 있지만 페이지를 안정적으로 가져오는 데 필요한 프로토콜의 부분을 구현하는 것은 어렵습니다.네온같은 도서관을 이용하는게 좋습니다.대부분의 Linux 배포판에 설치될 가능성이 높습니다.언더 FreeBSD는 fetch 라이브러리를 사용합니다.

데이터를 구문 분석하려면 많은 페이지에서 유효한 XML을 사용하지 않으므로 실제 acc 기반 구문 분석기가 아니라 휴리스틱을 구현해야 합니다.정규식 또는 상태 전환 기계를 사용하여 이를 구현할 수 있습니다.시행착오를 많이 겪어야 하므로 Perl과 같은 스크립트 언어를 사용하는 것이 좋습니다.네트워크 지연 시간이 길기 때문에 성능에 차이가 없습니다.

플랫폼에 대한 언급이 없으셔서 Win32에 대한 답변을 드립니다.

할 수 있는 은 입니다.URLDownloadToFileIBindStatusCallback매개 변수를 다음으로 설정NULL하려면 콜백 기능을 보다 유용하게 사용하기 위해서는 콜백 인터페이스를 구현해야 합니다.

멀티플랫폼 QT 라이브러리에서 수행할 수 있습니다.

QByteArray WebpageDownloader::downloadFromUrl(const std::string& url)
{
    QNetworkAccessManager manager;
    QNetworkReply *response = manager.get(QNetworkRequest(QUrl(url.c_str())));
    QEventLoop event;
    QObject::connect(response, &QNetworkReply::finished, &event, &QEventLoop::quit);
    event.exec();
    return response->readAll();
}

해당 데이터는 파일에 저장하거나 std:::string으로 변환할 수 있습니다.

const string webpageText = downloadFromUrl(url).toStdString();

추가할 필요가 있다는 것을 기억하세요.

QT       += network

QT 프로젝트 구성으로 코드를 컴파일합니다.

언급URL : https://stackoverflow.com/questions/389069/programmatically-reading-a-web-page

반응형