说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

VB制作自己的网络搜索软件

HTML文档下载 WORD文档下载 PDF文档下载
VB制作自己的网络搜索软件

大家都知道,获得信息是我们上网的很大一个目的,而获得信息对于大多数人来说要通过网上的搜索引擎来搜索自己所需要的信息,而搜索软件通过向搜索站点发出特殊搜索字串命令(各个站点的格式不一样),然后用软件对结果进行处理后显示出来。原理简单,可是效果却是显著的,能够迅速而方便的搜索到各个站点的信息。下面我就通过介绍使用 vb制作自己的搜索软件和剖析现在流行的搜索软件程序来介绍这些内容:
  我们都知道vb是最简单方便的编程语言,利用vb编写一个小小的搜索软件用不了多少行语句。第一步当然要安装一个vb5.0或者6.0 的运行环境。启动vb以后,首先创建了一个窗体,然后要对运行环境进行一下设置:具体来说呢,就是添加上必要的控件,一般来说,如果您安装了IE4.0以上的浏览器,windows的 system目录中就会有SHDOCVW.DLL的文件,我们通过点击菜单中“工程http://127.0.0.1/netware/”-“部件http://127.0.0.1/netware/”,在弹出的对话框中找到有一栏写着http://127.0.0.1/netware/”microsoft internet controlshttp://127.0.0.1/netware/”的选项,这个选项其实就是上面提到的SHDOCVW.DLL 文件的描述。利用这个文件我们可以初始化一个浏览器的实例。当您选中这个选项后,会发现工具栏中多了一个形状如同地球的按钮,这就是刚才选中的浏览器控件,我们双击这个图标按钮在窗体上生成一个webbrowser1 的部件,接下来我们就使用这个部件来显示查询的结果。

  接下来我们在窗体上放上一个文本框和一个按钮,其实就这几个部件已经可以算是一个最小的搜索程序基本结构了。我们现在来所一说网络搜索的原理:上面已经提到是通过向搜索站点发出特殊搜索字串命令(各个站点的格式不一样),然后用软件对结果进行处理后显示出来,但如何发出搜索字符串、发出怎样的字符串还需要有一定的HTML 知识。我们知道对于网上信息的的发送是通过表单的形式来发送的,也就是说当我们在网上点击某些表单时,通过表单中包含的默认地址中的表单处理程序来接受所有包含在表单中的信息,而这些信息有的是显示的,而另外一些却是隐藏的。您可以试着将一个包含有表单的网页用Frontpage或者Dreamwaver打开,这时你就会发现有很多用浏览器看不到的东西,这些隐藏的标志同样在您发送表单时起着重要的作用。没有这些标志,发出的字符串很可能得不到服务器的应答。我们知道了这些,再返回头来看我们程序所需发出的字符串,举个例子来说:最常用的雅虎中文的搜索代码是 http://127.0.0.1/netware/”http://cn.search.yahoo.com/search/gb?p=***http://127.0.0.1/netware/”,其中***代表的是所要搜索的字符串,而剩余的部分是处理字符串的服务器程序的地址,另外一个我们很常用的搜索引擎Yeah,它的搜索代码相对复杂了一些是http://127.0.0.1/netware/”http://www2.yeah.net/cgi-bin/query2.exe?query=***&start=0&REXP=ANDhttp://127.0.0.1/netware/” ,但基本的东西没有变,它们都是使用了这样一种形式:http://目标URL?参数1名=参数1值&参数2名=参数2值&参数3名=参数3值…

  对于http协议,其中包括重要的几种传送数据的方法,其中比较常用的有GET和POST方法,对于使用GET方法进行传送数据的网站来说,使用上面的形式百发百中,都能够通过一条查询语句返回所需要查询的内容网页,但对于使用 POST方法的网站,有可能返回不了查询结果网页,不过从我的经验看,一般来说是能够成功的。

  知道了如何向服务器发送查询语句,下面我们就从程序的角度来写:假若窗体上有一个文本框Text1、一个标签Label1、一个浏览器Webbrowser1、一个按钮Command11,其中文本框用于输入关键词,浏览器用于显示查询结果网页,按钮用于发出请求语句,那么点击Command1的程序语句可以这样写:

