﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-醉意的未来-文章分类-互联网技术</title><link>http://www.cnitblog.com/kenlen/category/1180.html</link><description>路漫漫其修远兮，吾将上下而求索！&lt;br&gt;
&lt;b&gt;For things to change, first I must change!&lt;/b&gt;</description><language>zh-cn</language><lastBuildDate>Mon, 26 Sep 2011 20:15:02 GMT</lastBuildDate><pubDate>Mon, 26 Sep 2011 20:15:02 GMT</pubDate><ttl>60</ttl><item><title>ioFTPD</title><link>http://www.cnitblog.com/kenlen/articles/5411.html</link><dc:creator>Kenlen</dc:creator><author>Kenlen</author><pubDate>Thu, 15 Dec 2005 08:35:00 GMT</pubDate><guid>http://www.cnitblog.com/kenlen/articles/5411.html</guid><wfw:comment>http://www.cnitblog.com/kenlen/comments/5411.html</wfw:comment><comments>http://www.cnitblog.com/kenlen/articles/5411.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/kenlen/comments/commentRss/5411.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/kenlen/services/trackbacks/5411.html</trackback:ping><description><![CDATA[<P>1. 目录结构</P>
<P>ioFTPD主目录包括以下文件：Changelog, TODO, README.1ST</P>
<P>更新记录文件包含了ioFTPD的最新更新内容，可使您及时了解软件的bug修正及新增特征等。 <BR>TODO文档列出了ioFTPD未来版本中要添加的内容。 <BR>README.1ST文件为一些必要的法律公告。 </P>
<P>--------------------------------------------------------------------------------</P>
<P>ioFTPD下的目录包括：</P>
<P>/cache 包括缓存文件，您不能改动此目录下的任何文件。 <BR>/etc 目录内文件包括</P>
<P>UserIdTable -用户及其UID(用户ID)列表 <BR>GroupIdTable - 组及其GID（组ID）列表 <BR>default.vfs和admin.vfs - VFS示例文件 <BR>ioftpd.env - 定义环境变量 <BR>&nbsp;<BR>/groups 组数据文件。文件名即为GID（组ID） <BR>/help 帮助文件。 <BR>/lib TCL库 <BR>/logs 服务器运行记录文件如Error.log及Sysop.log等. <BR>/scripts ioFTPD的第三方脚本。 <BR>/site 您的site的缺省根目录。 <BR>/source 可能对脚本编写有用的源代码。 <BR>/system ioFTPD.exe, ioFTPD.ini, tcl84.dll <BR>/text 用户登陆时显示的信息文件，以及运行命令时显示的状态信息等文件。 <BR>/users 用户数据文件。文件名为UID(用户ID）。 </P>
<P>&nbsp;</P>
<P>2. 安装指南</P>
<P>此文档可让您在几分钟内最快速成功配置ioFTPD！</P>
<P>1. 解压ioFTPD文件包。</P>
<P>2. 编辑 ..\etc\default.vfs. 注意根目录必须加载为：";/";.<BR>如：:<BR>"d:\ftp" / &lt;-- 用已有的空目录作根目录。<BR>"e:\mp3" /mp3 &lt;-- 在根目录加载为/mp3</P>
<P>注意组ioftpd(缺省用户ioFTPD所在的组）的虚拟目录文件缺省为admin.vfs。要让ioftpd组使用default.vfs，可用命令： site change ioftpd groupvfsfile ..\etc\default.vfs 或将..\groups目录下0文件内的VFSFILE行删除即可。</P>
<P>3. 打开..\system\ioFTPD.ini.</P>
<P>在ioFTPD.ini中，注释行用“#”，取消选项/设置用分号";"。<BR># Comment<BR>;Disabled = True</P>
<P>3a. 设置DEVICES。.<BR>在多数情况下可用缺省设置。<BR>缺省device名为";Any";.<BR>[Any]<BR>Host = 0.0.0.0 &lt;-- 未定义IP，则允许在任何IP上连接。<BR>Ports = 1024-2048 &lt;-- 数据传输端口。<BR>Random = True &lt;-- 使用随机端口。</P>
<P>3b. 设置SERVICES（示例仅用于FTP_Service)</P>
<P>[FTP_Service]<BR>Type = FTP<BR>Device_Name = Any &lt;-- 使用的Device。缺省为";Any";<BR>Port = 9999 &lt;-- 连接端口<BR>Description = My FTP Service<BR>User_Limit = 10 &lt;-- 最大连接用户数。<BR>Allowed_Users = *<BR>Messages = ..\text\ftp<BR>Require_Encrypted_Auth = !* &lt;-- 无用户使用加密请求。<BR>Require_Encrypted_Data = !*<BR>;Certificate_Name = 192.168.1.11 &lt;-- SLL认证名（CN）:若不使用认证，请注释此行，否则你的ftpd不会运行！<BR>Explicit_Encryption = True<BR>Encryption_Protocol = SSL3<BR>Min_Cipher_Strength = 128<BR>Max_Cipher_Strength = 384<BR>;Get_External_Ident = False &lt;-- True/False. 保护支持<BR>;Data_Devices = &lt;-- 流量平衡设备<BR>;Random_Devices = False &lt;-- True/False. Data_Devices使用随机次序。</P>
<P>需要更高级的devices及services，如NAT及流量平衡等设置样例文件，请参见ioFTPD-Advanced.ini。</P>
<P>4. 用缺省的管理员（Master）帐号登陆，注意在ioFTPD下，用户名、密码、组名、标识名及其他名称均区分大小写！<BR>用户名：ioFTPD<BR>密码：ioFTPD</P>
<P>5. 使用SITE PASSWD &lt;新密码&gt; 更改缺省的ioFTPD密码。</P>
<P>6. 打开并编辑 ..\etc\Hosts.Rules，使其可由外部IP连接。 在最新的未注册版本中，缺省规则为禁止（DENY）. 注释此缺省行，并去掉ALLOW行的注释。若ioFTPD.exe正在运行，则需重启（修改Hosts.Rules需要完全重启)。</P>
<P>完成！现在请阅读此文档其余部分，提高您的配置技巧。</P>
<P>问：什么是Master帐号？</P>
<P>答：Master权限帐号登陆后可做几乎任何事。可浏览所有目录，传输任何文件，即使其被别的用户限制。可以更改别的用户或组（但不能更改别的Master帐号）的设置。Master的旗标是"M"。</P>
<P>其他FAQ，请见ioFTPD主页的知识基地.</P>
<P>-----------------------------------------------------------------------<BR>提示#1: 好的脚本、sfv校验、sitebot、已知bug及其他ioFTPD信息，请查看论坛.<BR>提示 #2: 在登陆服务器时出现错误，请检查..\logs\Error.log文件。<BR>提示 #3: 要学会如何用site命令控制ioFTPD。<BR>提示#4: 请阅读此文档的其他部分，更多了解ioFTPD。<BR>----------------------------------------------------------------------- </P>
<P>3. 虚拟文件系统(VFS)</P>
<P>VFS文件用来创建服务器的文件目录结构，用户登陆后即可见。示例的VFS文件为default.vfs和admin.vfs，均位于..\etc目录下。</P>
<P>基本VFS设置<BR>子目录加载<BR>用于存档的Raid目录加载<BR>不同用户和/或不同组的VFS文件<BR>私有目录<BR>符号链接<BR>目录权限设置</P>
<P><BR>--------------------------------------------------------------------------------</P>
<P>基本VFS设置</P>
<P>最快的VFS文件设置法是将一空目录设置为根目录，这样必须在你的VFS文件中将此目录加载为：";/"; 如下：<BR>"c:\ioFTPD\site" /<BR>在..\site目录下有些示例目录，你可以删除它们。</P>
<P>然后你可指定VFS根目录下要显示的目录。<BR>如：<BR>"c:\ioFTPD\site" / <BR>"d:\games" /games<BR>"e:\mp3" /mp3</P>
<P>也支持驱动器盘符的直接加载，但不推荐此设置，因为不能隐藏象系统卷标信息之类的系统目录。<BR>如：<BR>"f:\" /f-drive<BR>"g:\" /g-drive</P>
<P>要设置这些目录的权限（这样用户就可上传等），请用SITE CHMOD.</P>
<P>这些是ioftpd新手需要了解的基本设置，高级VFS设置请参见下面内容……</P>
<P><BR>--------------------------------------------------------------------------------</P>
<P>加载子目录</P>
<P>ioFTPD's VFS十分灵活，你可指定某些目录作为子目录。<BR>但要确保你的上级目录存在（此处为/mnt）。<BR>如：<BR>"c:\ioFTPD\site" /<BR>"c:\ioFTPD\mnt" /mnt<BR>"c:\" /mnt/c-drive<BR>"d:\" /mnt/d-drive<BR>"e:\" /mnt/cdrom</P>
<P><BR>--------------------------------------------------------------------------------</P>
<P>用于文件存储目的的Raid目录加载</P>
<P>可合并两个或更多目录内容，如下：<BR>注意：对于只读目的！尽管可写，但上传的文件（在Raided VFS目录下）会被存储在最后一个指定的设备下，此处为e:\dir2。</P>
<P>如：<BR>"d:\目录1" /存档文件<BR>"e:\目录2" /存档文件</P>
<P><BR>--------------------------------------------------------------------------------</P>
<P>不用用户和/或组的VFS文件</P>
<P>要为用户指定不同的VFS文件，仅需新建一VFS文件，并使用此命令来更改用户的VFS文件<BR>site change &lt;用户&gt; vfsfile ..\etc\custom.vfs</P>
<P>你也可改变某个组的VFS，该组下所有用户均自动使用此组VFS文件<BR>如：<BR>site change &lt;组&gt; groupvfsfile ..\etc\group1.vfs</P>
<P>重要！用户VFS文件会覆盖组VFS文件。你已用一指定的组VFS文件更改了组内某用户的VFS文件，且你想让此用户使用此组VFS文件，可清除..\users目录下的用户 user文件中的VFSFILE行，或者用命令更改此用户的VFS文件至此组VFS文件：site change vfsfile ..\etc\group1.vfs<BR>记住若将用户的VFS文件改变为与组VFS文件的文件，且然后又将此组VFS文件改变为另一个文件，你需要再一次改变用户的VFS文件。</P>
<P><BR>--------------------------------------------------------------------------------</P>
<P>私有目录</P>
<P>另一种不同目录的权限设置（包括不同的VFS）方法为私有路径。私有路径对其他用户隐藏，即使这些目录也存在于他们的VFS中。这样便很容易地设置VFS，而不必设置多重VFS文件（使某些用户使用某些目录）。除了Master,其他用户无权进入私有目录。私有目录不对Master隐藏。</P>
<P>SITE命令"site chattr"用于设置私有目录，此命令也可将目录转换为符号链接。</P>
<P>用法： site chattr +h "&lt;目录&gt;" "&lt;权限列表&gt;"<BR>示例： site chattr +h "私有目录" "-用户2 -用户5 =组11"</P>
<P>若目录名包含空格，或你指定多个用户和/或组权限时，则需要用引号("; ";) 引用。旗标也可在权限列表中使用。</P>
<P>使用以下命令查看当前私有目录的权限：<BR>site chattr +h "目录"</P>
<P>联想到+h是指";hidden";， 很容易便可记住+h是指私有目录，+l指目录链接。</P>
<P><BR>--------------------------------------------------------------------------------</P>
<P>符号链接</P>
<P>符号链接是一个快捷目录，可指向你的虚拟文件系统中的任何指定位置。</P>
<P>使用SITE命令"site chattr"将目录转换成符号链接。</P>
<P>用法： site chattr +l "&lt;目录&gt;" ""<BR>示例： site chattr +l "mp3-today" "/mp3/0525"</P>
<P>使用以下命令查看当前路径的链接指向：<BR>site chattr +l "符号链接名"</P>
<P>符号链接也可设置为私有路径。</P>
<P><BR>--------------------------------------------------------------------------------</P>
<P>目录权限的详细设置</P>
<P>如果你想禁止某些目录的上传，那么VFS的此部分设置是很有用的。权限前缀";!"; 表示禁止，如!-user !=group !F。也可指定多个用户和/或组，如!-user1 -user2 =group1，此处仅user1被禁止。</P>
<P>以下是ioFTPD.ini里的缺省设置：<BR>[VFS]<BR>...<BR>###<BR># 目录权限的详细设置 <BR>#<BR># priviledge = &lt;virtual path&gt; &lt;rights&gt;<BR>#<BR>Upload = * *<BR>Resume = * *<BR>Download = * *<BR>MakeDir = * *<BR>RemoveDir = * *<BR>RemoveOwnDir = * *<BR>Rename = * 1VM<BR>RenameOwn = * *<BR>Overwrite = * VM<BR>Delete = * 1VM<BR>DeleteOwn = * *<BR>NoStats = * !*</P>
<P>虚拟路径用此格式：/目录/*</P>
<P>-----------------------------------------------------------------------<BR>规则为首个匹配即生效。<BR>在虚拟目录和权限间，仅可使用空格，不要用tab键空格。<BR>最后的"*"是必须的，表示允许其他所有人。<BR>-----------------------------------------------------------------------</P>
<P>示例：<BR># 所有GuestGroup组的用户不可创建目录<BR># 也不可在mp3目录内上传文件，但其他用户被允许此二项。<BR>#<BR>MakeDir = /mp3/* !=GuestGroup *<BR>MakeDir = * *<BR>Upload = /mp3/* !=GuestGroup *<BR>Upload = * *</P>
<P>ioFTPD 4.9.0（包含RemoviOwnDir）后的版本有一个新功能"NoStats"，NoStats取消指定用户和/或组的状态统计。NoStats是路径相关的。记住，在这些指定目录下，这些用户和/或组的活动不被计入统计。</P>
<P>总将NoStats = * !*放在最底部，否则活动统计对其他用户也会失效。可在此行上方加入你自己的NoStats行。</P><img src ="http://www.cnitblog.com/kenlen/aggbug/5411.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/kenlen/" target="_blank">Kenlen</a> 2005-12-15 16:35 <a href="http://www.cnitblog.com/kenlen/articles/5411.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>搜索引擎研究---网络蜘蛛程序算法相关资料</title><link>http://www.cnitblog.com/kenlen/articles/4228.html</link><dc:creator>Kenlen</dc:creator><author>Kenlen</author><pubDate>Wed, 09 Nov 2005 14:43:00 GMT</pubDate><guid>http://www.cnitblog.com/kenlen/articles/4228.html</guid><wfw:comment>http://www.cnitblog.com/kenlen/comments/4228.html</wfw:comment><comments>http://www.cnitblog.com/kenlen/articles/4228.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/kenlen/comments/commentRss/4228.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/kenlen/services/trackbacks/4228.html</trackback:ping><description><![CDATA[如何用C#语言构造蜘蛛程序 <BR>　"蜘蛛"（Spider）是Internet上一种很有用的程序，搜索引擎利用蜘蛛程序将Web页面收集到数据库，企业利用蜘蛛程序监视竞争对手的网站并跟踪变动，个人用户用蜘蛛程序下载Web页面以便脱机使用，开发者利用蜘蛛程序扫描自己的Web检查无效的链接……对于不同的用户，蜘蛛程序有不同的用途。那么，蜘蛛程序到底是怎样工作的呢？ <BR><BR>　　蜘蛛是一种半自动的程序，就象现实当中的蜘蛛在它的Web（蜘蛛网）上旅行一样，蜘蛛程序也按照类似的方式在Web链接织成的网上旅行。蜘蛛程序之所以是半自动的，是因为它总是需要一个初始链接（出发点），但此后的运行情况就要由它自己决定了，蜘蛛程序会扫描起始页面包含的链接，然后访问这些链接指向的页面，再分析和追踪那些页面包含的链接。从理论上看，最终蜘蛛程序会访问到Internet上的每一个页面，因为Internet上几乎每一个页面总是被其他或多或少的页面引用。 <BR><BR>　　本文介绍如何用C#语言构造一个蜘蛛程序，它能够把整个网站的内容下载到某个指定的目录，程序的运行界面如图一。你可以方便地利用本文提供的几个核心类构造出自己的蜘蛛程序。 <BR>　　C#特别适合于构造蜘蛛程序，这是因为它已经内置了HTTP访问和多线程的能力，而这两种能力对于蜘蛛程序来说都是非常关键的。下面是构造一个蜘蛛程序要解决的关键问题： <BR><BR>　　⑴ HTML分析：需要某种HTML解析器来分析蜘蛛程序遇到的每一个页面。 <BR><BR>　　⑵ 页面处理：需要处理每一个下载得到的页面。下载得到的内容可能要保存到磁盘，或者进一步分析处理。 <BR><BR>　　⑶ 多线程：只有拥有多线程能力，蜘蛛程序才能真正做到高效。 <BR><BR>　　⑷ 确定何时完成：不要小看这个问题，确定任务是否已经完成并不简单，尤其是在多线程环境下。 <BR><BR>　　一、HTML解析 <BR><BR>　　C#语言本身不包含解析HTML的能力，但支持XML解析；不过，XML有着严格的语法，为XML设计的解析器对HTML来说根本没用，因为HTML的语法要宽松得多。为此，我们需要自己设计一个HTML解析器。本文提供的解析器是高度独立的，你可以方便地将它用于其它用C#处理HTML的场合。 <BR><BR>　　本文提供的HTML解析器由ParseHTML类实现，使用非常方便：首先创建该类的一个实例，然后将它的Source属性设置为要解析的HTML文档： <BR><BR>ParseHTML parse = new ParseHTML();parse.Source = " 
<P>Hello World</P>";<BR><BR><BR><BR>　　接下来就可以利用循环来检查HTML文档包含的所有文本和标记。通常，检查过程可以从一个测试Eof方法的while循环开始： <BR><BR>while(!parse.Eof()){char ch = parse.Parse();<BR><BR><BR><BR>　　Parse方法将返回HTML文档包含的字符--它返回的内容只包含那些非HTML标记的字符，如果遇到了HTML标记，Parse方法将返回0值，表示现在遇到了一个HTML标记。遇到一个标记之后，我们可以用GetTag()方法来处理它。 <BR><BR>if(ch==0){HTMLTag tag = parse.GetTag();}<BR><BR><BR><BR>　　一般地，蜘蛛程序最重要的任务之一就是找出各个HREF属性，这可以借助C#的索引功能完成。例如，下面的代码将提取出HREF属性的值（如果存在的话）。 <BR><BR>Attribute href = tag["HREF"];string link = href.Value;<BR><BR><BR><BR>　　获得Attribute对象之后，通过Attribute.Value可以得到该属性的值。 <BR><BR>二、处理HTML页面 <BR><BR>　　下面来看看如何处理HTML页面。首先要做的当然是下载HTML页面，这可以通过C#提供的HttpWebRequest类实现： <BR><BR>HttpWebRequest request = (HttpWebRequest)WebRequest.Create(m_uri);response = request.GetResponse();stream = response.GetResponseStream();<BR><BR><BR><BR>　　接下来我们就从request创建一个stream流。在执行其他处理之前，我们要先确定该文件是二进制文件还是文本文件，不同的文件类型处理方式也不同。下面的代码确定该文件是否为二进制文件。 <BR><BR>if( !response.ContentType.ToLower().StartsWith("text/") ){SaveBinaryFile(response);return null;}string buffer = "",line;<BR><BR><BR><BR>　　如果该文件不是文本文件，我们将它作为二进制文件读入。如果是文本文件，首先从stream创建一个StreamReader，然后将文本文件的内容一行一行加入缓冲区。 <BR><BR>reader = new StreamReader(stream);while( (line = reader.ReadLine())!=null ){buffer+=line+"\r\n";}<BR><BR><BR><BR>　　装入整个文件之后，接着就要把它保存为文本文件。 <BR><BR>SaveTextFile(buffer);<BR><BR><BR><BR>　　下面来看看这两类不同文件的存储方式。 <BR><BR>　　二进制文件的内容类型声明不以"text/"开头，蜘蛛程序直接把二进制文件保存到磁盘，不必进行额外的处理，这是因为二进制文件不包含HTML，因此也不会再有需要蜘蛛程序处理的HTML链接。下面是写入二进制文件的步骤。 <BR><BR>　　首先准备一个缓冲区临时地保存二进制文件的内容。 byte []buffer = new byte[1024];<BR><BR><BR><BR>　　接下来要确定文件保存到本地的路径和名称。如果要把一个myhost.com网站的内容下载到本地的c:\test文件夹，二进制文件的网上路径和名称是http://myhost.com/images/logo.gif，则本地路径和名称应当是c:\test\images\logo.gif。与此同时，我们还要确保c:\test目录下已经创建了images子目录。这部分任务由convertFilename方法完成。 <BR><BR>string filename = convertFilename( response.ResponseUri );<BR><BR><BR><BR>　　convertFilename方法分离HTTP地址，创建相应的目录结构。确定了输出文件的名字和路径之后就可以打开读取Web页面的输入流、写入本地文件的输出流。 <BR><BR>Stream outStream = File.Create( filename );Stream inStream = response.GetResponseStream();<BR><BR><BR><BR>　　接下来就可以读取Web文件的内容并写入到本地文件，这可以通过一个循环方便地完成。 <BR><BR>int l;do{l = inStream.Read(buffer,0,buffer.Length);if(l&gt;0)outStream.Write(buffer,0,l);} while(l&gt;0);<BR><BR><BR><BR>　　写入整个文件之后，关闭输入流、输出流。 <BR><BR>outStream.Close();inStream.Close();<BR><BR><BR><BR>　　比较而言，下载文本文件更容易一些。文本文件的内容类型总是以"text/"开头。假设文件已被下载并保存到了一个字符串，这个字符串可以用来分析网页包含的链接，当然也可以保存为磁盘上的文件。下面代码的任务就是保存文本文件。 <BR><BR>string filename = convertFilename( m_uri );StreamWriter outStream = new StreamWriter( filename );outStream.Write(buffer);outStream.Close();<BR><BR><BR><BR>　　在这里，我们首先打开一个文件输出流，然后将缓冲区的内容写入流，最后关闭文件。 <BR><BR>　　三、多线程 <BR><BR>　　多线程使得计算机看起来就象能够同时执行一个以上的操作，不过，除非计算机包含多个处理器，否则，所谓的同时执行多个操作仅仅是一种模拟出来的效果--靠计算机在多个线程之间快速切换达到"同时"执行多个操作的效果。一般而言，只有在两种情况下多线程才能事实上提高程序运行的速度。第一种情况是计算机拥有多个处理器，第二种情况是程序经常要等待某个外部事件。 <BR><BR>　　对于蜘蛛程序来说，第二种情况正是它的典型特征之一，它每发出一个URL请求，总是要等待文件下载完毕，然后再请求下一个URL。如果蜘蛛程序能够同时请求多个URL，显然能够有效地减少总下载时间。 <BR><BR>　　为此，我们用DocumentWorker类封装所有下载一个URL的操作。每当一个DocumentWorker的实例被创建，它就进入循环，等待下一个要处理的URL。下面是DocumentWorker的主循环： <BR><BR>while(!m_spider.Quit ){m_uri = m_spider.ObtainWork();m_spider.SpiderDone.WorkerBegin();string page = GetPage();if(page!=null)ProcessPage(page);m_spider.SpiderDone.WorkerEnd();}<BR><BR><BR><BR>　　这个循环将一直运行，直至Quit标记被设置成了true（当用户点击"Cancel"按钮时，Quit标记就被设置成true）。在循环之内，我们调用ObtainWork获取一个URL。ObtainWork将一直等待，直到有一个URL可用--这要由其他线程解析文档并寻找链接才能获得。Done类利用WorkerBegin和WorkerEnd方法来确定何时整个下载操作已经完成。 <BR><BR>　　从图一可以看出，蜘蛛程序允许用户自己确定要使用的线程数量。在实践中，线程的最佳数量受许多因素影响。如果你的机器性能较高，或者有两个处理器，可以设置较多的线程数量；反之，如果网络带宽、机器性能有限，设置太多的线程数量其实不一定能够提高性能。 <BR><BR>　　四、任务完成了吗？ <BR><BR>　　利用多个线程同时下载文件有效地提高了性能，但也带来了线程管理方面的问题。其中最复杂的一个问题是：蜘蛛程序何时才算完成了工作？在这里我们要借助一个专用的类Done来判断。 <BR><BR>　　首先有必要说明一下"完成工作"的具体含义。只有当系统中不存在等待下载的URL，而且所有工作线程都已经结束其处理工作时，蜘蛛程序的工作才算完成。也就是说，完成工作意味着已经没有等待下载和正在下载的URL。 <BR><BR>　　Done类提供了一个WaitDone方法，它的功能是一直等待，直到Done对象检测到蜘蛛程序已完成工作。下面是WaitDone方法的代码。 <BR><BR>public void WaitDone(){Monitor.Enter(this);while ( m_activeThreads&gt;0 ){Monitor.Wait(this);}Monitor.Exit(this);}<BR><BR><BR><BR>　　WaitDone方法将一直等待，直到不再有活动的线程。但必须注意的是，下载开始的最初阶段也没有任何活动的线程，所以很容易造成蜘蛛程序一开始就立即停止的现象。为解决这个问题，我们还需要另一个方法WaitBegin来等待蜘蛛程序进入"正式的"工作阶段。一般的调用次序是：先调用WaitBegin，再接着调用WaitDone，WaitDone将等待蜘蛛程序完成工作。下面是WaitBegin的代码： <BR><BR>public void WaitBegin(){Monitor.Enter(this);while ( !m_started ){Monitor.Wait(this);}Monitor.Exit(this);}<BR><BR><BR><BR>　　WaitBegin方法将一直等待，直到m_started标记被设置。m_started标记是由WorkerBegin方法设置的。工作线程在开始处理各个URL之时，会调用WorkerBegin；处理结束时调用WorkerEnd。WorkerBegin和WorkerEnd这两个方法帮助Done对象确定当前的工作状态。下面是WorkerBegin方法的代码： <BR><BR>public void WorkerBegin(){Monitor.Enter(this);m_activeThreads++;m_started = true;Monitor.Pulse(this);Monitor.Exit(this);}<BR><BR><BR><BR>　　WorkerBegin方法首先增加当前活动线程的数量，接着设置m_started标记，最后调用Pulse方法以通知（可能存在的）等待工作线程启动的线程。如前所述，可能等待Done对象的方法是WaitBegin方法。每处理完一个URL，WorkerEnd方法会被调用： <BR><BR>public void WorkerEnd(){Monitor.Enter(this);m_activeThreads--;Monitor.Pulse(this);Monitor.Exit(this);}<BR><BR><BR><BR><BR><BR>　　WorkerEnd方法减小m_activeThreads活动线程计数器，调用Pulse释放可能在等待Done对象的线程--如前所述，可能在等待Done对象的方法是WaitDone方法。 <BR><BR>　　结束语：本文介绍了开发Internet蜘蛛程序的基础知识，下面提供的源代码将帮助你进一步深入理解本文的主题。这里提供的代码非常灵活，你可以方便地将它用于自己的程序。<BR><BR>创建智能网络蜘蛛——如何使用Java网络对象和HTML对象(翻译)<BR>作者：Mark O. Pendergast<BR><BR>原文：http://www.javaworld.com/javaworld/jw-11-2004/jw-1101-spider.html<BR><BR>摘要<BR>你是否想过创建自己的符合特定标准的网站数据库呢？网络蜘蛛，有时也称为网络爬虫，是一些根据网络链接从一个网站到另外一个网站，检查内容和记录位置的程序。商业搜索站点使用网络蜘蛛丰富它们的数据库，研究人员可以使用蜘蛛获得相关的信息。创建自己的蜘蛛搜索的内容、主机和网页特征，比如文字密度和内置的多媒体内容。这篇文章将告诉你如何使用Java的HTML和网络类来创建你自己的功能强大的网络蜘蛛。<BR><BR>这篇文章将介绍如何在标准Java网络对象的基础上创建一个智能的网络蜘蛛。蜘蛛的核心是一个基于关键字/短语标准和网页特征进行深入网络搜索的递归程序。搜索过程在图形上类似于JTree结构。我主要介绍的问题，例如处理相关的URL，防止循环引用和监视内存/堆栈使用。另外，我将介绍再访问和分解远程网页中如何正确是用Java网络对象。<BR><BR>● 蜘蛛示例程序<BR><BR>示例程序包括用户界面类SpiderControl、网络搜索类Spider，两个用作创建JTree显示结果的类UrlTreeNode和UrlNodeRenderer，和两个帮助验证用户界面中数字输入的类IntegerVerifier和VerifierListener。文章末尾的资源中有完整代码和文档的琏接。<BR><BR>SpiderControl界面由三个属性页组成，一个用来设置搜索参数，另一个显示结果搜索树(JTree)，第三个显示错误和状态信息，如图1<BR><BR><BR><BR><BR>图1 搜索参数属性页<BR><BR><BR>搜索参数包括访问网站的最大数量，搜索的最大深度(链接到链接到链接)，关键字/短语列表，搜索的顶级主机，起始网站或者门户。一旦用户输入了搜索参数，并按下开始按钮，网络搜索将开始，第二个属性页将显示搜索的进度。<BR><BR><BR>图2 搜索树<BR><BR>一个Spider类的实例以独立进程的方式执行网络搜索。独立进程的使用是为了SpiderControl模块可以不断更新搜索树显示和处理停止搜索按钮。当Spider运行时，它不断在第二个属性页中为JTree增加节点(UrlTreeNode)。包含关键字和短语的搜索树节点以蓝色显示(UrlNodeRenderer)。<BR><BR>当搜索完成以后，用户可以查看站点的统计，还可以用外部浏览器(默认是位于Program Files目录的Internet Explorer)查看站点。统计包括关键字出现次数，总字符数，总图片数和总链接数。<BR><BR>● Spider类<BR><BR>Spider类负责搜索给出起点(入口)的网络，一系列的关键字和主机，和搜索深度和大小的限制。Spider继承了Thread，所以可以以独立线程运行。这允许SpiderControl模块不断更新搜索树显示和处理停止搜索按钮。<BR><BR>构造方法接受包含对一个空的JTree和一个空的JtextArea引用的搜索参数。JTree被用作创建一个搜索过程中的分类站点记录。这样为用户提供了可见的反馈，帮助跟踪Spdier循环搜索的位置。JtextArea显示错误和过程信息。<BR><BR>构造器将参数存放在类变量中，使用UrlNodeRenderer类初始化显示节点的JTree。直到SpiderControl调用run()方法搜索才开始。<BR><BR>run()方法以独立的线程开始执行。它首先判断入口站点是否是一个Web引用(以http，ftp或者www开始)或是一个本地文件引用。它接着确认入口站点是否具有正确的符号，重置运行统计，接着调用searchWeb()开始搜索：<BR><BR>public void run()<BR>{<BR>DefaultTreeModel treeModel = (DefaultTreeModel)searchTree.getModel(); // get our model<BR>DefaultMutableTreeNode root = (DefaultMutableTreeNode)treeModel.getRoot();<BR>String urllc = startSite.toLowerCase();<BR>if(!urllc.startsWith("http://") &amp;&amp; !urllc.startsWith("ftp://") &amp;&amp;<BR>!urllc.startsWith("www."))<BR><BR>{<BR>startSite = "file:///"+startSite; // Note you must have 3 slashes !<BR><BR>}<BR>else // Http missing ?<BR>if(urllc.startsWith("www."))<BR>{<BR>startSite = "http://"+startSite; // Tack on http:// <BR>}<BR><BR>startSite = startSite.replace('\\', '/'); // Fix bad slashes<BR>sitesFound = 0;<BR>sitesSearched = 0;<BR>updateStats();<BR>searchWeb(root,startSite); // Search the Web<BR>messageArea.append("Done!\n\n");<BR>}<BR><BR>searchWeb()是一个接受搜索树父节点和搜索Web地址参数的递归方法。searchWeb()首先检查给出的站点是否已被访问和未被执行的搜索深度和站点。SearchWeb()接着允许SpiderControl运行(更新界面和检查停止搜索按钮是否按下)。如果所有正常，searchWeb()继续，否则返回。<BR><BR>在searchWeb()开始读和解析站点以前，它首先检验基于站点创建的URL对象是否具有正确的类型和主机。URL协议被检查来确认它是一个HTML地址或者一个文件地址(不必搜索mailt和其他协议)。接着检查文件扩展名(如果当前有)来确认它是一个HTML文件(不必解析pdf或者gif文件)。一旦这些工作完成，通过isDomainOk()方法检查根据用户指定的列表检查主机：<BR><BR>...URL url = new URL(urlstr); // Create the URL object from a string.<BR>String protocol = url.getProtocol(); // Ask the URL for its protocol<BR>if(!protocol.equalsIgnoreCase("http") &amp;&amp; !protocol.equalsIgnoreCase("file"))<BR>{<BR>messageArea.append(" Skipping : "+urlstr+" not a http site\n\n");<BR>return;<BR>}<BR><BR>String path = url.getPath(); // Ask the URL for its path<BR>int lastdot = path.lastIndexOf("."); // Check for file extension<BR>if(lastdot &gt; 0)<BR>{<BR>String extension = path.substring(lastdot); // Just the file extension<BR>if(!extension.equalsIgnoreCase(".html") &amp;&amp; !extension.equalsIgnoreCase(".htm"))<BR>return; // Skip everything but html files<BR>}<BR><BR>if(!isDomainOk(url))<BR><BR>{<BR><BR>messageArea.append(" Skipping : "+urlstr+" not in domain list\n\n");<BR>return;<BR>}<BR><BR>这里，searchWeb()公平的确定它是否有值得搜索的URL，接着它为搜索树创建一个新节点，添加到树中，打开一个输入流解析文件。下面的章节涉及很多关于解析HTML文件，处理相关URL和控制递归的细节。<BR><BR>1、解析HTML文件<BR><BR>这里有两个为了查找A HREF来解析HTML文件方法——一个麻烦的方法和一个简单的方法。<BR><BR>如果你选择麻烦的方法，你将使用Java的StreamTokenizer类创建你自己的解析规则。使用这些技术，你必须为StreamTokenizer对象指定单词和空格，接着去掉&lt;和&gt;符号来查找标签，属性，在标签之间分割文字。太多的工作要做。<BR><BR>简单的方法是使用内置的ParserDelegator类，一个HTMLEditorKit.Parser抽象类的子类。这些类在Java文档中没有完善的文档。使用ParserDelegator有三个步骤：首先为你的URL创建一个InputStreamReader对象，接着创建一个ParserCallback对象的实例，最后创建一个ParserDelegator对象的实例并调用它的public方法parse()：<BR><BR><BR><BR>UrlTreeNode newnode = new UrlTreeNode(url); // Create the data node <BR>InputStream in = url.openStream(); // Ask the URL object to create an input stream<BR>InputStreamReader isr = new InputStreamReader(in); // Convert the stream to a reader<BR>DefaultMutableTreeNode treenode = addNode(parentnode, newnode); <BR>SpiderParserCallback cb = new SpiderParserCallback(treenode); // Create a callback object<BR>ParserDelegator pd = new ParserDelegator(); // Create the delegator<BR>pd.parse(isr,cb,true); // Parse the stream<BR>isr.close(); // Close the stream<BR>parse()接受一个InputStreamReader，一个ParseCallback对象实例和一个指定CharSet标签是否忽略的标志。parse()方法接着读和解码HTML文件，每次完成解码一个标签或者HTML元素后调用ParserCallback对象的方法。<BR><BR>在示例代码中，我实现了ParserCallback作为Spider的一个内部类，这样就允许ParseCallback访问Spider的方法和属性。基于ParserCallback的类可以覆盖下面的方法：<BR><BR>■ handleStartTag()：当遇到起始HTML标签时调用，比如&gt;A &lt;<BR><BR>■ handleEndTag()：当遇到结束HTML标签时调用，比如&gt;/A&lt;<BR><BR>■ handleSimpleTag()：当遇到没有匹配结束标签时调用<BR><BR>■ handleText()：当遇到标签之间的文字时调用<BR><BR><BR>在示例代码中，我覆盖了handleSimpleTag()以便我的代码可以处理HTML的BASE和IMG标签。BASE标签告诉当处理相关的URL引用时使用什么URL。如果没有BASE标签出现，那么当前URL就用来处理相关的引用。HandleSimpleTag()接受三个参数，一个HTML.Tag对象，一个包含所有标签属性的MutableAttributeSet，和在文件中的相应位置。我的代码检查标签来判断它是否是一个BASE对象实例，如果是则HREF属性被提取出来并保存在页面的数据节点中。这个属性以后在处理链接站点的URL地址中被用到。每次遇到IMG标签，页面图片数就被更新。<BR><BR>我覆盖了handleStartTag以便程序可以处理HTML的A和TITLE标签。方法检查t参数是否是一个事实上的A标签，如果是则HREF属性将被提取出来。<BR><BR>fixHref()被用作清理大量的引用(改变反斜线为斜线，添加缺少的结束斜线)，链接的URL通过使用基础URL和引用创建URL对象来处理。接着递归调用searchWeb()来处理链接。如果方法遇到TITLE标签，它就清除存储最后遇到文字的变量以便标题的结束标记具有正确的值(有时网页的title标签之间没有标题)。<BR><BR>我覆盖了handleEndTag()以便HTML的TITLE结束标记可以被处理。这个结束标记指出前面的文字(存在lastText中)是页面的标题文字。这个文字接着存在页面的数据节点中。因为添加标题信息到数据节点中将改变树中数据节点的显示，nodeChanged()方法必须被调用以便树可以更新。<BR><BR>我覆盖了handleText()方法以便HTML页面的文字可以根据被搜索的任意关键字或者短语来检查。HandleText()接受一个包含一个子符数组和该字符在文件中位置作为参数。HandleText()首先将字符数组转换成一个String对象，在这个过程中全部转换为大写。接着在搜索列表中的每个关键字/短语根据String对象的indexof()方法来检查。如果indexof()返回一个非负结果，则关键字/短语在页面的文字中显示。如果关键字/短语被显示，匹配被记录在匹配列表的节点中，统计数据被更新：<BR><BR>public class SpiderParserCallback extends HTMLEditorKit.ParserCallback {<BR><BR>/**<BR><BR>* Inner class used to html handle parser callbacks<BR><BR>*/<BR><BR><BR>public class SpiderParserCallback extends HTMLEditorKit.ParserCallback {<BR><BR>/** URL node being parsed */<BR><BR>private UrlTreeNode node;<BR><BR>/** Tree node */<BR><BR>private DefaultMutableTreeNode treenode;<BR><BR>/** Contents of last text element */<BR><BR>private String lastText = "";<BR><BR>/**<BR><BR>* Creates a new instance of SpiderParserCallback<BR><BR>* @param atreenode search tree node that is being parsed<BR>*/<BR><BR>public SpiderParserCallback(DefaultMutableTreeNode atreenode) {<BR><BR>treenode = atreenode;<BR>node = (UrlTreeNode)treenode.getUserObject();<BR><BR>}<BR><BR>/**<BR>* Handle HTML tags that don't have a start and end tag<BR>* @param t HTML tag<BR>* @param a HTML attributes<BR>* @param pos Position within file<BR>*/ <BR>public void handleSimpleTag(HTML.Tag t,<BR><BR>MutableAttributeSet a,<BR>int pos)<BR><BR>{<BR>if(t.equals(HTML.Tag.IMG))<BR><BR>{<BR>node.addImages(1);<BR>return;<BR>}<BR><BR>if(t.equals(HTML.Tag.BASE))<BR>{<BR>Object value = a.getAttribute(HTML.Attribute.HREF);<BR><BR>if(value != null)<BR>node.setBase(fixHref(value.toString())); <BR>} <BR>}<BR><BR>/**<BR><BR>* Take care of start tags<BR><BR>* @param t HTML tag<BR><BR>* @param a HTML attributes<BR><BR>* @param pos Position within file<BR>*/<BR>public void handleStartTag(HTML.Tag t,<BR><BR>MutableAttributeSet a,<BR><BR>int pos)<BR>{<BR>if(t.equals(HTML.Tag.TITLE))<BR>{<BR><BR>lastText="";<BR>return;<BR><BR>}<BR><BR>if(t.equals(HTML.Tag.A))<BR><BR>{<BR><BR>Object value = a.getAttribute(HTML.Attribute.HREF);<BR>if(value != null)<BR>{<BR>node.addLinks(1); <BR>String href = value.toString();<BR>href = fixHref(href);<BR>try{<BR>URL referencedURL = new URL(node.getBase(),href);<BR>searchWeb(treenode, referencedURL.getProtocol()+"://"+referencedURL.getHost()+referencedURL.getPath());<BR>}<BR>catch (MalformedURLException e)<BR><BR>{<BR>messageArea.append(" Bad URL encountered : "+href+"\n\n"); return; <BR>}<BR>}<BR>}<BR>}<BR>/**<BR>* Take care of start tags<BR>* @param t HTML tag<BR>* @param pos Position within file<BR><BR>*/<BR>public void handleEndTag(HTML.Tag t,<BR>int pos)<BR><BR>{<BR>if(t.equals(HTML.Tag.TITLE) &amp;&amp; lastText != null)<BR>{<BR>node.setTitle(lastText.trim());<BR>DefaultTreeModel tm = (DefaultTreeModel)searchTree.getModel();<BR><BR>tm.nodeChanged(treenode);<BR><BR>}<BR><BR>}<BR><BR>/**<BR><BR>* Take care of text between tags, check against keyword list for matches, if<BR>* match found, set the node match status to true<BR>* @param data Text between tags<BR>* @param pos position of text within Webpage<BR>*/<BR>public void handleText(char[] data, int pos)<BR>{<BR><BR>lastText = new String(data);<BR>node.addChars(lastText.length());<BR>String text = lastText.toUpperCase();<BR>for(int i = 0; i &lt; keywordList.length; i++)<BR>{<BR>if(text.indexOf(keywordList) &gt;= 0)<BR>{<BR>if(!node.isMatch())<BR>{<BR>sitesFound++;<BR>updateStats();<BR>}<BR>node.setMatch(keywordList); <BR>return;<BR>}<BR>}<BR>}<BR><BR>}<BR><BR>2、处理和补全URL<BR><BR>当遇到相关页面的链接，你必须在它们基础URL上创建完整的链接。基础URL可能通过BASE标签在页面中明确的定义，或者暗含在当前页面的链接中。Java的URL对象为你解决这个问题提供了构造器，提供了根据它的链接结构创建相似的。<BR>URL(URL context, String spec)接受spec参数的链接和context参数的基础链接。如果spec是一个相关链接，构建器将使用context来创建一个完整引用的URL对象。URL它推荐URL遵循严格的(Unix)格式。使用反斜线，在Microsoft Windows中，而不是斜线，将是错误的引用。如果spec或者context指向一个目录(包含index.html或default.html)，而不是一个HTML文件，它必须有一个结束斜线。fixHref()方法检查这些引用并且修正它们：<BR><BR><BR>public static String fixHref(String href)<BR>{<BR><BR>String newhref = href.replace('\\', '/'); // Fix sloppy Web references<BR><BR>int lastdot = newhref.lastIndexOf('.');<BR><BR>int lastslash = newhref.lastIndexOf('/');<BR>if(lastslash &gt; lastdot)<BR>{<BR>if(newhref.charAt(newhref.length()-1) != '/')<BR>newhref = newhref+"/"; // Add missing /<BR><BR>}<BR>return newhref; <BR><BR>}<BR><BR><BR>3、 控制递归<BR><BR>searchWeb()开始是为了搜索用户指定的起始Web地址而被调用的。它接着在遇到HTML链接时调用自身。这形成了深度优先搜索的基础，也带来了两种问题。首先非常危险的内存/堆栈溢出问题将因为太多的递归调用而产生。如果出现环形的引用，这个问题就将发生，也就是说，一个页面链接另外一个链接回来的连接，这是WWW中常见的事情。为了预防这种现象，searchWeb()检查搜索树(通过urlHasBeenVisited()方法)来确定是否引用的页面已经存在。如果已经存在，这个链接将被忽略。如果你选择实现一个没有搜索树的蜘蛛，你仍然必须维护一个以访问站点的列表(在Vector或数组中)以便你可以判断是否你正在重复访问站点。<BR><BR>递归的第二个问题来自深度优先的搜索和WWW的结构。根据选择的入口，深度优先的搜索在初始页面的初始链接在完成处理以前造成大量的递归调用。这就造成了两种不需要的结果：首先内存/堆栈溢出可能发生，第二被搜索过的页面可能很久才被从初始入口众多的结果中删除。为了控制这些，我为蜘蛛添加了最大搜索深度设置。用户可以选择可以达到的深度等级(链接到链接到链接)，当遇到每个链接时，当前深度通过调用depthLimitExceeded()方法进行检查。如果达到限制，链接就被忽略。测试仅仅检查JTree中节点的级别。<BR><BR>示例程序也增加了站点限制，用户来指定，可以在特定数目的URL被检查以后停止搜索，这样确保程序可以最后停止！站点限制通过一个简单的数字计数器sitesSearched来控制，这个数字每次调用searchWeb()后都被更新和检查。<BR><BR>4、UrlTreeNode和UrlNodeRenderer<BR><BR>UrlTreeNode和UrlNodeRenderer是用来在SpiderControl用户界面中创建JTree中个性化的树节点的类。UrlTreeNode包含每个搜索过的站点钟的URL信息和统计数据。UrlTreeNode以作为用户对象属性的标准DefaultMutableTreeNode对象形式存储在JTree中。数据包括节点中跟踪关键字出现的能力，节点的URL，节点的基础URL，链接的数量，图片的数量和字符的个数，以及节点是否符合搜索规则。<BR><BR>UrlTreeNodeRenderer是DefaultTreeCellRenderer界面的实现。UrlTreeNodeRenderer使节点包含匹配关键字显示为蓝色。UrlTreeNodeRenderer也为JtreeNodes加入了个性化的图标。个性化的显示通过覆盖getTreeCellRendererComponent()方法(如下)实现。这个方法在树中创建了一个Component对象。大部分的Component属性通过子类来进行设置，UrlTreeNodeRenderer改变了文字的颜色(前景色)和图标：<BR><BR><BR><BR>public Component getTreeCellRendererComponent(<BR>JTree tree,<BR>Object value,<BR>boolean sel,<BR>boolean expanded,<BR>boolean leaf,<BR>int row,<BR>boolean hasFocus) {<BR><BR>super.getTreeCellRendererComponent(<BR><BR>tree, value, sel,<BR>expanded, leaf, row,<BR>hasFocus);<BR>UrlTreeNode node = (UrlTreeNode)(((DefaultMutableTreeNode)value).getUserObject());<BR>if (node.isMatch()) // Set color<BR>setForeground(Color.blue);<BR>else <BR>setForeground(Color.black);<BR><BR>if(icon != null) // Set a custom icon<BR>{<BR>setOpenIcon(icon);<BR>setClosedIcon(icon);<BR>setLeafIcon(icon);<BR>}<BR>return this;<BR>}<BR><BR>5、 总结<BR><BR>这篇文章向你展示了如何创建网络蜘蛛和控制它的用户界面。用户界面使用JTree来跟踪蜘蛛的进展和记录访问过的站点。当然，你也可以使用Vector来记录访问过的站点和使用一个简单的计数器来显示进展。其他增强可以包含通过数据库记录关键字和站点的接口，增加通过多个入口搜索的能力，用大量或者很少的文字内容来显现站点，以及为搜索引擎提供同义搜索的能力。<BR><BR>这篇文章中展示的Spider类使用递归调用搜索程序，当然，一个新蜘蛛的独立线程可以在遇到每个链接时开始。这样的好处是允许链接远程URL并发执行，提高速度。然而记住那些叫做DefaultMutableTreeNode的JTree对象，不是线程安全的，所以程序员必须自己实现同步。<img src ="http://www.cnitblog.com/kenlen/aggbug/4228.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/kenlen/" target="_blank">Kenlen</a> 2005-11-09 22:43 <a href="http://www.cnitblog.com/kenlen/articles/4228.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有问题找GOOGLE </title><link>http://www.cnitblog.com/kenlen/articles/3842.html</link><dc:creator>Kenlen</dc:creator><author>Kenlen</author><pubDate>Thu, 03 Nov 2005 05:31:00 GMT</pubDate><guid>http://www.cnitblog.com/kenlen/articles/3842.html</guid><wfw:comment>http://www.cnitblog.com/kenlen/comments/3842.html</wfw:comment><comments>http://www.cnitblog.com/kenlen/articles/3842.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/kenlen/comments/commentRss/3842.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/kenlen/services/trackbacks/3842.html</trackback:ping><description><![CDATA[<DIV class=bodyPost>
<DIV class=altbg2 style="BORDER-RIGHT: #698cc3 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #698cc3 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 3px 2em 2em; BORDER-LEFT: #698cc3 1px solid; WORD-BREAK: break-all; PADDING-TOP: 10px; BORDER-BOTTOM: #698cc3 1px solid"><FONT color=blue>本文简要的介绍了GOOGLE的历史和特点，GOOGLE的基本搜索语法和高级搜索语法，GOOGLE的特色功能，包括图片搜索、新闻组搜索和集成工具条等，还简单的介绍了一些常用搜索技巧和实用个案。尽管本文名为“GOOGLE搜索从入门到精通”，但事实上，笔者对运用GOOGLE进行搜索也尚处于“入门”阶段。:)<BR><BR>3、如何使用本文<BR><BR>阅读本文最好具备一些最基本的布尔代数基础，如“与”、“或”、“非”等。不过，即便你没有这方面的知识，也不必在意。对那些实例进行练习，你的疑惑就会迎刃而解。对于刚刚接触网络搜索的读者而言，也许你应该从头到尾的阅读本文；但对于那些有一定搜索基础的读者而言，只需要跳跃着寻找自己所需要的信息就可以了。当然，如果你有一定的英文基础，也可以把本文与GOOGLE大全（<A href="http://www.google.com/about.html" target=_blank><FONT color=#003366><U>http://www.google.com/about.html</U></FONT></A>）参照阅读，那样效果会更好。<BR><BR>4、GOOGLE简介<BR><BR>Google（<A href="http://www.google.com/" target=_blank><FONT color=#003366><U>www.google.com</U></FONT></A>）是一个搜索引擎，由两个斯坦福大学博士生Larry Page与Sergey Brin于1998年 9月发明，Google Inc. 于1999年创立。2000年7月份，Google替代Inktomi成为Yahoo公司的搜索引擎，同年9月份，Google成为中国网易公司的搜索引擎。98年至今，GOOGLE已经获得30多项业界大奖。<BR><BR>GOOGLE的成功得益于其强大的功能和独到的特点：<BR><BR>GOOGLE支持多达132种语言，包括简体中文和繁体中文；<BR>GOOGLE网站只提供搜索引擎功能，没有花里胡哨的累赘；<BR>GOOGLE速度极快，据说有10000多台服务器，200多条T3级宽带；<BR><BR>GOOGLE的专利网页级别技术PageRank能够提供高命中率的搜索结果；<BR>GOOGLE的搜索结果摘录查询网页的含有关键字的内容，而不仅仅是网站简介；<BR>GOOGLE智能化的“手气不错”功能，提供可能最符合要求的网站；<BR>GOOGLE的“网页快照”功能，能从GOOGLE服务器里直接取出缓存的网页。<BR><BR>5、搜索入门<BR><BR>要用GOOGLE做搜索，当然首先要进GOOGLE网站--www.google.com；不过，163.com和yahoo.com.cn使用的实际上也是GOOGLE搜索引擎，只是对搜索结果进行了编排，但无法提供一些特色功能，如图片搜索等。<BR><BR>第一次进入GOOGLE，它会根据你的操作系统，确定语言界面。需要提醒的是，GOOGLE是通过cookie来存储页面设定的，所以，如果你的系统禁用cookie，就无法对GOOGLE界面进行个人设定了。<BR><BR>GOOGLE的首页很清爽，LOGO下面，排列了四大功能模块：网站、图像、新闻组和目录服务。默认是网站搜索。现在进行第一次搜索实践，要查找所有关于“易筋经”的中文网站和网页。在搜索框内输入一个关键字“易筋经”，然后点击下面的“google搜索”按钮（或者直接回车），结果就出来了。<BR><BR>搜索：“易筋经”<BR>结果：已搜索有关易筋经的中文(简体)网页。 共约有5,930项查询结果，这是第1-10项 。 搜索用时0.12秒。 <BR><BR>6、初阶搜索<BR><BR>在上例子中，你已经知道了最基本的搜索，即查询包含单个关键字的信息。现在，进一步探讨多个关键字以及关键字间不同逻辑关系的查询。<BR><BR>6.1、搜索结果要求包含两个及两个以上关键字<BR><BR>一般搜索引擎需要在多个关键字之间加上“+”，而GOOGLE无需用明文的“+”来表示逻辑“与”操作，只要空格就可以了。<BR><BR>示例：搜索所有包含关键词“易筋经”和“吸星大法”的中文网页<BR>搜索：“易筋经 吸星大法”<BR>结果：已搜索有关易筋经 吸星大法的中文(简体)网页。 共约有774项查询结果，这是第1-10项 。 搜索用时 0.24秒。 <BR><BR>注意：文章中搜索语法外面的引号仅起引用作用，不能带入搜索栏内。 <BR><BR>6.2、搜索结果要求不包含某些特定信息<BR><BR>GOOGLE用减号“-”表示逻辑“非”操作。<BR><BR>示例：搜索所有包含“易筋经”而不含“吸星大法”的中文网页<BR>搜索：“易筋经 -吸星大法”<BR>结果：已搜索有关易筋经 -吸星大法的中文(简体)网页。 共约有5,150项查询结果，这是第1-10项 。 搜索用时 0.40秒。 <BR><BR>注意：这里的“+”和“-”号，是英文字符，而不是中文字符的“＋”和“－”。此外，操作符与作用的关键字之间，不能有空格。比如“易筋经 - 吸星大法”，搜索引擎将视为关键字为易筋经和吸星大法的逻辑“与”操作，中间的“-”被忽略。<BR><BR>6.3、搜索结果至少包含多个关键字中的任意一个<BR><BR>GOOGLE用大写的“OR”表示逻辑“或”操作。假定你是布兰妮和批头士的歌迷，现在要查找所有关于布兰妮和批头士的中文网页。<BR><BR>示例：搜索包含布兰妮“Britney”或者披头士“Beatles”、或者两者均有的中文网页。<BR>搜索：“Britney OR Beatles OR 布兰妮 OR 批头士”<BR>结果：已搜索有关Britney OR Beatles OR 布兰妮 OR 批头士的中文(简体)网页。 共约有31,300项查询结果，这是第1-10项 。 <BR><BR>注意：小写的“or”，在查询的时候将被忽略；这样上述的操作实际上变成了一次“与”查询。<BR><BR>6.4、“+”、“-”和“OR”的混合查询<BR><BR>混合查询涉及到逻辑操作符的顺序问题。一般而言，搜索引擎按照从左往右的顺序读取操作符号。如果只涉及“与”操作和“非”操作，则不会产生顺序问题，搜索结果数量和关键字顺序无关，不过，具体搜索的结果顺序会视关键字的顺序而定。单纯的“或”操作也同样道理。但是，如果“或”查询和其他两种查询混合在一起，问题就复杂了。现在我们做这样的查询：“所有关于Britney或者Beatles、但是没有Madonna相关信息的中文网页”。<BR><BR>搜索：“Britney OR Beatles -Madonna”<BR>结果：已搜索有关Britney OR Beatles -Madonna的中文(简体)网页。 共约有16,200项查询结果，这是第1-10项 。 搜索用时0.23秒。 <BR><BR>搜索：“-Madonna Britney OR Beatles”<BR>结果：已搜索有关-Madonna Britney OR Beatles的中文(简体)网页。 共约有16,200项查询结果，这是第1-10项 。 搜索用时0.13秒。 <BR><BR>搜索：“Britney -Madonna OR Beatles”<BR>结果：找不到和您的查询-Britney -Madonna OR Beatles-相符的网页<BR><BR>搜索：“Britney OR -Madonna Beatles”<BR>结果：找不到和您的查询-Britney OR -Madonna Beatles -相符的网页<BR><BR>可见，“或”操作的前后两个关键字必须是默认的“与”查询，否则，搜索引擎将无法完成搜索。 <BR><BR>6.5、用“+”和“-”减少冗余信息<BR><BR>通常情况下，用一个关键字查询，会得到很多和查询目的不相关的冗余信息。我们总是希望，搜索结果的第一个条目中就包含所需要的信息。“+”和“-”很多时候就起到缩小搜索结果的范围，以提高查询结果命中率。<BR><BR>例：查阅天龙八部具体是哪八部。<BR><BR>分析：如果光用“天龙八部”做关键字，搜索结果有20,300项，而且排前列的主要与金庸的小说《天龙八部》相关，很难找到所需要的资讯。可以用两个方法减少无关结果。<BR><BR>(1)、如果你知道八部中的某一部，比如阿修罗，增加“阿修罗”关键字。“天龙八部 阿修罗”的搜索结果就只有1,050项，可以很快找到全部八部。<BR><BR>(2)、如果你不知道八部中的任何一部，但知道这与佛教相关，可以排除与金庸小说相关的记录。“天龙八部 佛教 -金庸”的查询结果为1,120项，可以迅速找到需要的资料。</FONT></DIV>
<DIV class=altbg2 style="BORDER-RIGHT: #698cc3 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #698cc3 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 3px 2em 2em; BORDER-LEFT: #698cc3 1px solid; WORD-BREAK: break-all; PADDING-TOP: 10px; BORDER-BOTTOM: #698cc3 1px solid"><FONT color=green>7、辅助搜索<BR><BR>7.1、通配符问题<BR><BR>很多搜索引擎支持通配符号，如“*”代表一连串字符，“?”代表单个字符等。GOOGLE不支持通配符，只能做精确查询，关键字中的“*”或者“?”会被忽略掉。<BR><BR>7.2、关键字的字母大小写<BR><BR>GOOGLE对英文字符大小写不敏感，“GOD”和“god”搜索的结果是一样的。<BR><BR>7.3、搜索整个句子<BR><BR>GOOGLE的关键字可以是词组（中间没有空格），也可以是句子（中间有空格），但是，用句子做关键字，必须加英文引号。<BR><BR>示例：搜索包含“long, long ago”字串的页面。<BR>搜索：“"long long ago"”<BR>结果：已搜索有关long long ago的中文(简体)网页。 共约有16,500项查询结果，这是第1-10项 。 搜索用时 0.06秒。<BR><BR>7.4、搜索引擎忽略的字符和词汇<BR><BR>GOOGLE对一些网路上出现频率极高的英文单词，如“i”、“com”、“www”等，以及一些符号如“*”、“.”等，作忽略处理。<BR><BR>示例：搜索关于第一次世界大战的信息<BR>搜索：“"worldwar i"”<BR>结果："i"使用过于频繁，没有被列入搜索范围。已向英特网搜索"worldwar i". 共约有7,370项查询结果，这是第1-10项 。 搜索用时0.17秒。 <BR><BR>7.5、强制搜索<BR><BR>如果要对忽略的关键字进行强制搜索，则需要在该关键字前加上明文的“+”号。<BR><BR>示例：搜索包含“Who am I ?”的网页。如果用“"who am i ?"”，“Who”、“I”、“?”会被省略掉，搜索将只用“am”作关键字，所以应该用强制搜索。<BR>搜索：“"+who +am +i"”<BR>结果：已向英特网搜索"+who +am +i". 共约有332,000项查询结果，这是第1-10项 。 搜索用时3.68秒。 <BR><BR>注意：大部分常用英文符号（如问号，句号，逗号等）无法成为搜索关键字，加强制也不行。<BR><BR>8、进阶搜索<BR><BR>上面已经探讨了GOOGLE的一些最基础搜索语法。通常而言，这些简单的搜索语法已经能解决绝大部分问题了。不过，如果想更迅速更贴切找到需要的信息，你还需要了解更多的东西。 <BR><BR>8.1、对搜索的网站进行限制<BR><BR>“site”表示搜索结果局限于某个具体网站或者网站频道，如“sina.com.cn”、“edu.sina.com.cn”，或者是某个域名，如“com.cn”、“com”等等。如果是要排除某网站或者域名范围内的页面，只需用“-网站/域名”。<BR><BR>示例：搜索中文教育科研网站（edu.cn）上所有包含“金庸”的页面。<BR>搜索：“金庸 site:edu.cn”<BR>结果：已搜索有关金庸 site:edu.cn的中文(简体)网页。 共约有1,730项查询结果，这是第1-10项 。 搜索用时 0.23秒。<BR><BR>示例：搜索包含“金庸”和“古龙”的中文新浪网站页面，<BR>搜索：“金庸 古龙 site:sina.com.cn”<BR>结果：已在sina.com.cn搜索有关金庸 古龙 的中文(简体)网页。 共约有734项查询结果，这是第1-10项 。 搜索用时0.12秒。 <BR><BR>示例：搜索新浪文教频道中关于鲁迅的信息。<BR>搜索：“鲁迅 site:edu.sina.com.cn”<BR>结果：已在edu.sina.com.cn搜索有关 鲁迅的中文(简体)网页。 共约有672项查询结果，这是第1-10项 。 搜索用时0.24秒。 <BR><BR>注意：site后的冒号为英文字符，而且，冒号后不能有空格，否则，“site:”将被作为一个搜索的关键字。此外，网站域名不能有“http”以及“www”前缀，也不能有任何“/”的目录后缀；网站频道则只局限于“频道名.域名”方式，而不能是“域名/频道名”方式。诸如“金庸 site:edu.sina.com.cn/1/”的语法是错误的。<BR><BR>8.2、查询某一类文件（往往带有同一扩展名）<BR><BR>“filetype:”，这是个尚在测试阶段的GOOGLE特色查询，不过功能已经非常强大，可以做很多意想不到的事情哦。:)<BR><BR>最重要的文档搜索是PDF搜索。PDF是ADOBE公司开发的电子文档格式，现在已经成为互联网的电子化出版标准。目前GOOGLE检索的PDF文档大约有2500万左右。PDF文档通常是一些图文并茂的综合性文档，提供的资讯一般比较集中全面。<BR><BR>示例：搜索关于电子商务（ECOMMERCE）的PDF文档。<BR>搜索：“ecommerce filetype:pdf”<BR>结果：已向英特网搜索ecommerce filetype:pdf. 共约有25,500项查询结果，这是第91-100项 。 搜索用时 0.44秒。 <BR><BR>下面是某项搜索结果：<BR><BR>[PDF] <A href="http://www.ecommerce.gov/apec" target=_blank><FONT color=#003366><U>www.ecommerce.gov/apec</U></FONT></A><BR>文档类型: PDF/Adobe Acrobat - 一般文字档<BR>Page 1. A Partnership of the Business Community With APEC Economies E-COMMERCE<BR>READINESS ASSESSMENT GUIDE <A href="http://www.ecommerce.gov/apec" target=_blank><FONT color=#003366><U>www.ecommerce.gov/apec</U></FONT></A> Page 2. ... <BR><A href="http://www.ecommerce.gov/apec/docs/read" target=_blank><FONT color=#003366><U>www.ecommerce.gov/apec/docs/read</U></FONT></A> ... adiness_guide_5.pdf - 类似网页<BR><BR>可以看到，GOOGLE在PDF档前加上了[PDF]的标记，而且，GOOGLE把PDF文件转换成了文字档，点击“一般文字档”，可以粗略的查看该PDF文档的大致内容。当然，PDF原有的图片以及格式是没有了。<BR><BR>搜索PDF文档还可以用“inurl:”语法。比如上例，也可以用“inurl:pdf ecommerce”。搜索结果数量大致相同，不过查询结果顺序则略有很大差别。<BR><BR>注意，上述查询均是对PDF内文的检索，“ecommerce”这个关键字是包含在PDF文档中的。<BR><BR>“filetype”的另一个强大用处则在图片搜索。下文将对GOOGLE的图片搜索功能作详细说明，此处只是略提一下。进入“<A href="http://images.google.com/" target=_blank><FONT color=#003366><U>http://images.google.com/</U></FONT></A>”，查找关于本拉登的JPG图片。<BR><BR>搜索：“Bin Laden filetype:jpg”<BR>结果：搜索有关 Bin Laden filetype:jpg 的图片（）。（试验版） 共约有1,630项查询结果，这是第1-20项 。 搜索用时0.14秒。 <BR><BR>除此之外，我尚未发现其他的filetype用法。如果有谁知道，请给我发邮件。预先感谢。:)<BR><BR>8.3、搜索的关键字包含在URL链接中<BR><BR>“inurl”语法返回的网页链接中包含第一个关键字，后面的关键字则出现在链接中或者网页文档中。有很多网站把某一类具有相同属性的资源名称显示在目录名称或者网页名称中，比如“MP3”、“GALLARY”等，于是，就可以用INURL语法找到这些相关资源链接，然后，用第二个关键词确定是否有某项具体资料。INURL语法和基本搜索语法的最大区别在于，前者通常能提供非常精确的专题资料。<BR><BR>示例：查找MIDI曲“沧海一声笑”。<BR>搜索：“inurl:midi 沧海一声笑”<BR>结果：已搜索有关inurl:midi 沧海一声笑的中文(简体)网页。 共约有16项查询结果，这是第1-10项 。 搜索用时0.16秒。 <BR><BR>示例：查找微软网站上关于windows2000的安全课题资料。<BR>搜索：“inurl:security windows2000 site:microsoft.com”<BR>结果：已在microsoft.com内搜索有关inurl:security windows2000 的网页。 共约有188项查询结果，这是第1-10项 。 搜索用时0.27秒。<BR><BR>注意：“inurl:”后面不能有空格，GOOGLE也不对URL符号如“/”进行搜索。例如，GOOGLE会把“cgi-bin/phf”中的“/”当成空格处理。<BR><BR>“allinurl”语法返回的网页的链接中包含所有作用关键字。这个查询的关键字只集中于网页的链接字符串。<BR><BR>示例：查找可能具有PHF安全漏洞的公司网站。通常这些网站的CGI-BIN目录中含有PHF脚本程序（这个脚本是不安全的），表现在链接中就是“域名/cgi-bin/phf”。<BR>语法：“allinurl:"cgi-bin" phf +com”<BR>搜索：已向英特网搜索allinurl:"cgi-bin" phf +com. 共约有37项查询结果，这是第1-10项 。 搜索用时0.36秒。 <BR><BR>8.4、搜索的关键字包含在网页标题中<BR><BR>“intitle”和“allintitle”的用法类似于上面的inurl和allinurl，只是后者对URL进行查询，而前者对网页的标题栏进行查询。网页标题，就是HTML标记语言title中之间的部分。网页设计的一个原则就是要把主页的关键内容用简洁的语言表示在网页标题中。因此，只查询标题栏，通常也可以找到高相关率的专题页面。<BR><BR>示例：查找日本明星藤原纪香的照片集。<BR>搜索：“intitle:藤原纪香 写真”<BR>结果：已搜索有关intitle:藤原纪香 写真的中文(简体)网页。 共约有465项查询结果，这是第1-10项 。 搜索用时0.16秒</FONT>。</DIV>
<DIV class=altbg2 style="BORDER-RIGHT: #698cc3 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #698cc3 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 3px 2em 2em; BORDER-LEFT: #698cc3 1px solid; WORD-BREAK: break-all; PADDING-TOP: 10px; BORDER-BOTTOM: #698cc3 1px solid">Google搜索从入门到精通 v4.0 （三）<BR><BR>9、其他罕用语法<BR><BR>9.1、搜索所有链接到某个URL地址的网页<BR><BR>如果你拥有一个个人网站，估计很想知道有多少人对你的网站作了链接。而“link”语法就能让你迅速达到这个目的。<BR><BR>示例：搜索所有含指向华军软件园“<A href="http://www.newhua.com/" target=_blank><FONT color=#003366><U>www.newhua.com</U></FONT></A>”链接的网页。<BR>搜索：“link:<A href="http://www.newhua.com/" target=_blank><FONT color=#003366><U>www.newhua.com</U></FONT></A>”<BR>结果：搜索有链接到<A href="http://www.newhua.com/" target=_blank><FONT color=#003366><U>www.newhua.com</U></FONT></A>的网页 。 共约有856项查询结果，这是第1-10项 。 搜索用时0.17秒。 <BR><BR>注意：“link”不能与其他语法相混合操作，所以“link:”后面即使有空格，也将被GOOGLE忽略。<BR><BR>9.2、查找与某个页面结构内容相似的页面<BR><BR>“related”用来搜索结构内容方面相似的网页。例：搜索所有与中文新浪网主页相似的页面（如网易首页，搜狐首页，中华网首页等），“related:wwwsina.com.cn/index.shtml”。<BR><BR>9.3、从GOOGLE服务器上缓存页面中查询信息<BR><BR>“cache”用来搜索GOOGLE服务器上某页面的缓存，通常用于查找某些已经被删除的死链接网页，相当于使用普通搜索结果页面中的“网页快照”功能。<BR><BR>示例：查找GOOGLE缓存的中文yahoo首页<BR>搜索：“cache:<A href="http://www.yahoo.com.cn/" target=_blank><FONT color=#003366><U>www.yahoo.com.cn</U></FONT></A>”<BR>结果：这是 Google 内 <A href="http://cn.yahoo.com/" target=_blank><FONT color=#003366><U>http://cn.yahoo.com/</U></FONT></A> 的页库快照。<BR>Google 已先预览各网站，拍下网页的快照存档。<BR>这网页可能有更新的版本，请按此查看新版。 Google 和网页作者无关，不对网页的内容负责。<BR>...<BR><BR>9.4、info<BR><BR>info用来显示与某链接相关的一系列搜索，提供cache、link、related和完全包含该链接的网页的功能。<BR><BR>示例：查找和新浪首页相关的一些资讯。<BR>搜索：“info:<A href="http://www.sina.com.cn/" target=_blank><FONT color=#003366><U>www.sina.com.cn</U></FONT></A>”<BR>结果：有关<A href="http://www.sina.com.cn/" target=_blank><FONT color=#003366><U>www.sina.com.cn</U></FONT></A>的网页信息。 <BR><BR>新浪首页<BR>北京站 上海站 广东站. ... 首页, |, 新闻, |, 体育, |, 财经, |, <BR>科技, |, 娱乐, |, 游戏, |, 军事, |, 健康, |, 教育, |, 汽车, |,<BR>女性, |, 个人家园. ... <BR>简介: 位于北京的新闻中心，包括新闻与评论。 <BR>类别: World &gt; Chinese Simplified &gt; 新闻<BR><BR>Google 提供这个网址的信息:<BR><BR>查看Google网页快照里<A href="http://www.sina.com.cn/" target=_blank><FONT color=#003366><U>www.sina.com.cn</U></FONT></A>的存档 <BR>寻找和<A href="http://www.sina.com.cn/" target=_blank><FONT color=#003366><U>www.sina.com.cn</U></FONT></A>类似的网页 <BR>寻找网页有链接到<A href="http://www.sina.com.cn/" target=_blank><FONT color=#003366><U>www.sina.com.cn</U></FONT></A> <BR>寻找网页包含有"www.sina.com.cn"<BR><BR>10、图片搜索<BR><BR>我不得不承认，GOOGLE的图片搜索功能真是个伟大的发明！！GOOGLE自称可以检索320,000,000张图片，并称自己为“互联网上最好用的图像搜索工具”。尽管目前该功能尚在B测试阶段，但的确已经非常好用！<BR><BR>GOOGLE首页点击“图像”链接就进入了GOOGLE的图像搜索界面“images.google.com”。你可以在关键字栏位内输入描述图像内容的关键字，如“britney spears”，就会搜索到大量的小甜甜布兰妮的图片。我目前尚不是很清楚图片的排列标准，不过以观察来看，似乎图片文件名完全符合关键字的结果排列比较考前，然后才按照普通的页面搜索时的标准排列。<BR><BR>GOOGLE给出的搜索结果具有一个直观的缩略图（THUMBNAIL），以及对该缩略图的简单描述，如图像文件名称，以及大小等。点击缩略图，页面分成两祯，上祯是图像之缩略图，以及页面链接，而下祯，则是该图像所处的页面。屏幕右上角有一个“Remove Frame”的按钮，可以把框架页面迅速切换到单祯的结果页面，非常方便。<BR><BR>GOOGLE图像搜索目前支持的语法包括“+”，“-”，“OR”，“site”和“filetype”。<BR><BR>示例：查找美国教育网上的宇宙大爆炸jpg图片<BR>搜索：“BIG BANG filetype:jpg site:edu”<BR>结果：搜索有关 BIG BANG filetype:jpg site:edu 的图片（）。（试验版） 共约有337项查询结果，这是第1-20项 。 搜索用时1.99秒。 <BR><BR>11、目录内搜索<BR><BR>如果不想搜索广泛的网页，而是想寻找某些专题网站，可以访问GOOGLE的分类目录“<A href="http://directory.google./" target=_blank><FONT color=#003366><U>http://directory.google.</U></FONT></A> com/” ，中文目录是“<A href="http://directory.google.com/Top/World/Chinese_Simplified/" target=_blank><FONT color=#003366><U>http://directory.google.com/Top/World/Chinese_Simplified/</U></FONT></A>”。 目前GOOGLE使用的分类目录采用了ODP的内容。“Open Directory Project”是网景公司所主持的一项大型公共网页目录。由全世界各地的义务编辑人员来审核挑选网页，并依照网页的性质及内容来分门别类。因此，在某一目录门类中进行搜索往往能有更高的命中率。另外，GOOGLE根据其专业的“网页级别”（PageRank）技术对目录中登录的网站进行了排序，可以让一般的检索更具高效率。<BR><BR>示例：查找一下关于癌症治疗以及护理方面的中文资料<BR>搜索：先进入中文简体分类目录，再进入“健康”子目录，确定选中“只在健康中搜索”单选项目。在搜索栏内填入“癌症”进行搜索。<BR>结果：在分类健康项中搜索癌症。 共约有370项查询结果，这是第1-10项 。 搜索用时0.05秒。 <BR><BR>可以看到，上述查询结果比普通的检索更有效，因为在分类健康项中进行搜索剔除了很多不相关的诸如新闻之类的无效信息。不过，对于中文用户而言，现在最大的问题是志愿的中文目录编辑太少，导致收录站点太少，因此搜索结果范围显得过于狭隘。但愿这个问题能随着GOOGLE以及ODP项目在国内名声的响亮而能得到改观。<BR><BR>12、新闻组（USENET）搜索<BR><BR>新闻组有详尽的分类主题，某些主题还有专人管理和编辑，具有大量的有价值信息。由于新闻组包含的信息实在是海量，因此不利用工具进行检索是不大可能的。DEJA一直是新闻组搜索引擎中的佼佼者。2001年2月份，GOOGLE将DEJA收购并提供了所有DEJA的功能。现在，除了搜索之外，GOOGLE还支持新闻组的WEB方式浏览和张贴功能。<BR><BR>进入GOOGLE新闻组“<A href="http://groups.google.com/" target=_blank><FONT color=#003366><U>http://groups.google.com/</U></FONT></A>”，你有两种信息查找方式。一种是一层层的点击进入特定主题讨论组，另一种则是直接搜索。现在，我们进行一个最简单的搜索试验，查找一下新闻组中关于山顶洞人的讨论信息。<BR><BR>搜索：“山顶洞人”<BR>结果：在各群组内搜索 山顶洞人 共约有18项查询结果，这是第1-10项 。 搜索用时0.29秒。 <BR><BR>搜索结果默认按照“留言内容”排列，但是你也可以点击“依照日期”按钮，让帖子按照发布日期排列。<BR><BR>因为新闻组中的帖子实在是多，而且又涉及一些普通搜索所没有的语法，所以建议使用“高级群组搜寻”进入高级搜索界面。新闻组高级搜索提供留言内容、分类主题、标题、留言者、留言代码、语言和发布日期作为条件进行搜索。其中作者项指作者发帖所用的唯一识别号电子信箱。<BR><BR>13、GOOGLE的其他杰出功能<BR><BR>13.1、集成化的工具条<BR><BR>为了方便搜索者，GOOGLE提供了工具条，集成于浏览器中，用户无需打开GOOGLE主页就可以在工具条内输入关键字进行搜索。此外，工具条还提供了其他许多功能，如显示页面PageRank等。最方便的一点在于用户可以快捷的在GOOGLE主页、目录服务、新闻组搜索、高级搜索和搜索设定之间切换。欲安装GOOGLE的工具条，可以访问“<A href="http://toolbar.google.com/" target=_blank><FONT color=#003366><U>http://toolbar.google.com/</U></FONT></A>”，按页面提示可以自动下载并安装。不过，GOOGLE工具条目前只支持IE5.0以上版本。<BR><BR>对于经常进行网络搜索者而言，GOOGLE工具条实在是必备的东西！！<BR><BR>13.2、单词英文解释<BR><BR>写英文文章的时候，最头疼的事情就是对某个英文单词的用法不确定。现在有了GOOGLE，一切就迎刃而解了！无论你是想查找某个生词的意思还是想了解某个单词的用法，均可使用在线词典。 进入英文GOOGLE，输入你要查的单词。举个例子，我想查一下suggest的用法。结果如下：“Searched the web for suggest. Results 1 - 10 of about 8,000,000. Search took 0.08 seconds. ”注意看上面句子中，单词suggest下出现了一个横线，点击这个链接，就跳转到另外一个网站“<A href="http://www.dictionary.com/" target=_blank><FONT color=#003366><U>http://www.dictionary.com/</U></FONT></A>”，GOOGLE已经把单词提交给该网站的查询脚本。看看这个网站所提供的详尽解释吧。:)<BR><BR>13.3、网页翻译<BR><BR>你懂英文，但是你不见得就懂德文、法文、拉丁文。如果搜索出来的页面是这些语言怎么办？呵呵，GOOGLE 提供了网页翻译功能！！虽然目前只支持有限的拉丁语、法语、西班牙语、德语和葡萄牙文，但是我不得不承认，这是个杰出功能。<BR><BR>试着做以下搜索：“big bang site:fr”。这个表示查找关于宇宙大爆炸的法文网页。看第一条结果：<BR><BR>The Big Bang Website - [ Translate this page ]<BR>... A propos de Big Bang. Le dernier numéro en date. Les anciens numéros. Autres<BR>activités. Concerts progressifs en France. Emissions de radio. Liens. <BR>perso.club-internet.fr/calyx/bigbang/ - 3k - Cached - Similar pages<BR><BR>有点晕。没关系，点击“Translate this page”按钮。再看结果，嗯，大致能看明白，这原来是个叫“big bang”的乐队的网站，与大爆炸无关...<BR><BR>机器翻译是一个很前沿的人工智能课题，想指望翻译出来的结果跟专门用英语撰写的内容是不可能的。但西文间的互相转译比中英文机译强得多得多了。至少能看明白。<BR><BR>13.4、搜索结果过滤<BR><BR>网络上的成人内容浩如烟海，而且很多站点具有欺骗或者其他不良企图，浏览者很容易掉入其中的陷阱。为此，GOOGLE新设立了成人内容过滤功能，见GOOGLE的设置页面，<A href="http://www.google.com/preferences" target=_blank><FONT color=#003366><U>http://www.google.com/preferences</U></FONT></A>，最底下有一个选项SafeSearch Filtering。不过，中文状态下的GOOGLE尚没有这个功能。<BR><BR><BR>搜索技巧专题<BR>Google搜索从入门到精通 v4.0 （四）<BR><BR>14、搜索技巧之关键词选择初探<BR><BR>关键词的选择在搜索中起到决定性的作用，所有搜索技巧中，关键词选择是最基本也是最有效的。<BR><BR>例一：查找《镜花缘》一书中淑士国酒保的酸话原文。<BR><BR>分析：如果按照一般的思路，找某部小说中的具体段落，就需要用搜索引擎先找到这本书，然后再翻到该段落。这样做当然可以，但是效率很低。如果了解目标信息的构成，用一些目标信息所特有的字词，可以非常迅速的查到所需要的资料。也就是说，高效率的搜索关键字不一定就是目标信息的主题。在上面的例子中，酒保谈到酒的浓淡与贵贱的关系时，之乎者也横飞。因此，可以用特定的词语一下子找到目标资料。<BR><BR>搜索：“酒 贵 贱 之”，OK，找到的第一条信息就是镜花缘的这一段落：“先生听者：今以酒醋论之，酒价贱之，醋价贵之。因何贱之？为甚贵之？真所分之，在其味之。酒昧淡之，故而贱之；醋味厚之，所以贵之。...”<BR><BR>以上的关键字选择技巧可以谓之“特定词法”。<BR><BR>例二：“黄花闺女”一词中“黄花”是什么意思。<BR><BR>分析：“黄花闺女”是一个约定的俗语，如果只用“黄花闺女 <BR>黄花”做关键词，搜索结果将浩如烟海，没什么价值，因此必须要加更多的关键词，约束搜索结果。选择什么关键词好呢？备选的有“意思”、“含义”、“来历”、“由来”、“典故”、“出典”、“渊源”等，可以猜到的是，类似的资料，应该包含在一些民俗介绍性的文字里，所以用诸如“来历”、“由来”、“出典”等词汇的概率更高一些。 搜索：“黄花闺女 黄花 由来”，查到“黄花”原来出典于《太平御览》，与南朝的寿阳公主相关。如果想获得第一手资料，那就可以用“太平御览 寿阳公主”做搜索了。<BR><BR>以上的关键字选择技巧可以谓之“近义词法”。<BR><BR>例三：刘德华同志的胸围是多少。<BR><BR>分析：首先声明，这是某个MM要我做的搜索，我把它作为搜索案例而已，没其他的意思。非常直接的搜索是，“刘德华 胸围”，但事实上，这么搜索出来的结果，尽是一些诸如“刘德华取笑莫文蔚胸围太小”之类的八卦新闻，无法快速得到所需要的资料。可以想到的是，需要的资料应该包含在刘德华的全面介绍性文字中，除了胸围，应该还包括他的身高，体重，生日等一系列相关信息。OK，这样就可以进一步的增加其他约束性关键词以缩小搜索范围。<BR><BR>搜索：“刘德华 胸围 身高”，没有料到的情况发生了，网上炙手可热的痞子蔡《第一次亲密接触》里居然含有这样关键字，阿泰“改编自刘德华《忘情水》的变态歪歌”、“用身高体重三围和生日来加以编号”。好办，把这部小说去掉，“刘德华 胸围 身高 -阿泰”，OK，结果出来了，华仔胸围84cm。说明一下，为什么用“阿泰”而不用“第一次亲密接触”呢？这是因为小说的名字被转载的时候可能有变动，但里面角色的名字是不会变的。<BR><BR>以上的关键字选择技巧可以谓之“相关词法”。<BR><BR>15、常用搜索个案<BR><BR>15.1、找人<BR><BR>分析：一个人在网上揭示的资料通常有：姓名，网名，性别，年龄，毕业学校，工作单位，外号，住址，电话，信箱，BP，手机号码，ICQ号，OICQ号等等。所以，如果你要了解一下你多年没见过的同学，那不妨用上述信息做关键字进行查询，也许会有大的收获。<BR><BR>15.2、找软件<BR><BR>分析一：最简单的搜索当然就是直接以软件名称以及版本号为关键字查询。但是，仅仅有软件名称和目标网站，显然还不行，因为搜索到的可能是软件的相关新闻。应该再增加一个关键字。考虑到下载页面上常有“点击此处下载”或者“download”的提示语，因此，可以增加“下载”或者“download”为关键字。<BR>搜索：“winzip 8.0 下载”<BR>结果：已搜索有关winzip 8.0 下载的中文(简体)网页。共约有6,670项查询结果，这是第1-10项。搜索用0.22秒。<BR><BR>分析二：很多网站设有专门的下载目录，而且就命名为“download”，因此，可以用INURL语法直接搜索这些下载目录。<BR>搜索：“winzip 8.0 inurl:download”<BR>结果：已搜索有关winzip 8.0 inurl:download的中文(简体)网页。共约有358项查询结果，这是第1-10项。搜索用时0.44秒。<BR><BR>在互联网上随意的下载软件是不安全的，因为供下载的软件有可能带有病毒或者捆绑了木马，所以，对下载网站作一个限定，是一个稳妥的思路。可以用SITE语法达到这个目的。<BR><BR>共享软件下载完之后，使用的时候，软件总跳出警示框，或者软件的功能受到一定限制。由于中国的网民多是穷棒子，所以应该再找一个注册码。找注册码，除了软件的名称和版本号外，还需要有诸如“serial number”、“sn”、“序列号”等关键字。现在，来搜索一下winzip8.0的注册码。<BR>搜索：“winzip 8.0 sn”<BR>结果：已向英特网搜索winzip 8.0 sn. 共约有777项查询结果，这是第1-10项。搜索用时0.30秒。<BR><BR>15.3、找图片<BR><BR>除了GOOGLE提供的专门图片搜索功能，还可以组合使用一些搜索语法，达到图片搜索之目的。<BR><BR>分析一：专门的图片集合，提供图片的网站通常会把图片放在某个专门目录下，如“gallary”、“album”、“photo”、“image”等。这样就可以使用INURL语法迅速找到这类目录。现在，试着找找小甜甜布兰妮的照片集。<BR>搜索：?quot;britney spears" inurl:photo”<BR>结果：已向英特网搜索"britney spears" inurl:photo. 共约有2,720项查询结果，这是第1-10项。搜索用时0.23秒。<BR><BR>分析二：提供图片集合的网页，在标题栏内通常会注明，这是谁谁的图片集合。于是就可以用INTITLE语法找到这类网页。<BR>搜索：“intitle:"britney spears" picture”<BR>结果：已向英特网搜索intitle:"britney spears" picture. 共约有317项查询结果，这是第1-10项。搜索用时0.40秒。<BR><BR>分析三：明星的FANS通常会申请免费个人主页来存放他们偶像的靓照。于是用SITE语法指定某免费主页提供站点，是个迅速找到图片的好办法。<BR>搜索：“"britney spears" site:geocities.com”<BR>结果：已在geocities.com内搜索有关"britney spears"的网页。共约有5,020项查询结果，这是第1-10项。搜索用时0.47秒。<BR><BR>15.4、找MP3<BR><BR>分析一：提供MP3的网站，通常会建立一个叫做MP3的目录，目录底下分门别类的存放各种MP3乐曲。所以，可以用INURL语法迅速找到这类目录。现在用这个办法找找老歌“say you say me”。<BR>搜索：“"say you say me" inurl:mp3”<BR>结果：已向英特网搜索inurl:mp3 "say you say me". 共约有155项查询结果，这是第1-10项。搜索用时0.17秒。<BR><BR>分析二：也可以通过网页标题，找到这类提供MP3的网页。<BR>搜索：“"say you say me" intitle:mp3”<BR>结果：已向英特网搜索"say you say me" intitle:mp3. 共约有178项查询结果，这是第1-10项。搜索用时0.73秒。<BR><BR>当然，如果你知道某个网站的下载速度快，而且乐曲全，就可以用SITE语法先到该网站上看看有没有目标乐曲。<BR><BR>15.5、找书<BR><BR>分析一：对我而言，常访问的电子图书馆类网站就那么几个，比如文艺类的“<A href="http://www.shuku.net/" target=_blank><FONT color=#003366><U>www.shuku.net</U></FONT></A>”。于是可以用SITE语法很简单的找到某本书（如果该网站上有的话）。比如，“旧唐书 site:shuku.net”，就可以马上找到该书。如果没有，通常别的网站上也很难找到。因此，找书的关键，是你了解一大批著名的图书馆网站。 <BR><BR>分析二：我上面介绍的第一项关键字选择技巧特定词法，对于迅速找到某书或者文章也是极其有用的，当然，这得建立在你已经读过该书，对书的内容有印象的基础上。比如如果了解堂吉诃德一书战风车的大致内容，就可以用“吉诃德 风车 桑乔”迅速找到该书。<BR><BR>16、GOOGLE搜索FAQ<BR><BR>Q：如何全面的了解google.com？<BR>A：查看网站相关页面“<A href="http://www.google.com/about.html" target=_blank><FONT color=#003366><U>http://www.google.com/about.html</U></FONT></A>”。<BR><BR>Q：如何切换google.com的初始语言界面？<BR>A：点击搜索栏右边的“使用偏好”（Preferences），选择“界面语言”（Interface Language）中你期望的语言，点击最下面的“设定使用偏好”（Save Preferences）按钮。需要提醒的是，GOOGLE用cookie记录这个偏好，所以如果你把浏览器的cookie功能关掉，就无法进行设定。<BR><BR>Q：如何设定每页搜索结果显示数量？<BR>A：同上，进入使用偏好，在该页的“查看结果”（Number of Results）选择显示结果数，数目越大，显示结果需要的时间越长，默认是10项。<BR><BR>Q：搜索到的链接无法打开怎么办？<BR>A：链接无法打开的原因很多，比如网站当机，或者页面已经死掉等等，可以点击GOOGLE的“网页快照”查看在GOOGLE服务器上的网页缓存。不过，如果该页面是被当地ISP过滤的话，服务器缓存还是无法打开。唯一的办法在于利用代理服务器，然后在URL栏内输入链接的IP地址。<BR><BR>Q：打开搜索结果的链接，可是该页面太大，很难找到一下子找到目的资料怎么办？<BR>A：直接打开“网页快照”，GOOGLE会把关键词用不同颜色标记出来，很容易找到。<BR><BR>Q：点击每个查询结果的时候，我想单独弹出窗口，这该怎么办？<BR>A：进入“使用偏好”界面，注意底部有个“结果视窗”项目，选中“开启新视窗以显示查询结果”复选框然后存储设置就可以了。</DIV></DIV><img src ="http://www.cnitblog.com/kenlen/aggbug/3842.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/kenlen/" target="_blank">Kenlen</a> 2005-11-03 13:31 <a href="http://www.cnitblog.com/kenlen/articles/3842.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>