代码解说一个网络爬虫的实现过程(一)

会对这个话题感兴趣的兄弟,估计就不用我解释什么是网络爬虫了。呵~简单带一下:
网络爬虫,俗称蜘蛛,是一种自动化程序,能够抓取互联网上各站点的网页回来。之所以得以名,应该是把互联网比喻成一个由超链接组成的网,爬虫就可以从一个起始的链接开始,不断的地爬数据回来。
这个层次上讲,只要你给它一个入口,它就可以给你一个互联网。因为网络是连通的。但是,这是理论上的问题。
好了,回到正题,说说一个简单的爬虫的实现,及一些相关的技术点,以及在window平台下用C++如何实现它。
1) 爬行:
上网浏览是基于http协议80端口,发出各种GET or POST命令,网站服务器会响应合法的请求,并返回数据回来,所以,爬虫的工作基础就是不断去请求数据回来。
有两种方法,一种是自己封装socket ,模拟HTTP协议请求,去获取数据,实现有一复杂性,要求你对TCP/Ip协议比较了解,但优点是自己做到可控,且优化空间大;第二种方法是MS大佬已经提供操作应用层协议的库,包括HTTP,FTP等常用协议。它就是Winnet.
m_hHandleOpen = InternetOpen("InetURL/1.0",
INTERNET_OPEN_TYPE_PRECONFIG,
NULL,
NULL,
INTERNET_FLAG_DONT_CACHE/*0/*INTERNET_FLAG_ASYNC*/);//从缓存中读文件
if( m_hHandleOpen == 0 )
{
cout<<"InternetOpen Url "<< m_strUrl<<"error!!!"<<GetLastError()<<endl;
OnTaskFailed();
return;
}
int nTimeOut = 3000;
::InternetSetOption( m_hHandleOpen, INTERNET_OPTION_CONNECT_TIMEOUT , &nTimeOut, sizeof( nTimeOut ) );
m_hFile = InternetOpenUrl( m_hHandleOpen,
strUrl.c_str(),
NULL, 0, 0, 0 );
if( m_hFile == NULL )
{
cout<<"OperUrl Error:"<<GetLastError()<<endl;
}
if ( m_hFile )
{
do
{
memset( pBuf, 0, sizeof(BYTE)*BUFSIZE );
bRead = InternetReadFile( m_hFile, pBuf, sizeof(BYTE)*BUFSIZE, &dwNum); //
//读取BUFSIZE 字节时,进行查找html,找不到html 标识,认为不是HTML 页面
strBuf += (char*)pBuf;
}while ( bRead && dwNum > 0 );
}
delete[]pBuf;
InternetCloseHandle( m_hFile);
InternetCloseHandle( m_hHandleOpen );
以上几个API就可以完成页面的爬取工作了。