Private Sub Command1_Click()

Dim url As String

On Error Resume Next '出错后继续

If Text1.Text = "" Then MsgBox "请先输入关键字": Exit Sub '防止不输入关键词

url = "http://search.chinese.yahoo.com/search/gb?p=" +Text1.Text '将关键词放入查询语句中

Webbrowser1.Navigate url'调用浏览器显示查询结果

End Sub

  雅虎的查询语句比较简单,而对于比较复杂网站的查询语句一定要注意的是各个关键参数之间一定要用“&http://127.0.0.1/netware/”来隔开。虽然你只是学会了这一招,但已经足够利用网上的资源来编写你的第一个程序了,因为网上所有类型的表单都能表示了,无论是查询股票、软件、书籍、图片,都不外乎这种模式。只要你将查询网页调入 Frontpage、Dreamwaver等所见即所得的网页编辑软件中,便会毫无遮拦的展现在你的面前,利用这些链接,再加上一个好的界面,当然可以制作自己的搜索工具软件了,不过要注意的是,有些表单的传送路径的是相对路径,这时要加上网站的地址链接。
  可能有人要说,这么简单,谁不知道,不是为了赚稿费吧?错。刚才的方法比起直接访问搜索站点的确能节省不少上网的时间,但并没有将程序的优势全部发挥出来,我们现在继续讲另外一种检索网页的方法:首先介绍一个控件Microsoft Internet Transfer(这个控件在安装vb或者某些程序的时候会自动安装),这个控件允许建立与其他计算机的链接,并传送文件。它使两个Internet规则 HTTP和FTP的使用变得容易。当正常访问一个网页时,Internent Transfer用GET命令访问网络浏览器的一个文件。例如,如果打开了URL http://www.cpcw.com/index.htm,浏览器将建立与地址在www.cpcw.com的机器的链接,并传送命令GET/index.htm。HTML 将通过链接以普通文本的方式返回,因为返回的内容只是所要的网页的源文件,节省了很多用于传送显示网页中图像的时间,速度要快了许多,但最重要的是我们可以很方便地使用自己的逻辑对凡会的源文件进行正确地分析和格式化,重新整理网页的查询结果。

  我们还用刚才的窗体,只是要在菜单中选择“工程“-http://127.0.0.1/netware/”部件“,在弹出的对话框中找到一项是:Microsoft Internet Transfer Control,选中后,在工具栏中您就会发现增添了一个显示有地球和计算机的小按钮,双击这个按钮会在窗体上加入一个 Internet Transfer实例Inet1,完成了这些步骤后,窗体应如图一所示。现在准备在实例工程中加入代码。

  Internet Transfer控件有一个事件StateChanged。这个事件的目的是当不同的操作发生时通知用户程序。例如:控件在与网络服务器链接时是一种状态,检索HTML是另一种状态。当前的状态用事件过程的State 参数来表示。在示例程序的StateChanged事件中输入如下代码:

Private Sub Inet1_StateChanged(ByVal State As Integer)

Select Case State

Case 12 '表明网络连接检索正常

stemp=Inet1.GetChunk(1024) '使用GetChunk方法从缓冲区中一次提取1024个字节的回应文本,并存放在stemp临时变量中

While stemp<>http://127.0.0.1/netware/”http://127.0.0.1/netware/”'当仍然返回信息时

LastResult=LastResult+stemp'将整个网页的源文件代码放入LastResult变量中

stemp=Inet1.GetChunk(1024)'循环

Wend

Case 11

MsgBox "未返回搜索结果"

End Select

End Sub

尽管StateChanged事件包含了这个示例程序代码的主要部分,我们仍然需要在Command1的Click事件中加入代码,以初始化这个请求。下面就是这段代码:

