当前位置 博文首页 > msxml3.dll 错误 80070005 拒绝访问

    msxml3.dll 错误 80070005 拒绝访问

    作者:admin 时间:2021-02-13 15:02

    昨天在采集某一个网站的时候,采集程序出错了。
    是自写的采集程序。
    经过搜索以后,查到一些没有用的结果,后来发现,用Msxml2.ServerXMLHTTP替换掉Msxml2.XMLHTTP,问题成功解决。
    以下是分析排错过程。
    老是采集一段时间就挂了,指定资源下载失败,或者拒绝访问。
    后来直接全部是拒绝访问。

    一开始,认为,对方服务器做了防采集设置,比如有时间限制之类的。

    于是更改程序,原先是直接获取列表页,然后持续循环获得文章列表。改了采集文件结构,
    原来是就一个文件,类,数据库连接,数据处理全部在一个文件里,再采集某一篇文章的时候,后天加了一个时间循环。等待5秒的。代码如下
    复制代码 代码如下:

    sTime=Timer()
    dTime=Timer()-sTime
    do while dTime < 5
    dTime=Timer()-sTime
    loop

    确实是能等待5秒钟,但是很快就发现,这个循环太过消耗CPU资源,一到这个循环,CPU占用率持续100%,于是马上放弃这个方案。
    另做了一个文件。只根据文章URL抓取文章的相关内容并写入数据库,写入完毕后输出自动跳转代码。
    核心思想就是用了<meta http-equiv="refresh" content="5;url=someurl.asp">
    这是一个定时跳转的代码,相信大家都很熟悉。
    我的原理做法就是,用一开始的文件,抓取所有的文章连接地址,以及相关导航代码,保存到数据库中。
    然后用新做的抓取文章内容的程序,读取数据库记录,逐条进行采集。
    数据库记录中有一个flag标记,tinyint类型,默认是0,采集成功更新为1,失败更新为2
    这样,每次从数据库中读取一条未采集的数据,也就是读取flag=0的数据,进行操作。操作完毕等待5秒跳转到自身。

    想法跟思路是很好的。文章URL数据库也采集准备好了,一上采集文章具体内容,又出错了。一直是msxml3.dll 错误 '80070005'
    拒绝访问的错误。
    那个郁闷,想开一晚上机器,自动采集,破灭。
    今天早上来搜索查询资料,查询到的绝大多数都是无用信息。
    基本上都是说权限问题。

    msxml3.dll 错误 '80070005'

    拒绝访问。

    解决办法:

    赋予程序所在文件夹 internet 来宾帐号(IUSR_WEB)可写。

    做法:

    选择cachefile-属性-安全-添加(IUSR_WEB)-写入
    都是这么说的。莫名其妙的,我的是FAT32的不存在NTFS格式的那种安全权限问题,IIS设置也正常,
    我的问题是采集一部分就拒绝访问。肯定不是这个问题。
    继续搜索,找到另一个方案说是,用Msxml2.XMLHTTP替换掉Microsoft.XMLHTTP,我本来用的就是Msxml2.XMLHTTP的
    继续搜索。找到最终解决方案应该是用Msxml2.ServerXMLHTTP
    先前也搜到这个结果,由于大意,没有及时注意到,以下是搜索过程找到的有用的相关资料。

    代码如下:
    复制代码 代码如下:

    PostUrl=http://www.xxx.com/
    Server.ScriptTimeOut=20
    Set oXMLHttp = createObject("Microsoft.XMLHTTP")
    Call oXMLHttp.Open("get", PostUrl, false)
    Call oXMLHttp.Send("")
    sHtmlStr = oXMLHttp.responseBody
    Set oXMLHttp = nothing

    初步判定可能是打开的页面有跳转的原因,解决办法是用
    MSXML2.ServerXMLHTTP
    替换掉
    Microsoft.XMLHTTP
    即可解决。

    另外在CSDN上找到这么一段代码
    复制代码 代码如下:

    ServerURL=PostUrl
    Set Mail1 = Server.CreateObject("CDO.Message")
    Mail1.CreateMHTMLBody ServerURL,31
    AA=Mail1.HTMLBody
    Set Mail1 = Nothing
    Response.Write AA

    试了一下,也可以用,拷过来收藏



    复制代码 代码如下:

    <%
    ' 定义变量
    Dim objXmlHttp
    Dim strHTML

    '这是Msxml3.0中的一个稳定版本.
    '使用Msxml2.ServerXMLHTTP,不使用Msxml2.XMLHTTP
    Set objXmlHttp = Server.CreateObject("Msxml2.ServerXMLHTTP")

    ' 如果你发现以下错误
    ' msxml3.dll error '80070005'
    ' 存取被拒绝.
    ' 可能是上网时使用了代理产生了错误
    ' 使用 proxycfg.exe 工具. :
    '
    ' proxycfg -d
    ' 检查是否采用了代理上网
    ' 同时可以参看这个帖子: http://www.asp101.com/forum/display_message.asp?mid=51841
    '

    ' 这个版本太旧且不稳定
    'Set objXmlHttp = Server.CreateObject("Msxml2.XMLHTTP")

    ' 现在我们开始发送请求.
    ' 套用微软的话来讲: 初始化一个请求,并且指定该请求的方法(get,post等等),
    ' URL, 和权限验证信息(用户名,密码,等等)。
    ' 格式:
    ' .open(bstrMethod, bstrUrl, bAsync, bstrUser, bstrPassword)
    'objXmlHttp.open "GET", "http://www.yahoo.com", False
    objXmlHttp.open "GET", "http://www.yahoo.com", False

    ' 以直接的方式发送请求出去.
    objXmlHttp.send

    ' 打印返回状态:
    Response.Write "Status: " & objXmlHttp.status & " " _
    & objXmlHttp.statusText & "<br />"

    ' 获取响应返回的文本.
    ' 这个对象本身是用来操作XML的,所以具备以下属性:
    ' responseBody, responseStream, 和 responseXML.
    ' 但是我们现在只需要文本信息
    strHTML = objXmlHttp.responseText

    ' 但这个对象实例不再使用时,需要清除这个对象实例.
    Set objXmlHttp = Nothing

    ' 现在我们要做的就是显示我们获取到的HTML.
    ' 首先看浏览器解释的效果
    ' 然后显示其源码
    ' 下面的类似<h1>s 和 <table>s只是为了展现获取到的内容,本身不属于获取的内容.
    %>

    <h1>Here's The Page:</h1>
    <table border="1" bgcolor="#FFFFFF">
    <tr><td>
    <%= strHTML %>
    </td></tr>
    </table>

    <br />

    <h1>Here's The Code:</h1>
    <table border="1" bgcolor="#FFFFFF">
    <tr><td>
    <pre>

    <%= Server.HTMLEncode(strHTML) %>
    </pre>
    </td></tr>
    </table>
    js