请教vb如何实现检测一个URL是否有效?
网站形式是任意的
比如http://www.xxxx.com/ssssss.html
或者http://xxx.xom/sss.asp

解决方案 »

  1.   

    先使用InternetOpen打开网络,然后使用InternetConnect建立一个网络连接,连接协议为INTERNET_SERVICE_HTTP,用户名为anonymous,密码为空,再使用InternetOpenFile打开URL,如果失败,则表示该URL不存在,最后使用InternetCloseHandle关闭文件句柄、网络连接句柄和网络句柄。
    虽然还有一个更简单的函数InternetOpenUrl,但由于URL不存在时此函数会出现阻塞,故不推荐使用。
      

  2.   

    这种东西要根据具体的站点而定的,并不是能笼统地适用。
    因为按标准的站点配置处理来说,如果他的网站没有那个文件或URL地址,WEB服务器会返回404或400或401等这些错误号在HTTP头,那么便可通过HTTP头的信息来识别那个URL是否有效。
    但是有些WEB站点却对这一块作了特殊处理,比如没有哪个URL地址,他同样返回的是200,只是他的内容却是他自定义的错误提示页面或干脆直接转向到他网站的首页内容,所以要说能够笼统的对所有URL进行是否有效的判断是不可能的。
    就标准的IIS6配置来说,如果要识别URL有效性,通过HTTP头就可以识别了,下面我举个例子。'以下是VB采用XMLHTTP对象访问远程URL,然后判断访问状态的一个范例
    Private Sub Command1_Click()
       Dim XMLObject As Object
       Set XMLObject = CreateObject("Microsoft.XMLHTTP")
       XMLObject.Open "GET", "http://www.xxxx.com/ssssss.html", False
       XMLObject.send ""
       If XMLObject.Status = 200 Then
          MsgBox "网页存在。", 64, "提示"
       Else
          MsgBox "网页不存在。", 64, "提示"
       End If
       Set XMLObject = Nothing
    End Sub当然,对于百度这种对错误页进行过处理的WEB站点来说是没有效果的,还必须作特别的处理,如:Private Sub Command1_Click()
       Dim XMLObject As Object
       Dim ReadText As String
       Set XMLObject = CreateObject("Microsoft.XMLHTTP")
       
       XMLObject.Open "GET", "http://www.baidu.com/jj.asp", False
       XMLObject.send ""
       If XMLObject.Status = 200 Then
          ReadText = StrConv(XMLObject.responseBody, vbUnicode)
          If InStr(1, ReadText, "<title>百度--您的访问出错了</title>", vbTextCompare) = 0 Then
             MsgBox "网页存在。", 64, "提示"
          Else
             MsgBox "网页不存在。", 64, "提示"
          End If
       Else
          MsgBox "网页不存在。", 64, "提示"
       End If
       Set XMLObject = Nothing
    End Sub由上可以看出,百度即使没有jj.asp,但返回的HTTP头还是200,因为它返回的不是标准的错误页,而是他百度自己的错误页面。所以说,不同的网站有不同的处理方法,没有什么可通用的URL识别是否有效的方法,必须看情况而定。
      

  3.   

    虽然也有方法可以做到尽量的处理,但是并不是可以达到理论上的真正的完全正确性,因为网络上这种非标的东西始终控制在别人手中,你很难进行预测或控制的。
    以下是判断所有网站URL是否有效的一个我觉得比较好的思路,你可以参考看看:通过多次判断来进行识别,首先你故意访问那个站点不存在的URL地址,然后得到结果保存起来,然后再访问你要识别的URL,这样将前后进行对比,如果结果大致一样,说明你要判断的URL不存在,如果不同,那么就按存在处理,如:
       你要判断的URL是:
       http://www.xxx.com/web/a.asp
       那么你先访问一个www.xxx.com肯定不存在的URL地址,如:
       http://www.xxx.com/XXOOXXO/XXXOOOXXOO/XOXOXXO/XXXXXOOOOO/XXOO.asp
       那么这个URL在通常情况下是不可能存在的,对方的WEB服务系统肯定会返回一个错误页
       这时你将这个错误页内容保存,然后再访问你要判断的URL
       http://www.xxx.com/web/a.asp
       然后将两者对比,首先对比HTTP头的状态,如果这个一致,再对比HTTP的标题,如果这个也一致,那么估计你要识别的URL地址就不存在了,否则就按存在处理或在进行进一步的识别处理,如判断标题中是否包含“Error”或“错误”之类关键字等,这就看看你具体的过程了。按照这种方法,应该可以分析出不存在的URL来,但是万事没有绝对,就像上面我所说的,网络上这种非标的东西始终控制在别人手中,你很难进行预测或控制的。就比如说他每次返回的错误代码都不一样也很有可能。在以前我曾经在电脑报上看过这么一篇文章,就是教人如何做每次访问都有不同界面的网页,界面是随机更换的,而且风格可以完全不一样,主要是让人每次访问相同页面时有一种新鲜感,呵呵。按照这种思路,如果上面这种方法碰到了这种思路的站点,那结果就真的很难预测了,呵呵。
      

  4.   

    这要看你实际用途是什么
    简单的判断3楼的方法不错
    如果要精确些可以参考一下http协议中的响应代码
    一般返回4xx(请求错误)与5xx(服务器错误)才表示在浏览器中打开时是错误页面
    但3楼使用的方法可能会出现一个问题
    XMLHTTP对3xx响应代码,好像无视
    不知道是不是我以前使用异步方法的原因
    具体可以测试一下Http://BBS.CSDN.NET
    这个地址返回的是302转向至http://community.csdn.net/的
    当时XMLHTTP的State属性一直是0,一般属性值为READY_STATE_COMPLETE时,才能对XMLHTTP中返回的信息进行读写..
    后来是利用ServerXMLHTTP解决的,ServerXMLHTTP好像是可以自动重定向的
    -----------------------
    刚才又看了下3楼。
    百度不存在页是返回的也应该是3xx,然后重定向至百度自定义页面的.那客户端应该会有信息呀
    不知道XMLHTTP是怎么处理好的.- -! 也可能是Community.Csdn.Net响应信息不一样/也许是XMLHTTP的版本不同相应的处理方法也不一样.. 不深究了.不贴代码了.前些天封装了一个ServerXMLHTTP
    可以参考一下...http://blog.csdn.net/SilenceNet/archive/2009/06/07/4249329.aspx
      

  5.   

    单纯的靠http响应代码来判断肯定是不行的
    三楼的技巧很好
    谢谢
    不知道抓取html内容那部分的代码有没有牛人赐教
      

  6.   

    你应该看看这句话什么意思?
    If InStr(1, ReadText, "<title>百度--您的访问出错了</title>", vbTextCompare) = 0 Then
      

  7.   

    ReadText 里面放的不是 HTML 内容?
      

  8.   

    微软有个dll导出了一个函数可以直接检测,以前还用过现在忘记了
    建议你google搜索一下
      

  9.   

     CreateObject("Microsoft.XMLHTTP")
    方法显然不好,因为URL错误,回形成程序假死,没反应长达40秒