【发布时间】:2019-08-08 16:37:11
【问题描述】:
我在 vba 中编写了一个脚本,用于从 torrent 站点中抓取不同的 movie names 和它们的 genre。尽管name 和genre 出现在它的登录页面中,但我创建了脚本来解析相同的深入一层(从它们的主页)。更清楚地说,这是 page 我所说的主页之一。我的脚本正在完美地解析它们。但是,我的意图是制作 异步请求。目前脚本正在同步(以阻塞方式)完成它的工作。
在我的previous post 中,我得到了来自omegastripes 的答复,他创建了一个脚本(which more or less performs like how multiprocessing works)来工作asynchronously。这就是我发现这个想法但无法在以下脚本中实现的地方。
到目前为止我的尝试:
Sub GetInfo()
Const URL = "https://yts.am/browse-movies"
Dim Http As New ServerXMLHTTP60, Html As New HTMLDocument
Dim post As HTMLDivElement, oName$, oGenre$, R&
Dim I&, key As Variant, iDic As Object
Set iDic = CreateObject("Scripting.Dictionary")
With Http
.Open "GET", URL, False
.send
Html.body.innerHTML = .responseText
End With
With Html.querySelectorAll(".browse-movie-wrap .browse-movie-title")
For I = 0 To .Length - 1
iDic(.Item(I).getAttribute("href")) = 1
Next I
End With
For Each key In iDic.keys
With Http
.Open "GET", key, False
.send
Html.body.innerHTML = .responseText
End With
oName = Html.querySelector("h1").innerText
oGenre = Html.querySelector("h2").NextSibling.innerText
R = R + 1: Cells(R, 1) = oName
Cells(R, 2) = oGenre
Next key
End Sub
我怎样才能在上面的脚本中进行任何更改以使其正常工作asynchronously?
【问题讨论】:
-
该网站使用验证码。对于异步,您只需将 False 更改为 True,但在验证码的情况下,您可能需要重试。
-
即使经过几次尝试,我也没有遇到任何验证码。在创建这篇文章之前,我使用了
True而不是False,但是当它到达Html.body.innerHTML = .responseText时,我得到了the data necessary to complete this operation is not yet availavle。 -
@robots.txt 为什么不使用我对您上一个问题的回答中的代码作为模板?复制粘贴它,放置你的 URL 和解析块,删除代理,检查它是否运行良好。
-
根据@omegastripes 确实行 Do Until .readyState = 4: DoEvents: Loop 使其同步,因此删除了答案,因为使用您已经完成的 False 参数会更简单。跨度>
-
是的,下面的方法是一种解决方法 ServerXMLHTTP60 没有任何事件(我自己的博客文章在这里 exceldevelopmentplatform.blogspot.com/2018/01/… )但也有 WinHttpRequest 类确实提供事件exceldevelopmentplatform.blogspot.com/2018/01/…
标签: vba asynchronous web-scraping