如何使用VBA输入网站地址并进行搜索

时间:2018-07-12 04:30:41

标签: excel vba excel-vba web web-scraping

我知道这似乎很容易。我已经输入了一个代码来尝试使其工作,但是遇到了一个问题。以下链接的格式对于所有城市和州都是相同的。只要您可以输入城市名称(“ City_Search”)和州(“ State_Search”),您就可以使用以下信息访问网站。

我在下面附上了我要使用的公式。如果有人可以协助我进行搜索,我将不胜感激。

 Sub SearchBot1()
'dimension (declare or set aside memory for) our variables
Dim objIE As InternetExplorer 'special object variable representing the IE browser
Dim aEle As HTMLLinkElement 'special object variable for an <a> (link) element
Dim HTMLinputs As MSHTML.IHTMLElementCollection


'initiating a new instance of Internet Explorer and asigning it to objIE  
Set objIE = New InternetExplorer

'make IE browser visible (False would allow IE to run in the background)
objIE.Visible = True

'navigate IE to this web page (a pretty neat search engine really)
objIE.navigate "https://datausa.io/profile/geo/" & Range("City_Search").Value & "-" & Range("State_Search").Value

'wait here a few seconds while the browser is busy
Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop
 End Sub

这个主意是让我在excel中键入任何城市,一旦我在宏上命中,它将转到该站点并搜索城镇数据。我在下面添加了一个链接,作为搜索时要获取的页面的示例。

https://datausa.io/profile/geo/hoboken-nj/

2 个答案:

答案 0 :(得分:1)

您需要 连字符 城市,其标题中带有空格。县/区县必须是正确的缩写,并且都区分大小写,即 所有小写字母 。因此,如果缺少这些连字符,则需要使用vba中的Replace之类的函数添加这些连字符,以将Chr$(32)换成“-”或Chr$(45),并可能LCase$进行转换小写。

您还应该使用要使用的工作表完全限定范围。


单元格中数据的格式正确:

例如在单元格中使用los-angeles-calos-angeles-county-ca

Option Explicit
Public Sub SearchBot1()
    Dim objIE As InternetExplorer, aEle As HTMLLinkElement
    Dim HTMLinputs As MSHTML.IHTMLElementCollection
    Set objIE = New InternetExplorer
    'e.g. https://datausa.io/profile/geo/los-angeles-ca/
    With objIE
        .Visible = True
        .navigate "https://datausa.io/profile/geo/" & Range("City_Search").Value & "-" & Range("State_Search").Value
        Do While .Busy = True Or .readyState <> 4: DoEvents: Loop

        Stop
        ' .Quit '<== Uncomment me to close browser at end
    End With
End Sub

添加连字符:

如果您在一个单元格中有los angeles,而不是los-angeles

Replace$(Range("City_Search").Value, Chr$(32), Chr$(45))

小写和连字符:

为安全起见,您也可以转换为小写字母,以处理所引用的单元格中的任何大写字母,例如

对于Los Angeles,请使用:Replace$(LCase$(Range("City_Search").Value)

Option Explicit
Public Sub SearchBot1()
    Dim objIE As InternetExplorer, aEle As HTMLLinkElement
    Dim HTMLinputs As MSHTML.IHTMLElementCollection, ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    Set objIE = New InternetExplorer
    'e.g. https://datausa.io/profile/geo/los-angeles-ca/
    With objIE
        .Visible = True
        .navigate "https://datausa.io/profile/geo/" & ws.Range("City_Search").Value & "-" & ws.Range("State_Search").Value
        Do While .Busy = True Or .readyState <> 4: DoEvents: Loop

        Stop
        ' .Quit '<== Uncomment me to close browser at end
    End With
End Sub

这将使您进入页面。那你该怎么办......

答案 1 :(得分:0)

您知道这个网站有自己的数据搜索API吗?

您还可以使用背景对象提取数据,而不用创建Internet Explorer吗?

例如:

Sub getCityData()

''' Create a background server connection
Dim myCon As Object: Set myCon = CreateObject("MSXML2.ServerXMLHTTP.6.0")

    ''' Open a connection string with the DataUSA API and basic request for (geo, place, population)
    myCon.Open "GET", "http://api.datausa.io/api/?show=geo&sumlevel=place&required=pop"
    myCon.send   ''' Send the request

    ''' Dataset in the ResponseText is HUGE so for demo show first 5000 characters
    Sheet1.Range("A1").Value2 = Left(myCon.responseText, 5000)

End Sub

从2013年开始,这将为美国每个“地点”及其人口每年(从2013年起)提供整个数据集。它将把数据集的前5000个字符放入A1上的单元格Sheet1中(我建议将其放在新的Excel文件中)。

我没有时间学习该站点的API,但似乎有不错的文档On github,并且响应以JSON格式返回-如果您真的想创建一个功能强大的excel界面,请使用其API和背景连接-触手可及的美国大量数据