搜索引擎的那些事(网页下载)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
前面我们只是开了一个搜索引擎的头,下面我们就要对搜索引擎的各个内容进行分析和解剖了。当然,我们这里可以扯一些别的东西。其实,在中国现在的互联网市场,搜索引擎的网站其实已经很多了,除了大家熟悉的百度、谷歌,还有很多其他门户网站开发的搜索引擎,这其中就包括搜狗、有道、搜搜之类的。当然,除了门户网站开发的搜索引擎,很多国字号的企业也开发了自己的搜索网站,你比如说盘古搜索、即刻搜索等等。大家这么关注搜索,一方面确实是因为搜索是我们上网过程中必不可少的工具,而且另一方面搜索也是目前为止互联网上盈利模式比较清晰的产品之一。说到盈利,大家可以看看百度每个季度的财报就清楚了,其实搜索的利润是非常可观的,在全国几十万的商户,每个商户每年贡献数万乃至数十万的成本投入,这些都构成了非常好的商业盈利模式,如此丰厚的利润估计只有房地产行业可以媲美。
做搜索引擎不是一件复杂的事情,但是做好搜索引擎确实一件复杂的事情。这个基本道理其实放到哪个行业都是一样的。当然,我们编写的目的不是为了赚钱,所以可以从最基本的知识点开始,复杂和优化的工作可以慢慢解决嘛。
编写网页的下载代码,其实我不擅长。最好的网页下载方式其实就是利用socket根据http协议进行下载,但是我等不及了。所以在网络上寻找到了一个可以利用windows网络库下载网页的方法。当然和自己编写socket的方法相比,这种方法可能效率上不是最高的。但是没有关系,我们可以先把流程学习下来,后面再考虑socket的优化工作。
#include <stdio.h>#include <windows.h>#include <wininet.h>#define U8 unsigned char#define U32 unsigned int#define MAX_BLOCK_SIZE 1024#pragma comment(lib, "wininet.lib")static void download(const char* url, const char* path){U8 buffer[MAX_BLOCK_SIZE];U32 iNumber;FILE* hFile;HINTERNET hSession;HINTERNET hUrl;hSession = InternetOpen("RookIE/1.0", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);if(NULL == hSession){return;}hUrl = InternetOpenUrl(hSession, url, NULL, 0, INTERNET_FLAG_DONT_CACHE, 0);if(NULL == hUrl){goto error1;}hFile = fopen(path, "wb");if(NULL == hFile){goto error2;}iNumber = 1;while(iNumber > 0){InternetReadFile(hUrl, buffer, MAX_BLOCK_SIZE -1, &iNumber);fwrite(buffer, sizeof(char), iNumber, hFile);}fclose(hFile);error2:InternetCloseHandle(hUrl);error1:InternetCloseHandle(hSession);}int main(int argc, char* argv[]){download("http://www.baidu.com", "C:/www.baidu.com.html");return 1;}这段代码的内容不复杂,但是对于我们来说已经够了。全部网页下载的函数都是由download来完成了,其中函数有两个输入参数,前者是下载的网页域名,后者是本地保存的地址。下载网页的基本操作就是利用InternetOpenUrl下载网页数据,再利用fwrite保存到本地即可,当然windows的网络库函数帮助我们省略了很多的工作,不过这对我们来说不是很重要。毕竟对我们来说,最重要的还是如何下载网页。