第一个方法是使用MFC里面的 <afxinet.h>

 CString GetHttpFileData(CString strUrl)
{
CInternetSession Session("Internet Explorer", );
CHttpFile *pHttpFile = NULL;
CString strData;
CString strClip;
pHttpFile = (CHttpFile*)Session.OpenURL(strUrl);
while ( pHttpFile->ReadString(strClip) )
{
strData += strClip;
}
return strData;
}

要讲一下,pHttpFile->ReadString() 每次可能只读一个数据片断,读多少次取决于网络状况,所以要把每次读到的数据加到总数据的尾部,用了CString 省去了缓冲区处理:) 
别忘了包含头文件#include <afxinet.h> 在工程设置,里面要选择 using MFC 要不然编译不了

第二种是使用WinNet的纯API实现的

#define MAXBLOCKSIZE 1024
#include <windows.h>
#include <wininet.h> #pragma comment(lib, "wininet.lib") void GetWebSrcCode(const char *Url); int _tmain(int argc, _TCHAR* argv[])
{
GetWebSrcCode("http://www.cnblogs.com/"); return ;
} void GetWebSrcCode(const char *Url)
{
HINTERNET hSession = InternetOpen("zwt", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, );
if (hSession != NULL)
{
HINTERNET hURL = InternetOpenUrl(hSession, Url, NULL, , INTERNET_FLAG_DONT_CACHE, );
if (hURL != NULL)
{
char Temp[MAXBLOCKSIZE] = {};
ULONG Number = ; FILE *stream;
if( (stream = fopen( "E:\\test.html", "wb" )) != NULL )
{
while (Number > )
{
InternetReadFile(hURL, Temp, MAXBLOCKSIZE - , &Number);
fwrite(Temp, sizeof (char), Number , stream);
}
fclose( stream );
} InternetCloseHandle(hURL);
hURL = NULL;
} InternetCloseHandle(hSession);
hSession = NULL;
}
}

第三种就是使用非封装过的Socket实现了

int main(int argc, char* argv[])
{
SOCKET hsocket;
SOCKADDR_IN saServer;
WSADATA wsadata;
LPHOSTENT lphostent;
int nRet;
char Dest[];
char* host_name="blog.sina.com.cn";
char* req="GET /s/blog_44acab2f01016gz3.html HTTP/1.1\r\n"
"User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET4.0C; .NET4.0E; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)\r\n"
"Host:blog.sina.com.cn\r\n\r\n"; // 初始化套接字
if(WSAStartup(MAKEWORD(,),&wsadata))
printf("初始化SOCKET出错!");
lphostent=gethostbyname(host_name);
if(lphostent==NULL)
printf("lphostent为空!");
hsocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
saServer.sin_family = AF_INET;
saServer.sin_port = htons();
saServer.sin_addr =*((LPIN_ADDR)*lphostent->h_addr_list);
// 利用SOCKET连接
nRet = connect(hsocket,(LPSOCKADDR)&saServer,sizeof(SOCKADDR_IN));
if(nRet == SOCKET_ERROR)
{
printf("建立连接时出错!");
closesocket(hsocket);
return ;
}
// 利用SOCKET发送 nRet = send(hsocket,req,strlen(req),);
if(nRet==SOCKET_ERROR)
{
printf("发送数据包时出错!");
closesocket(hsocket);
}
nRet=;
while(nRet>)
{
// 接收返回数据包
nRet=recv(hsocket,(LPSTR)Dest,sizeof(Dest),);
if(nRet>)
Dest[nRet]=;
else
Dest[]=;
char sDest[] = {};
UTF8_2_GB2312(sDest,nRet,Dest,nRet);
// 显示返回数据包的大小、内容
//printf("\nReceived bytes:%d\n",nRet);
printf("Result:\n%s",sDest);
}
}

另外,以上我们获取网页的时候,获取到的可能是UTF8,似乎目前大多数网站都用的这种编码吧!下面是编码转换。

void UTF_8ToUnicode(wchar_t* pOut,char *pText)
{
char* uchar = (char *)pOut;
uchar[] = ((pText[] & 0x0F) << ) + ((pText[] >> ) & 0x0F);
uchar[] = ((pText[] & 0x03) << ) + (pText[] & 0x3F);
}
void Gb2312ToUnicode(wchar_t* pOut,char *gbBuffer)
{
::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,,pOut,);
}
void UTF_8ToGB2312(char*pOut, char *pText, int pLen)
{
char Ctemp[];
memset(Ctemp,,);
int i = ,j = ;
while(i < pLen)
{
if(pText[i] >= )
{
pOut[j++] = pText[i++];
}
else
{
WCHAR Wtemp;
UTF_8ToUnicode(&Wtemp,pText + i);
UnicodeToGB2312(Ctemp,Wtemp);
pOut[j] = Ctemp[];
pOut[j + ] = Ctemp[];
i += ;
j += ;
}
}
pOut[j] ='\n';
return;
}

这是是转换成GB2312的代码

