VBA使谷歌搜索自动化

VBA使谷歌搜索自动化,vba,excel,internet-explorer,Vba,Excel,Internet Explorer,我正在使用下面提到的VBA脚本自动化谷歌搜索(所需结果仅为英文),但得到错误91,Plz建议解决方案。其他要求是我需要非个性化的谷歌搜索结果 Sub XMLHTTP() Dim url As String, lastRow As Long Dim XMLHTTP As Object, html As Object, objResultDiv As Object, objH3 As Object, link As Object Dim start_time As Date

我正在使用下面提到的VBA脚本自动化谷歌搜索(所需结果仅为英文),但得到错误91,Plz建议解决方案。其他要求是我需要非个性化的谷歌搜索结果

Sub XMLHTTP()

    Dim url As String, lastRow As Long
    Dim XMLHTTP As Object, html As Object, objResultDiv As Object, objH3 As Object, link As Object
    Dim start_time As Date
    Dim end_time As Date

    lastRow = Range("A" & Rows.Count).End(xlUp).Row

    Dim cookie As String
    Dim result_cookie As String

    start_time = Time
    Debug.Print "start_time:" & start_time

    For i = 2 To lastRow

        url = "https://www.google.com/webhp?hl=en&as_q=&as_epq=&as_oq=&as_eq=&as_nlo=&as_nhi=&lr=lang_en&cr=countryUS&as_qdr=all&as_sitesearch=&as_occt=any&safe=images&as_filetype=&as_rights=" & Cells(i, 1) & "&rnd=" & WorksheetFunction.RandBetween(1, 10000)

        Set XMLHTTP = CreateObject("MSXML2.serverXMLHTTP")
        XMLHTTP.Open "GET", url, False
        XMLHTTP.setRequestHeader "Content-Type", "text/xml"
        XMLHTTP.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:25.0) Gecko/20100101 Firefox/25.0"
        XMLHTTP.send

            Set html = CreateObject("htmlfile")
        html.body.innerHTML = XMLHTTP.ResponseText
        Set objResultDiv = html.getelementbyid("rso")
        Set objH3 = objResultDiv.getelementsbytagname("H3")(0)
        Set link = objH3.getelementsbytagname("a")(0)


        str_text = Replace(link.innerHTML, "<EM>", "")
        str_text = Replace(str_text, "</EM>", "")

        Cells(i, 2) = str_text
        Cells(i, 3) = link.href
        DoEvents
    Next

    end_time = Time
    Debug.Print "end_time:" & end_time

    Debug.Print "done" & "Time taken : " & DateDiff("n", start_time, end_time)
    MsgBox "done" & "Time taken : " & DateDiff("n", start_time, end_time)
End Sub
Sub-XMLHTTP()
将url变暗为字符串,最后一行变长
Dim XMLHTTP作为对象,html作为对象,objResultDiv作为对象,objH3作为对象,link作为对象
将开始时间变暗为日期
Dim end_时间作为日期
lastRow=范围(“A”和Rows.Count).End(xlUp).Row
点心串
Dim result\u cookie作为字符串
开始时间=时间
调试。打印“开始时间:&开始时间”
对于i=2到最后一行
url=”https://www.google.com/webhp?hl=en&as_q=&as_epq=&as_oq=&as_eq=&as_nlo=&as_nhi=&lr=lang_en&cr=countryUS&as_qdr=all&as_sitesearch=&as_occt=any&safe=images&as_filetype=&as_rights=“&Cells(i,1)和”&rnd=“&WorksheetFunction.randbween(11000)
设置XMLHTTP=CreateObject(“MSXML2.serverXMLHTTP”)
XMLHTTP.Open“GET”,url,False
XMLHTTP.setRequestHeader“内容类型”、“文本/xml”
XMLHTTP.setRequestHeader“用户代理”、“Mozilla/5.0(Windows NT 6.1;rv:25.0)Gecko/20100101 Firefox/25.0”
XMLHTTP.send
设置html=CreateObject(“htmlfile”)
html.body.innerHTML=XMLHTTP.ResponseText
Set objResultDiv=html.getelementbyid(“rso”)
Set objH3=objResultDiv.getelementsbytagname(“H3”)(0)
Set link=objH3.getelementsbytagname(“a”)(0)
str_text=Replace(link.innerHTML,“,”)
str_text=Replace(str_text,“,”)
单元格(i,2)=str_文本
单元格(i,3)=link.href
多芬特
下一个
结束时间=时间
调试。打印“结束时间:&结束时间”
Debug.Print“done”和“Time take:”&DateDiff(“n”,开始时间,结束时间)
MsgBox“完成”和“花费的时间:&DateDiff(“n”,开始时间,结束时间)
端接头

问题在这里:Set-objResultDiv=html.getelementbyid(“rso”)

