2014-02-17 3 views
0

C++ (Visual Studio 2013)로 전체 웹 페이지를 .txt 파일에 저장하려고합니다. 나는 cURL을 사용하고 있습니다. 모든 것이 잘 작동하지만 저장하려고하는 웹 사이트는 많은 자바 스크립트를 사용하여 페이지를 생성합니다. 그래서 웹 페이지를 cURL로 저장할 때 .txt 파일의 길이는 170 줄 밖에되지 않습니다. Google 크롬 (ctrl + s)을 사용하여 웹 페이지를 .htm 파일로 저장하면 .htm 파일에 2000 줄이 넘습니다. 완전히로드 된 웹 페이지를 파일로 저장하는 방법이 있습니까? 이것은 내가 사용 코드입니다 : 내 나쁜 영어에 대한 도움을C++ cURL - 전체 웹 페이지를 파일로 저장하는 방법?

struct MemoryStruct { 
    char *memory; 
    size_t size; 
}; 

static size_t 
WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) 
{ 
    size_t realsize = size * nmemb; 
    struct MemoryStruct *mem = (struct MemoryStruct *)userp; 

    mem->memory = (char*)realloc(mem->memory, mem->size + realsize + 1); 
    if (mem->memory == NULL) { 
     /* out of memory! */ 
     printf("not enough memory (realloc returned NULL)\n"); 
     return 0; 
    } 

    memcpy(&(mem->memory[mem->size]), contents, realsize); 
    mem->size += realsize; 
    mem->memory[mem->size] = 0; 

    return realsize; 
} 


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

    struct MemoryStruct chunk; 

    chunk.memory = (char*)malloc(1); /* will be grown as needed by the realloc above */ 
    chunk.size = 0; /* no data at this point */ 

    curl_global_init(CURL_GLOBAL_ALL); 

    /* init the curl session */ 
    curl_handle = curl_easy_init(); 

    /* specify URL to get */ 
    curl_easy_setopt(curl_handle, CURLOPT_URL, "http://www.example.com/"); 

    /* send all data to this function */ 
    curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); 

    /* we pass our 'chunk' struct to the callback function */ 
    curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk); 

    /* some servers don't like requests that are made without a user-agent 
    field, so we provide one */ 
    curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0"); 

    /* get it! */ 
    res = curl_easy_perform(curl_handle); 

    /* check for errors */ 
    if (res != CURLE_OK) { 
     fprintf(stderr, "curl_easy_perform() failed: %s\n", 
      curl_easy_strerror(res)); 
    } 
    else { 
     /* 
     * Now, our chunk.memory points to a memory block that is chunk.size 
     * bytes big and contains the remote file. 
     * 
     * Do something nice with it! 
     */ 

     printf("%lu bytes retrieved\n", (long)chunk.size); 
    } 
    std::ofstream oplik; 
    oplik.open("test.txt"); 
    oplik << chunk.memory; 
    oplik.close(); 

    /* cleanup curl stuff */ 
    curl_easy_cleanup(curl_handle); 

    if (chunk.memory) 
     free(chunk.memory); 

    /* we're done with libcurl, so clean it up */ 
    curl_global_cleanup(); 

    return 0; 
} 

감사하고 죄송합니다.

답변

1

cURL은 웹 서버에서 제공 한 내용 만 저장할 수 있습니다.

그 이상으로 저장하려면 웹 브라우저에서와 같이 웹 페이지를 작성하기 위해 자바 스크립트 인터프리터를 포함해야합니다.

+0

나는 이것을 어떻게하는지 모른다. Internet Explorer처럼 웹 페이지를 열고 생성 된 데이터를 가져 오는 더 쉬운 방법은 없습니까? – Mona

+0

Windows 나 IE에 익숙하지 않기 때문에 어느 것을 모르겠습니다. 그러나 나는 이것을 상상할 수있는 Component가있다. 그렇지 않으면 [embed V8] (https://developers.google.com/v8/embed) 또는 http://stackoverflow.com/q/93692/1741542 –

관련 문제