gpt4 book ai didi

vba - 内部 SAP 站点抓取出现自动化错误 : 800706B5, 80004005、80010108

转载 作者:行者123 更新时间:2023-12-04 16:47:30 25 4
gpt4 key购买 nike

我正在编写一个宏,用于抓取我公司的内部 SAP 站点以获取供应商信息。出于多种原因,我必须使用 VBA 来执行此操作。但是,我无法弄清楚为什么在尝试抓取页面时会不断出现这三个错误。这可能与 UAC integrity model 有关吗? ?还是我的代码有问题?是否可以在 Internet Explorer 中以不同方式处理使用 http 的网页?我可以访问任何网页,甚至是其他内部网页,并且可以很好地抓取其中的每一个。但是当我试图抓取 SAP 页面时,我得到了这些错误。错误描述和发生时间如下:

800706B5 - 接口(interface)未知(当我在运行有问题的代码之前放置断点时发生)

80004005 - 未指定的错误(当我没有放置任何错误并让宏运行时发生)

80010108 - 调用的对象已与其客户端断开连接。 (我似乎无法始终如一地出现此错误,似乎是在 excel 中的某些内容损坏到无法加载任何页面并且我必须重新安装 excel 的时候发生的)

我完全不知道发生了什么。 Integrity 页面对我来说意义不大,我在这方面找到的所有研究都谈到了连接数据库以及使用 ADO 和 COM 引用。但是我正在通过 Internet Explorer 做所有事情。下面是我的相关代码:

Private Sub runTest_Click()
ie.visible = True
doScrape
End Sub
'The code to run the module
Private Sub doTest()
Dim result As String
result = PageScraper.scrapeSAPPage("<some num>")
End Sub

PageScraper模块

Public Function scrapeSAPPage(num As Long) As String
'Predefined URL that appends num onto end to navigate to specific record in SAP
Dim url As String: url = "<url here>"
Dim ie as InternetExplorer
set ie = CreateObject("internetexplorer.application")
Dim doc as HTMLDocument

ie.navigate url 'Will always sucessfully open page, regardless of SAP or other
'pauses the exection of the code until the webpage has loaded
Do
'Will always fail on next line when attempting SAP site with error
If Not ie.Busy And ie.ReadyState = 4 Then
Application.Wait (Now + TimeValue("00:00:01"))
If Not ie.Busy And ie.ReadyState = 4 Then
Exit Do
End If
End If
DoEvents
Loop

Set doc = ie.document 'After implementation of Tim Williams changes, breaks here
'Scraping code here, not relevant

End Function

我在 Windows 7 机器上使用 IE9 和 Excel 2010。您可以提供的任何帮助或见解将不胜感激。谢谢。

最佳答案

我经常进行这种类型的抓取,发现很难使 IE 自动化 100% 可靠地工作,并出现您所发现的错误。由于它们通常是时序问题,调试起来会非常令人沮丧,因为它们不会在您单步执行时出现,只会在实时运行期间出现。为了最大限度地减少错误,我执行以下操作:

引入更多延迟; ie.busy 和 ie.ReadyState 不一定在 ie.navigate 之后立即给出有效答案,因此在 ie.navigate 之后引入一个短暂的延迟。对于我正常加载 1 到 2 秒的内容,但任何超过 500 毫秒的内容似乎都有效。

在转到目标 url 之前,通过 ie.navigate "about:blank"确保 IE 处于干净状态。

之后,您应该拥有一个有效的 IE 对象,并且您必须查看它以了解其中包含的内容。通常我会避免尝试访问整个 ie.document,而是使用 IE.document.all.tags("x"),其中 'x' 是我正在寻找的合适的东西,例如 td 或 a。

然而,在所有这些改进之后,尽管它们提高了我的成功率,但我仍然随机出现错误。

我真正的解决方案是放弃 IE,转而使用 xmlhttp 来完成我的工作。

如果您在文档上使用文本操作来解析数据,那么交换将是一个明智的选择。 xmlhttp 对象更可靠。您只需获得“responsetext”即可访问文档的整个 html。

这是我现在在生产中用于抓取的简化版本,它非常可靠,可以在一夜之间运行,无误地生成数百万行。

Public Sub Main()

Dim obj As MSXML2.ServerXMLHTTP
Dim strData As String
Dim errCount As Integer

' create an xmlhttp object - you will need to reference to the MS XML HTTP library, any version will do
' but I'm using Microsoft XML, v6.0 (c:\windows\system32\msxml6.dll)
Set obj = New MSXML2.ServerXMLHTTP

' Get the url - I set the last param to Async=true so that it returns right away then lets me wait in
' code rather than trust it, but on an internal network "false" might be better for you.
obj.Open "GET", "http://www.google.com", True
obj.send ' this line actually does the HTTP GET

' Wait for a completion up to 10 seconds
errCount = 0
While obj.readyState < 4 And errCount < 10
DoEvents
obj.waitForResponse 1 ' this is an up-to-one-second delay
errCount = errCount + 1
Wend

If obj.readyState = 4 Then ' I do these on two
If obj.Status = 200 Then ' different lines to avoid certain error cases
strData = obj.responseText
End If
End If

obj.abort ' in real code I use some on error resume next, so at this point it is possible I have a failed
' get and so best to abort it before I try again

Debug.Print strData

End Sub

希望对您有所帮助。

关于vba - 内部 SAP 站点抓取出现自动化错误 : 800706B5, 80004005、80010108,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11909580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com