Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 列A中所有URL上的Webscrape循环_Excel_Vba_Web Scraping - Fatal编程技术网

Excel 列A中所有URL上的Webscrape循环

Excel 列A中所有URL上的Webscrape循环,excel,vba,web-scraping,Excel,Vba,Web Scraping,我正试图从一个URL列表中抓取Facebook视频标题 我已经让我的宏为一个视频工作,在这个视频中,URL被内置到代码中。我希望脚本能够遍历A列中的每个URL,并将视频标题输出到B列。有什么帮助吗 当前代码: Sub ScrapeVideoTitle() Dim appIE As Object Set appIE = CreateObject("internetexplorer.application") With appIE .navigat

我正试图从一个URL列表中抓取Facebook视频标题

我已经让我的宏为一个视频工作,在这个视频中,URL被内置到代码中。我希望脚本能够遍历A列中的每个URL,并将视频标题输出到B列。有什么帮助吗

当前代码:

Sub ScrapeVideoTitle()    
    Dim appIE As Object
    Set appIE = CreateObject("internetexplorer.application")

    With appIE
        .navigate "https://www.facebook.com/rankertotalnerd/videos/276505496352731/"
        .Visible = True

        Do While appIE.Busy        
            DoEvents
        Loop

        'Add Video Title to Column B
        Range("B2").Value = appIE.document.getElementsByClassName("_4ik6")(0).innerText

        appIE.Quit
        Set appIE = Nothing
    End With
End Sub
如果您有url的“276505496352731”部分,或者实际上是A列中的整个url,您可以将一个范围设置为最大值,然后循环直到该范围为空,每次刮取时向下移动一次

比如:

'Dims as before
Dim r as range

With appIE

  set r = Range("B1")  ' Assumes B1 is the top of the URL list
  do while r.value > ""

    .navigate r.value
    'Do the rest of your IE stuff
    r.offset(0,1).Value = appIE.document.getElementsByClassName("_4ik6")(0).innerText

    set r = r.offset(1)
  Loop
End With

希望这会有所帮助。

如果您可以转到VBE>Tools>References>添加对Microsoft HTML对象库的引用,则可以执行以下操作:

将所有URL读入一个数组。循环数组并使用xmlhttp向页面发出
GET
请求。将响应读入
HTMLDocument
变量,并使用css选择器提取标题并存储在数组中。在循环结束时,将所有结果一次性写入工作表

Option Explicit
Public Sub GetTitles()
    Dim urls(), ws As Worksheet, lastRow As Long, results(), i As Long, html As HTMLDocument

    Set html = New HTMLDocument
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    With ws
        lastRow = .Cells(.rows.Count, "A").End(xlUp).Row
        urls = Application.Transpose(.Range("A2:A" & lastRow).Value)
    End With
    ReDim results(1 To UBound(urls))
    With CreateObject("MSXML2.XMLHTTP")
        For i = LBound(urls) To UBound(urls)
            If InStr(urls(i), "http") > 0 Then
                .Open "GET", urls(i), False
                .send
                html.body.innerHTML = .responseText
                results(i) = html.querySelector(".uiHeaderTitle span").innerText
            End If
        Next
    End With
    ws.Cells(2, 2).Resize(UBound(results), 1) = Application.Transpose(results)
End Sub

css选择器与页面的匹配:


您是否获得了该单元的视频标题,该视频标题是否正常工作?看起来您只需要在一个范围内循环,并将其设置为
。导航
值…您尝试了什么?是的,标题工作正常,只是不知道如何在该范围内循环…我一直收到一个错误,“运行时错误”-2147467259(80004005):“对象“IWebBrowser2”的方法“文档”失败”。你知道我做错了什么吗?好的,这里的错误是在你的刮片部分,而不是Excel循环部分。我不确定这是如何工作的,但请尝试以下操作:确保您的
.visible=true
仍在代码中。获取一个非类型变量
Dim v
,并将其设置为getElements的结果。。。呼叫所以
Set v=.document.getElementsByClassName(“\u 4ik6”)
。这样做的原因是它可能找不到具有该类的任何元素,如果是,它将返回一个空节点列表,因此获取第一个此类项的(0)索引引用将失败。因此,首先将结果输入到v中。+1表示您伟大的代码。我想了解更多关于querySelector的信息。我已经检查了页面并搜索了
.uiHeaderTitle span
,但我没有在其中找到标题@YasserKhalil查看我的个人资料页面中我通常向人们推荐的链接。如果我转到显示的facebook行,并在浏览器中输入.uiHeaderTitle span,它将与标题匹配。你就是这么想的吗?我不知道你的页面是否会因为某种原因而被结构改变。当我检查
.uiHeaderTitle span
时,我发现了两个结果,两个结果的内部文本都不是标题。。!我发现了问题所在。当我使用IE进行检查时,它的工作原理与您的解释完全一致(我没有在IE中登录FB)。但是在查看chrome上的视频时,我发现结果是两个,没有一个包含标题(在chrome中,我在FB上登录到我的帐户)。类名可能是动态的,这就是为什么我避免使用它们。