【问题标题】:How can I scrape multiple pages/links at once using VBA?如何使用 VBA 一次抓取多个页面/链接?
【发布时间】:2020-08-19 06:26:30
【问题描述】:

我目前正在尝试从 this Reddit Page 抓取信息。我的目标是让 excel 在新选项卡中打开所有帖子,然后我想从每个页面中抓取信息,因为起始页面没有那么多信息。

过去几个小时我一直在尝试解决这个问题,但我承认我对如何做到这一点感到很困惑,只是总体上不确定下一步该做什么,所以任何指点都将不胜感激!

这是我当前的代码,它工作得很好,但正如我所说,我不确定接下来应该做什么来打开它找到的链接并抓取每一页的数据。 链接从第一页被刮掉,然后现在添加到我的电子表格中,但如果可能的话,我想跳过这一步,一次刮掉它们。

谢谢! :)

Sub GetData()

Dim objIE As InternetExplorer
Dim itemEle As Object
Dim upvote As Integer, awards As Integer, animated As Integer
Dim postdate As String, upvotepercent As String, oc As String, filetype As String, linkurl As String, myhtmldata As String, visiComments As String, totalComments As String, removedComments As String
Dim y As Integer

Set objIE = New InternetExplorer
objIE.Visible = False

objIE.navigate (ActiveCell.Value)
Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop

y = 1

For Each itemEle In objIE.document.getElementsByClassName("flat-list buttons")
visiComments = itemEle.getElementsByTagName("a")(0).innerText
linkurl = itemEle.getElementsByTagName("a")(0).href
Sheets("Sheet1").Range("A" & y).Value = visiComments
Sheets("Sheet1").Range("B" & y).Value = linkurl
y = y + 1
Next

End Sub

【问题讨论】:

  • @QHarr 我基本上是在尝试打开每个链接(href),然后为每个链接抓取一些 html 元素并将其输出到我的电子表格。因此,要抓取的数据是,例如投票数,输出将是一个数字。
  • % Upvoted 是这些页面唯一的附加信息,是的,但这对我的项目非常重要,我只是想尽可能地自动化。
  • 是的!因为百分比是真正让我陷入困境的原因。

标签: html excel vba internet-explorer web-scraping


【解决方案1】:

您应该能够收集 url,然后循环访问,并将访问页面的结果写入数组,然后将数组写入工作表。在您现有的行之后添加它

Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop

添加:

Dim nodeList As Object , i As Long, urls(), results()

注意:由于 VBA 是单线程的,因此您可能只会获得页面加载。为此,您需要存储对每个选项卡的引用,或者先打开所有选项卡,然后循环通过相关打开的窗口进行抓取。老实说,我的偏好是保持在同一个标​​签中。

Set nodeList = ie.document.querySelectorAll(".comments")
Redim urls(0 To nodeList.Length-1)
Redim results(1 to nodeList.Length, 1 to 3)
'Store all urls in an array to later loop
For i = 0 To nodeList.Length -1 
    urls(i) = nodeList.item(i).href
Next

For i = LBound(urls) To UBound(urls)
    ie.Navigate2   urls(i)
    While ie.Busy Or ie.Readystate <> 4: DoEvents:Wend
    'may need a pause here
    results(i + 1, 1) = ie.document.querySelector("a.title").innerText 'title
    results(i + 1, 2) = ie.document.querySelector(".number").innerText 'upvotes
    results(i + 1, 3) = ie.document.querySelector(".word").NextSibling.nodeValue '%
Next
ActiveSheet.Cells(1,1).Resize(UBound(results,1) , UBound(results,2)) = results

【讨论】:

  • .NodeValue 在 BeautifulSoup @QHarr 中的工作方式是否与 .next_sibling 的工作方式相似?
  • 对不起,如果我花时间回复,我试图理解,而不仅仅是复制^^由于某种原因,它很好地刮掉了列表中第一个帖子的标题,以及赞成票,但不是 %。然后在宏完成后,我最终得到第一个帖子(及其赞成票)重复超过 25 行而不是所有不同的帖子。我不知道是什么原因造成的。
  • 我检查了 HTML 并且有另一个名为“word”的 CSS 类在技术上低于我想要的,这可能是导致 % 问题的原因,尽管这可能不是它不抓取其他帖子的原因。
  • 解决了第一个问题,谢谢!是的,它正在写出 [object Text]。
  • 很奇怪,它告诉我“对象不支持此属性或方法”。
猜你喜欢
  • 1970-01-01
  • 2017-07-26
  • 2019-09-19
  • 2020-09-21
  • 1970-01-01
  • 1970-01-01
  • 2016-04-09
  • 1970-01-01
  • 2021-03-10
相关资源
最近更新 更多