代码解说一个网络爬虫的实现过程(一) http://www.it-park.cn/Group/TopicInfo.aspx?TopicIndex=6
2007-10-29 16:14
751 查看
代码解说一个网络爬虫的实现过程(一)
2007-10-29 15:48:48
-
会对这个话题感兴趣的兄弟,估计就不用我解释什么是网络爬虫了。呵~简单带一下:
网络爬虫,俗称蜘蛛,是一种自动化程序,能够抓取互联网上各站点的网页回来。之所以得以名,应该是把互联网比喻成一个由超链接组成的网,爬虫就可以从一个起始的链接开始,不断的地爬数据回来。
这个层次上讲,只要你给它一个入口,它就可以给你一个互联网。因为网络是连通的。但是,这是理论上的问题。
好了,回到正题,说说一个简单的爬虫的实现,及一些相关的技术点,以及在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就可以完成页面的爬取工作了。
相关文章推荐
- 写了一个生成迷宫的算法:),贴代码,效果见 http://www.dullwolf.cn/Wall/
- SQL Server使用Bulk Insert把一个文本导入到数据库--http://www.wangchao.net.cn/it/detail_59013.html
- 一个plus js代码,作用是把所有的tooltip格式化后转变一个层,特定输出(效果见http://www.floatfly.cn)
- fstat、stat和lstat 区别(转) http://www.cnitblog.com/guopingleee/archive/2008/11/13/51411.aspx
- ssh反向连接和简单实现 转http://www.broncho.cn/forum/viewtopic.php?p=1116
- http://www.cnitblog.com/dotnetbbs/archive/2007/11/13/36223.aspx
- 中式与西式网页设计的差别http://www.backboneitgroup.com/china-search-differences.htm
- Linux 系统内核空间与用户空间通信的实现与分析 from [http://www-900.ibm.com/developerWorks/cn/linux/]
- 浅析ASP.NET的Page.IsPostBack 属性http://www.sina.com.cn 2008年05月06日 11:33 IT168.com
- 通过分析 JDK 源代码研究 TreeMap 红黑树算法实现 refer from http://www.ibm.com/developerworks/cn/java/j-lo-tree/index.html?ca=drs-
- C#调用WebService实现天气预报 http://www.webxml.com.cn
- 各种工具使用手册:http://www.itshouce.com.cn/linux/linux-tcpdump.html 关于tcpdump!!!!
- 转载一个SAP下载工具的代码,仅用于学习(来源于:http://www.dalestech.com/)
- 一个定期翻译国外Android优质的技术、开源库、软件架构设计、测试等文章的开源项目 http://www.devtf.cn
- Skinned Mesh 原理解析和一个最简单的实现示例 作者:n5 Email: happyfirecn##yahoo.com.cn Blog: http://blog.csdn.net/n5
- 工作流实验室正式开通,提供一个有关k2.net和wf等工作流方面交流的平台,地址http://www.flowlab.cn
- VB 实现大文件的分割与恢复,引用 ADODB.Stream 提供一个过程代码
- 因ARP欺骗网站源文件被注入了代码http://www.cnbruce.com/blog/showlog.asp?cat_id=32&log_id=1191
- 一个http请求的详细过程(转自http://www.cnblogs.com/ly312/archive/2011/05/30/2063462.html)
- 014敲代码将一个栈按升序排序,对这个栈是怎样实现的,你不应该做不论什么特殊的如果(keep it up)