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