zoukankan      html  css  js  c++  java
  • c++ 下载网页(使用WinHttp)

    // WinHttpTest.cpp : 定义控制台应用程序的入口点。
    //
    #include <stdafx.h>
    #include <vector>
    #include <winsock2.h>
    #include <Winhttp.h>
    //#include <urlmon.h>
    #include <windows.h>
    #include <iostream>
    #include <fstream>
    #include <string>
    #include "AtlBase.h"
    #include "AtlConv.h"
    using namespace std;
    string GetHost(string strUrl)
    {
        int indexHttp = strUrl.find("http://");
        if(indexHttp != -1)
        {
            strUrl = strUrl.substr(7);
        }
        else
            return "";
        int indexSlash = strUrl.find("/");
        if(indexSlash != -1)
        {
            return strUrl.substr(0, indexSlash);
        }
        else
            return strUrl;
        return "";
    }

    string GetRequestStr(string strUrl)
    {
        int indexHttp = strUrl.find("http://");
        if(indexHttp != -1)
        {
            strUrl = strUrl.substr(7);
        }
        else
            return "";
        int indexSlash = strUrl.find("/");
        if(indexSlash == -1)
        {
            return "";
        }
        else
            return strUrl.substr(indexSlash);
    }

    string GetHtml(string strUrl)
    {
        string strHost = GetHost(strUrl);
        string strRequestStr = GetRequestStr(strUrl);
        USES_CONVERSION;
        LPCWSTR host = A2CW(strHost.c_str());
        LPCWSTR requestStr = A2CW(strRequestStr.c_str());
        
        //Variables 
        DWORD dwSize = 0;
        DWORD dwDownloaded = 0;
        LPSTR pszOutBuffer;
        vector <string>  vFileContent;
        BOOL  bResults = FALSE;
        HINTERNET  hSession = NULL, 
            hConnect = NULL,
            hRequest = NULL;

        // Use WinHttpOpen to obtain a session handle.
        hSession = WinHttpOpen(L"WinHTTP Example/1.0",  
            WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
            WINHTTP_NO_PROXY_NAME, 
            WINHTTP_NO_PROXY_BYPASS, 0);

        // Specify an HTTP server.
        if (hSession)
            hConnect = WinHttpConnect(hSession, host,
            INTERNET_DEFAULT_HTTP_PORT, 0);

        // Create an HTTP request handle.
        if (hConnect)
            hRequest = WinHttpOpenRequest(hConnect, L"GET", requestStr,
            NULL, WINHTTP_NO_REFERER, 
            NULL, 
            NULL);

        // Send a request.
        if (hRequest)
            bResults = WinHttpSendRequest(hRequest,
            WINHTTP_NO_ADDITIONAL_HEADERS,
            0, WINHTTP_NO_REQUEST_DATA, 0
            00);


        // End the request.
        if (bResults)
            bResults = WinHttpReceiveResponse(hRequest, NULL);

        // Keep checking for data until there is nothing left.
        if (bResults)
            do 
            {

                // Check for available data.
                dwSize = 0;
                if (!WinHttpQueryDataAvailable( hRequest, &dwSize))
                    printf( "Error %u in WinHttpQueryDataAvailable.\n",
                    GetLastError());

                // Allocate space for the buffer.
                pszOutBuffer = new char[dwSize+1];
                if (!pszOutBuffer)
                {
                    printf("Out of memory\n");
                    dwSize=0;
                }
                else
                {
                    // Read the Data.
                    ZeroMemory(pszOutBuffer, dwSize+1);

                    if (!WinHttpReadData( hRequest, (LPVOID)pszOutBuffer, 
                        dwSize, &dwDownloaded))
                    {
                        printf( "Error %u in WinHttpReadData.\n"
                            GetLastError());
                    }
                    else
                    {
                        printf("%s", pszOutBuffer);
                        // Data in vFileContent
                        vFileContent.push_back(pszOutBuffer);
                    }

                    // Free the memory allocated to the buffer.
                    delete [] pszOutBuffer;
                }

            } while (dwSize>0);


            // Report any errors.
            if (!bResults)
                printf("Error %d has occurred.\n",GetLastError());

            // Close any open handles.
            if (hRequest) WinHttpCloseHandle(hRequest);
            if (hConnect) WinHttpCloseHandle(hConnect);
            if (hSession) WinHttpCloseHandle(hSession);
            string strHtml = "";
            for (int i = 0; i < (int) vFileContent.size();i++)
            {
                strHtml += vFileContent[i];
            }
            // Write vFileContent to file
            
    //写入文件
            
    //ofstream out("test.txt",ios::binary);

            
    //for (int i = 0; i < (int) vFileContent.size();i++)
            
    //{
            
    //    string str = vFileContent[i];
            
    //    out << str;
            
    //    //cout << str << endl;
            
    //}
            
    //out.close();
            
    //int iTest;
            
    //cin >> iTest;
            return strHtml;
    }

    int _tmain(int argc, _TCHAR* argv[])
    {
        string str = GetHtml("http://bbs.bccn.net/thread-294526-1-1.html");
        cout << str << endl;
        system("pause");
        return 0;
    }
    源码下载
  • 相关阅读:
    1.初识Redis
    2.API的理解和使用
    8.rabbitmq RPC模拟微服务架构中的服务调用
    9.[完]其他常用的rabbitmq的参数和设置
    6.Header交换机之模拟验证用户身份
    C#中复制文件夹及文件的两种方法
    python通过递归将多维字典转化为二维
    python venv flask gunicorn 部署与 pycharm 连接
    Nagios(centos 6.5)调用NSClient++/NRPE+Powershell脚本(windows server 2008 r2)监控网络情况
    Nagios 调用华为云短信平台进行报警
  • 原文地址:https://www.cnblogs.com/barrysgy/p/2354597.html
Copyright © 2011-2022 走看看