{{ v.name }}
{{ v.cls }}类
{{ v.price }} ¥{{ v.price }}
搜索引擎,他们的资料都是通过程序,去自动获取别的网站的html代码,然后进行分析,再从中获中一些有用的信息,分类,压缩,并存到数据库里面,由于绝大部份html页面都有一些超链接,图片链接之类的信息,因些读取这些信息,就可以获得更多的网页地址,通过一些更深层次的算法,迭代周期性地去读取所有的地址,就达到获取因特网信息的目的了,这样讲还是太抽象了,还是让我分步骤讲一下吧。
1、首先,肯定是有起始的搜索地址的,比如我决定从http://www.hao123.com开始搜索,因为它是网址分类网站嘛,里面包含了许多的网站链接地址,所以从这个网站开始的话,你抓取了第一个页面,并进行分析,就可以获得上百个别的网站的链接地址了,将它们存起来先,待我搜我这个网站,我就一个一个地搜其它网站,并同理获得更多更多的网址,电脑干活不怕累,你别让它热到,它就会不日不夜地帮你一个一个地搜下去了,如果你绝顶聪明,或许你像google一样,财大气粗,请上n个有n年经验的工程师,不断地优化搜索与存取等的算法,你的搜索引擎就强悍了,你再像google一样买上百把万台服务器,租上几十座高楼,安装n台空调,将网络带宽扩展到nm,就让程序跑吧,跟着你就等别人来送钱给你花了。
2、像第一点那样按网址链搜索还不够,因为很多网址你根本链不过去,因为人家从来没在别的地方用过嘛,你没理由不让人家这样做的啊,又或者人家刚建的网站,还没来得及在别人的论坛,或是别人的网站上到处贴他们的网址嘛,于是乎每个大的搜索网站都有这样的一个页面,让别人提交他们的网站,如果你的网站是新的站的,我就建议你去提交一下,不然,或许,可能,一不小心你就要等上一年半载的,人家搜索引擎才好不容易从别的地方找到你的网站,呵呵,说笑的,只要你网站能上网,他们肯定有办法得到你的网站的地址的,不然他们混什么混。
3、好了,网站得到了,下一步就是将你们的信息都作一个缓存,以后别人搜索时,我就可以刷地一声将他们显示出来,不然的话,你的网站的带宽只有那么一k两k,你想人家搜索引擎等你啊,不可能的,这样的话搜的人全跑了,不知道你们听说过百度的图片搜吧存了n多黄色图片没,以前特多,后来慢慢被找出来干掉了,呵呵,就是因为百度把图片找出来,全存起来了,即使人家黄色网站被封了,百度就成了最大的黄色图片网站了,强吧!差点也被封,呵呵。不过缓存因特网的页面可不是开玩笑的,你真想存上一半三分之一的,一来你要用最狠的无损压缩算法把它们压缩之后存进数据库,二来你又得买上n台服务器,装上n个n大的硬盘,然后分存地将它们存起来,太复杂了,我说不明白也压根不懂它到底是怎么做到的,有兴趣你自己打电话问google去。
javasocket方式
importjava.io.bufferedreader;
importjava.io.bufferedwriter;
importjava.io.inputstreamreader;
importjava.io.outputstreamwriter;
importjava.net.inetaddress;
importjava.net.socket;
/**
*
*@authordao
*/
publicclasssearch
{
publicstaticvoidmain(stringargs[])
{
//你想获取代码的网站
stringstrserver="www.baidu.com";
//起始页面,/为根页
stringstrpage="/";
try
{
//设置端口,通常http端口不就是80罗,你在地址栏上没输就是这个值
intport=80;
//用域名反向获得ip地址
inetaddressaddr=inetaddress.getbyname(strserver);
//建立一个socket
socketsocket=newsocket(addr,port);
//发送命令,无非就是在socket发送流的基础上加多一些握手信息,详情请了解http协议
bufferedwriterwr=newbufferedwriter(newoutputstreamwriter(socket.getoutputstream(),"utf-8"));
wr.write("get"+strpage+"http/1.0rn");
wr.write("host:"+strserver+"rn");
wr.write("accept:*/*rn");
wr.write("rn");
wr.flush();
//接收socket返回的结果,并打印出来
bufferedreaderrd=newbufferedreader(newinputstreamreader(socket.getinputstream()));
stringline;
while((line=rd.readline())!=null)
{
system.out.println(line);
}
wr.close();
rd.close();
}
catch(exceptione)
{
e.printstacktrace();
}
}
}
不过获取代码的方式除了直接用socket的inputstream/outputstream之外,还有另外两种方式,分别是
1、url类方式
publicclasstestsocket2
{
publicstaticvoidmain(stringargs[]){
try{urlurl=newurl("http://www.sina.com");bufferedreaderbr=newbufferedreader(newinputstreamreader(url.openstream()));strings="";stringbuffersb=newstringbuffer();while((s=br.readline())!=null){sb.append(s+"rn");}system.out.println(sb.tostring());}catch(exceptionex){ex.printstacktrace();}
}
}
2、httpurlconnection方式
publicclasstestsocket3
{
publicstaticvoidmain(string[]args)
{
try{urlurlmy=newurl("http://www.yosjob.com");httpurlconnectioncon=(httpurlconnection)urlmy.openconnection();con.setfollowredirects(true);con.setinstancefollowredirects(true);con.connect();bufferedreaderbr=newbufferedreader(newinputstreamreader(con.getinputstream()));strings="";stringbuffersb=newstringbuffer();while((s=br.readline())!=null){sb.append(s+"rn");}system.out.println(sb.tostring());}catch(exceptione){e.printstacktrace();}
}
}
不过这些的最终原理也是一个样,获取的内容也小有差异,具体用哪种还得根据实际需要,或你的爱好!