Windows下比较简单的获取网页源码的方法的更多相关文章

  1. vc++获取网页源码之使用import+接口方式

    1.使用IWinHttpRequest获取网页源码 首先要创建基于对话框的mfc应用程序 2.import+接口方式 首先导入winhttp.dll,使用IWinHttpRequest接口 #impo ...

  2. QT:轻松获取网页源码

    获取网页源码的小例子,代码很简单,就不多作解释了. 不过一定要注意网页的编码问题,否则会出现乱码的!!! #include <QtCore> #include <QtNetwork& ...

  3. Python爬虫学习之获取网页源码

    偶然的机会,在知乎上看到一个有关爬虫的话题<利用爬虫技术能做到哪些很酷很有趣很有用的事情?>,因为强烈的好奇心和觉得会写爬虫是一件高大上的事情,所以就对爬虫产生了兴趣. 关于网络爬虫的定义 ...

  4. vc++获取网页源码

    1. 获取网页源码的步骤: com组件的初始化 创建WinHttpRequest对象 创建并实例化WinHttpRequest组件 调用Open方法打开连接 调用Send方法发送请求 使用Respon ...

  5. 高效获取网页源码COM

    目前获取网页源码有几种方法: 1.WebClient下载页面2.HttpWebRequest发请求获取3.com组件xmlhttp获取 三者比较:WebClient代码最少,效率最慢:xmlhttp代 ...

  6. Python3.x获取网页源码

    Python3.x获取网页源码 1,获取网页的头部信息以确定网页的编码方式: import urllib.request res = urllib.request.urlopen('http://ww ...

  7. C语言之socket获取网页源码

    写爬虫也许你用的是python,类似urlopen(url).read()即可获得普通的网页的源码,或者用的java的网络库加上流操作,或者其他高级语言.但你有没有想过使用C语言来实现呢?我曾经以为用 ...

  8. Python3 Selenium WebDriver网页的前进、后退、刷新、最大化、获取窗口位置、设置窗口大小、获取页面title、获取网页源码、获取Url等基本操作

    Python3 Selenium WebDriver网页的前进.后退.刷新.最大化.获取窗口位置.设置窗口大小.获取页面title.获取网页源码.获取Url等基本操作 通过selenium webdr ...

  9. c# HttpClient获取网页源码

    #region 获取网页源码 public static string HttpClientGetHtmls(string url) { try { var client = new HttpClie ...

随机推荐

  1. python将nan, inf转为特定的数字

    最近,处理两个矩阵的点除,得到结果后,再作其他的计算,发现有些内置的函数不work:查看得到的数据,发现有很多nan和inf,导致python的基本函数运行不了,这是因为在除的过程中分母出现0的缘故. ...

  2. Scala:访问修饰符、运算符和循环

    http://blog.csdn.net/pipisorry/article/details/52902234 Scala 访问修饰符 Scala 访问修饰符基本和Java的一样,分别有:privat ...

  3. ubuntu蓝牙音响配对成功但在声音设置中无法设置 解决

    ubuntu蓝牙音响配对成功但在声音设置中无法设置 解决 首先,连接蓝牙 但是,在声音设置中如下: 都没有发现设备??? 打开终端输入: ~$ pactl load-module module-blu ...

  4. TCP的发送系列 — 发送缓存的管理(二)

    主要内容:从TCP层面判断发送缓存的申请是否合法,进程因缺少发送缓存而进行睡眠等待. 因为有发送缓存可写事件而被唤醒. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zh ...

  5. Android初级教程:shape的基本用法

    转载本文请注明出处:http://blog.csdn.net/qq_32059827/article/details/52203347   点击打开链接 在自定义进度条之前,先来学习一下shape的用 ...

  6. 详解EBS接口开发之采购接收&退货处理之关键API--(补充)

    PROCEDURE process_rcv_online(p_api_version IN NUMBER, p_init_msg_list IN VARCHAR2 DEFAULT fnd_api.g_ ...

  7. sql的简单提高效率方法

    少用in操作(效率极差),尽量用表关联代替 select要指定列,不要*(*会读入所有数据,而指定列则只提取涉及的列,减少io) 尽量有where(减少读取量),where操作列尽量有索引(加快查询) ...

  8. 如何正确的理解和解决 ORA-01843:not a valid month

    今天码代码的时候遇到了这个问题,因为oracle用的比较少,所在查询了一下. 顿时傻眼,有很多的贴子说是因为nls_date_language的问题,还要改会话级的NLS_DATE_LANGUAGE设 ...

  9. 可视化分析工具Cytoscape使用记录

    最近项目要使用到可视化分析工具Cytoscape,所以会花费很多的时间跟精力来整理Cytoscape软件使用和开发的相关资料,希望写下的文章能减少有兴趣的同行学习跟开发所走的弯路时间.同时也是因为百度 ...

  10. 新手学python(3):yield与序列化

    1 Yield生成器 Yield是我在其他语言中没有见过的一个属性,算是python的一大特色,用好之后可以使代码更简洁.考虑一个简单的例子,文件的遍历.要遍历一个目录下的所有文件需要递归的操作.如果 ...