Posts Tagged ‘html download’

下載網頁原始碼 (HTML downloader)

今天把以前找來的下載網頁原始碼的程式再重編一遍

以前找來的時候是用 Dev C++ 編的,現在要用 Visual Studio 重新編過一次

結果遇到了幾個問題

1. 把原本的 code 沒有更動後拿來編譯,編譯器跟我說wininet裡面有五百多個 error!! (嚇死我的毛),後來去 google 後,在 #include <wininet.h> 前面加上 #include <windows.h> 就可以了。
至於原因是什麼… 其實我也沒搞動 (攤手)

2. 編譯完之後一直無法辨識 InternetAttemptConnect、InternetOpen、InternetOpenUrl、InternetReadFile、InternetCloseHandle、InternetCloseHandle 這幾個function,後來才注意到原來# include <wininet.h> 同時也需要連結 wininet.lib 函式庫才行。

3. 到了終於可以執行後,一直在 InternetOpenUrl 的時候會連不上 (一直 return NULL) ,很努力地找了找,終於看到有人說是可能沒有權限可以連 URL ,後來編成 Release 版的程式就可以順利下載了!!

Header:

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <windows.h>
#include <wininet.h> // 需要連結wininet.lib才可以

using namespace std;

#define BUF_SIZE 1024

int Download(const string &url, ostream &output);

Cpp:

int Download(const string &url, ostream &output)
{
    char buff[BUF_SIZE], header[80];
    HINTERNET hUrl, hInet;
    DWORD rcv, total = 0;

    if(InternetAttemptConnect(0) != ERROR_SUCCESS) {
        printf("Internet connect failed.\n");
        return 0;
    }

    hInet = InternetOpen("downloader", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, NULL);
    if(hInet == NULL) {
        printf("Internet open failed.\n");
        return 0;
    }

    memset(header,0x0,sizeof(header));

    hUrl = InternetOpenUrl(hInet, url.c_str(), header, -1, INTERNET_FLAG_NO_CACHE_WRITE, 0);

    if(hUrl == NULL) {
        printf("Internet open url failed.\n");
        InternetCloseHandle(hInet);
        return 0;
    }

    do {
        InternetReadFile(hUrl, &buff, BUF_SIZE, &rcv);
        output.write(buff, rcv);
        total += rcv;
    }while(rcv > 0);

    InternetCloseHandle(hUrl);
    InternetCloseHandle(hInet);

    return total;
}

廣告