如果没有“rso”id,objResultDiv将为空,代码稍后将失败,并出现“运行时错误'91”:未设置对象变量或块变量

(实际错误将指向下一行,因为尽管objResultDiv什么都不是,但在您尝试对其求值之前,错误不会发生。)

所以你需要问问自己,我到底在寻找什么

避免RTE的一种方法是测试objResultDiv的值:

Set html = CreateObject("htmlfile")
html.body.innerHTML = XMLHTTP.ResponseText
Set objResultDiv = html.getelementbyid("rso")
If Not objResultDiv is Nothing then
    Set objH3 = objResultDiv.getelementsbytagname("H3")(0)
    Set link = objH3.getelementsbytagname("a")(0)

    str_text = Replace(link.innerHTML, "<EM>", "")
    str_text = Replace(str_text, "</EM>", "")

    Cells(i, 2) = str_text
    Cells(i, 3) = link.href
End If
DoEvents
Set html=CreateObject(“htmlfile”)
html.body.innerHTML=XMLHTTP.ResponseText
Set objResultDiv=html.getelementbyid(“rso”)
如果不是objResultDiv,那么它什么都不是
Set objH3=objResultDiv.getelementsbytagname(“H3”)(0)
Set link=objH3.getelementsbytagname(“a”)(0)
str_text=Replace(link.innerHTML,“,”)
str_text=Replace(str_text,“,”)
单元格(i,2)=str_文本
单元格(i,3)=link.href
如果结束
多芬特
当然,这只会将问题进一步推向下一步:如果objResultDiv有一个值,而objH3没有呢?然而,它指向了真正的解决方案:你想要实现什么?当你实现它时,你期望看到什么

不管怎样,这就是为什么你会得到RTE 91


至于非个性化搜索,一个快速的谷歌(真的很讽刺)建议“简单的谷歌解决方案是在搜索查询的末尾键入&pws=0,这会关闭个性化。这种方法的缺点是耗时,而且对于初学者来说,很难记住。”当然,如果你是自动搜索,它会更快。不知道这是否有效。

我不确定“英语”部分,但下面的脚本将循环使用A列中的范围,从A2开始,向下

Sub ImportWebData()

j = 1
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True

With Sheets("Source")

   RowCount = 2
   Do While .Range("A" & RowCount) <> ""
      CellName = .Range("A" & RowCount)
      url = CellName

      'get web page
      IE.Navigate2 url
      Do While IE.readyState <> 4 Or _
         IE.Busy = True
         DoEvents
      Loop

        Set DestSh = ActiveWorkbook.Worksheets.Add
        DestSh.Name = j

            Sheets(j).Select
            Cells.Select
            Selection.Delete Shift:=xlUp
            Range("A1").Select
            With ActiveSheet.QueryTables.Add(Connection:= _
                "URL;" & CellName, Destination:=Range("$A$1"))
                .Name = CellName
                .FieldNames = True
                .RowNumbers = False
                .FillAdjacentFormulas = False
                .PreserveFormatting = True
                .RefreshOnFileOpen = False
                .BackgroundQuery = True
                .RefreshStyle = xlInsertDeleteCells
                .SavePassword = False
                .SaveData = True
                .AdjustColumnWidth = True
                .RefreshPeriod = 0
                .WebSelectionType = xlEntirePage
                .WebFormatting = xlWebFormattingNone
                .WebPreFormattedTextToColumns = True
                .WebConsecutiveDelimitersAsOne = True
                .WebSingleBlockTextImport = False
                .WebDisableDateRecognition = False
                .WebDisableRedirections = False
                .Refresh BackgroundQuery:=False
            End With

            j = j + 1

    Sheets("Source").Select
    RowCount = RowCount + 1

    Loop

End With
IE.Quit

End Sub

错误在哪里?
Option Explicit

Sub CheckHyperlinks()

    Dim oColumn As Range
    Set oColumn = Column("A") ' replace this with code to get the relevant column

    Dim oCell As Range
    For Each oCell In oColumn.Cells

        If oCell.Hyperlinks.Count > 0 Then

            Dim oHyperlink As Hyperlink
            Set oHyperlink = oCell.Hyperlinks(1) ' I assume only 1 hyperlink per cell

            Dim strResult As String
            strResult = GetResult(oHyperlink.Address)

            oCell.Offset(0, 1).Value = strResult

        End If

    Next oCell


End Sub

Private Function GetResult(ByVal strUrl As String) As String

    On Error GoTo ErrorHandler

    Dim oHttp As New MSXML2.XMLHTTP30

    oHttp.Open "HEAD", strUrl, False
    oHttp.send

    GetResult = oHttp.Status & " " & oHttp.statusText

    Exit Function

ErrorHandler:
    GetResult = "Error: " & Err.Description

End Function

Private Function GetColumn() As Range
    Set GetColumn = ActiveWorkbook.Worksheets(1).Range("A:A")
End Function