`

Private Sub Command1_Click()

url = "http://search.chinese.yahoo.com/search/gb?p=" +Text1.Text

Inet1.protocol=icHTTP'指明控件协议类型

Inet1.Execute CStr(url),http://127.0.0.1/netware/”GET /http://127.0.0.1/netware/” '发出请求

While Inet1.StillExecuting

DoEvents

Wend

End Sub

  前面已经提到,以这种方法返回的信息包含了搜索的结果网页,同直接搜索的区别就是由于这样返回的就是源代码,暂时存储到一个临时变量中,这样一来,你既可以将返回的信息直接存储到一个文件中,另一种方法,这就是我们下面要提到的对代码的优化处理。

  什么叫对代码的优化处理呢?因为返回的结果中包含许多其他没有什么用处的修饰,比如表格、banner、menta等等信息,而这些信息并不是我们需要的,去掉这些信息,只保留对我们来说有用的结果,这就是优化。那么怎样优化呢?分析HTML语法您就会看到,许多信息都是包含在一些关键词之间。举个例子:对于插入的图片来说,都是用http://127.0.0.1/netware/”http://127.0.0.1/netware/”来结尾,这样一来就清楚了,只要把代码中所有的满足以上条件的语句删掉,这样代码中就不会出现直接图片信息,我们参考以下的一段代码:

Public Function picFilter(downCode)'定义一个过滤图片信息的过程

Dim pStart As Long, pStop As Long

Dim pString1 As String, pString2 As String

pString1 = "
pString2 = ">" '分别将两个关键词定义

pStart = InStr(downCode, pString1)'找到第一个图片信息的起始位置

If pStart <> 0 Then '如果代码中有图片信息的话

pStop = InStr(pStart, downCode, pString2) + 1 '从上面找的起始部位开始找到第一个用于结束图片信息的http://127.0.0.1/netware/”>http://127.0.0.1/netware/”

Do While pStart <> 0 '只要仍旧有图片信息

Mid(downCode, pStart, pStop - pStart) = Space(pStop - pStart) '将代码中的图片信息用空格代替,实现删除效果

pStart = InStr(pStop, downCode, pString1)'重复上面的过程,删除其他的图片信息

If pStart = 0 Then Exit Do '没有图片信息后,退出循环

pStop = InStr(pStart, downCode, pString2, 1) + 1

Loop

picFilter=downCode '将处理过后的代码返回过程函数

End Function

接下来只要使用

lastResult=picFilter lastResult

就实现了对临时变量中搜索结果代码的图片信息去除工作,以此类推,很容易去掉诸如http://127.0.0.1/netware/”
  上面所说的是一种方法,但我们知道HTML语法中关键词很多,如果都用以上的条件过滤的话,会使程序的效率大大降低,运行速度也会减慢很多。有没有更好的方法?有,如果是有心人的话,您就会发现不同的搜索引擎返回的结果有其独特的编排方式,我们仍旧以雅虎为例,你只要察看其返回的结果源代码就会发现:每一条信息的链接和主题部分排列都是以“
  • http://127.0.0.1/netware/”开始,以“http://127.0.0.1/netware/”结束,而在“http://127.0.0.1/netware/” 和接下来的第一个“
    Public Function yahooFilter(downCode)

    Dim sString1 As String, sString2 As String, sString3 As String

    Dim sStart As Long, sStop As Long

    Dim string1 As String, string2 As String, lastString as string

    sString1 = "
  • "

    sString2 = "
    "

    sString3 = "<"

    sStart = InStr(downCode, sString1)'取得第一条主题信息的起始位置

    Do While sStart <> 0

    sStop = InStr(sStart, downCode, sString2)

    string1 = Mid(downCode, sStart + 4, sStop - sStart) '将第一条主题信息存放在string1变量中

    sStart = InStr(sStop, downCode, sString1) '从第一条主题信息的结束部位开始查找该主题的简单描述

    sStart = sStop + 4

    sStop = InStr(sStart, downCode, sString3) '取得该主题描述部分的结束位置

    If sStop = sStart Then '判断只有主题而没有描述的信息

    string2 = ""

    ElseIf sStop <> sStart Then

    string2 = Mid(downCode, sStart, sStop - sStart - 1) '取出主题描述部分

    End If

    lastString = lastString + "

    " + string1 + string2 '将提炼的结果存放在临时变量中

    sStart = InStr(sStop, downCode, sString1)'重新定位下一条信息的起始位置

    Loop'循环

    yahooFilter = lastString'

    End Function


    经过了上面复杂的提炼,然后将提炼的结果写到一个网页文件中,然后调用浏览器显示,会出现整整齐齐的结果,象图二一样:

      返回头来我们看一下现在比较流行的搜索软件,比如 SearchX98、Crazysearch、Inforian Quest 99,无论他们说明写的再好,也跳不出上面所说的原理,但他们各自有自己的一些独特之处,比如SearchX98 能够连续搜索多个引擎,其实就是发出一条搜索指令后,程序本身连续在各个搜索引擎发出搜索指令,将返回的结果经过简单的处理生成一个页面,其他的内容搜索更是最简单的直接发出搜索指令而已。而对于 Crazysearch,你只要打开注册表,就会发现其中文搜索只能搜索中文雅虎,英文只能搜索Excite,但号称注册版本能够搜索1000条记录,其实您只要分析一下雅虎的搜索代码就会发现,其中有一个关键词是 “n=http://127.0.0.1/netware/”,代表一次搜索返回的结果数目;另外一个是“b=http://127.0.0.1/netware/”,代表从第几条记录开始显示,就这两个关键词起到了这么重大的作用,但Crazysearch的独特之处在于返回的搜索结果以表格方式排列,直观醒目。最后要推荐的是Inforian Quest 99,尽管其原理也超脱不了以上的范围(您只要打开其目录下的site子目录中的文件就清楚了),但我还是极力推荐,因为无论是从站点的数量,搜索范围的广泛,搜索的速度,结果的详细,没有能过超过Inforian Quset 99的,而且要差很多。当然基于对国产软件的支持,我们还是可以对上面的两个软件寄予厚望。同是由于本人水平有限,难免有疏漏之处,敬请大家指正。

  • 通过DELPHI实现JAVA调用ORACLE数据库数据 通过编写代码来设置数据库的别名-Delphi资料 为Delphi数据表格增加彩色 为Delphi提供Pack和Undelete功能 为Delphi中数据库报表加网格 为数据库报表加网格-Delphi资料 为数据库建立索引-Delphi资料 掀开SQL Server 7.0的面纱-Delphi资料 限制数据库记录数-Delphi资料 向数据库发送密码-Delphi资料 一个关于字符串的小问题-Delphi资料 用 QuickReport for Delphi 制作报表 用Delphi 开发数据库程序经验三则 用Delphi 实 现 不 同 数 据 库 系 统 之 间 的 数 据 转 移 用DELPHI本身的控件输出TABLE表数据 用Delphi编程访问SQLServer数据库 用delphi编写医院的复杂报表 用Delphi程序维护Paradox 数据表的索引 用Delphi的InterBase数据库开发C&amp;S应用程序 用Delphi进行数据库之间转换 用Delphi开发“瘦”单机数据库应用系统 用Delphi如何实现VFP中的Cache特性 用Delphi设计数据库应用的几点体会 在我们日常工作中,常会碰到这样一个难题:一大堆-Delphi资料 用DELPHI制作应用软件 用Dephi 程 序 维 护Paradox 数 据 表 的 索 引-Delphi资料 用Dephi程序维护Paradox数据表的索引-Delphi资料 用InstallShield制作数据库应用系统的安装程序-Delphi资料 在BDE中使用ASCII-Delphi资料 在DBMemo中查找文字-Delphi资料 在Delphi 程序中维护DBF 数据库 如何在Delphi中调用WINRAR或WINZIP动态链接库的接口???(急,急,急......) 请教DataGrid控件新增一行的问题。 在unixware中使用消息队列,当消息队列比较长并且创建的消息队列较多时,出现堵塞? 为什么我调用 GethostName 这个函数 返回值是 O 但是GetLastError 却返回14呢!? 怎么通过http协议联接数据库呢?或者怎么样远程联接数据库? 如何清除ds.tables中的数据 奇怪!用unescape函数解码出来的一部分字符只能用document.write()的方法来显示? 求救!!!!如果我是定向招生读的大学,和定向单位签订11年和约,如果我不想去定向单位工作,该负怎样的法律责任!!!! 冬天来了,春天还会远吗?——中国程序员的春天 请教无标题窗口怎么移动?? 听同学说用一个按钮可以实现后退两页的,那么三页也可以实现吧,怎样写? 用hibernate 如何实现分页 我不太明白这些版本控制到底最大的好处是什么? 程序运行时实时变量出错? 各位老兄,请问在java中怎么解决这样<Node Name="N1" Value="1" />的XML 哪有winamp3的“汉化补丁”,源程序我有 使用CSocket类时出现访问冲突 庆祝网站初建:一般的界面,实用的文章例子,欢迎大家参观我的网站http://vcp4.51.net 帮帮小弟吧~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 请教各位大侠:VFP中SQL语言应该怎么学?? 如何自行编写一个自释放的EXE文件?,分不够,可另开恭送 dll卸除时 我要做一些收尾工作 代码要写在哪里?? 请教各位大侠:VFP 中的程序应该怎么学???谢谢指教!! 如何修改Canon BJ-4650打印机驱动程序,实现A3纸的加长打印? 心语 使用ODBC连接MySQL数据库时在stderr处有错误输出 这样的函数名怎么调用 大家能说说你们看过的最吓人的恐怖片是哪一部么?欢迎讨论! WIN2K问题 怎样解决这个问题 两个很菜的问题,在线等待 我不能在WSADV5中显示JSP页面? 鼠标检测问题 仅运行一次的实例,如何分别打开多个文件? 一些对asp.net的编译问题,乞望大虾回答。 初学者问题,请各位高手教教我! 通过ODBC传输大容量数据时出错 一个小的测试:求1+2+……+100的和,写出你的程序! 谁有不错的JAVASCRIPT的电子教程? 请教各位大侠:TurboC的数组方面的题 请问为什么我这个实现不了旋转? 送分给高手,请进:关于组件注册的问题? 对于您可能这仅是一个小问题,急求助! 如何收集一堆的单选框的值 关于一个程序的想法,高手进来给点建议! QQ与手机(没分给) 关于音量控制的问题 如何获得SMTP服务器的IP地址 C语言的图形系统设计 怎样屏蔽TStringGrid中的方向键?请指点。先谢了! 我找了10天了,也没找到答案 一条直线经过点a(1,),且与两坐标的正半轴所围成的三角形面积是16,求这条直线的方程 已知三角形ABO三个顶点,A(-3,0),B(0,6),O(0,0)求过顶点且将三角形面积分为1:3的直线的方程 Over the past aside,the future of underweight这句话是什么意思 光绪帝决心实行变法的最主要原因是A民族危机深重B康有为屡次上书 C全国百姓的呼吁 D利用变法巩固自身统治 Let bygones be bygones.Don't dwell on the past too much!我的英语好差哦能不能帮下忙 等差数列中,a9+a6+a3=12 a1*a2*a3=28,求通项公式. let bygones be bygones 和let past be the past有什么区别这两句话意思不是差不多嘛,那有什么区别呢,用在什么场合? 翻译must be the past 1+1语文答案 求语文1~4答案 语文回答,快,O(∩_∩)O谢谢!作文题目(先补充题目):别开生面的( );( )的故事.要求:不少于500字;初一水平先补充题目,再写作文! 从X光片CT片中提炼白银 丽水男子因杭州西湖特聘十大“刺客” 常年为西湖立塔打井 杭州首个井筒式停车库有望下海铁联运专列开通(图)留学生展风姿(图)杭州着力疏通“毛细血管” 拥堵点已着产下龙凤胎的方姑娘昨出院了 亲人赶到杭州萧山机场明起启用新的冬春季航班时浙江高速部分路段夜间有雾气出现 注意新快报记者承认受人指使收人钱财发表失农业部回应转基因大米动物试验:旨在科移民和无国籍状态国际会议在土库曼斯坦美国共和党议员提弹劾奥巴马议案 已提重庆财经职业学院办毕业展会搭起一站式Yo,Yo,Yo,Yo…… 看懂这个比赛综述一群老板当义工办公益活动数百中学生学大学生手绘寝室漫画提醒“同学”养成好一网打尽增值服务 “亏钱”物管成房企一汽 大众全系产品品质探秘活动在成都合拍多 跨行多 魔幻多中签率骤降 新股申购一签难求
    备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