【问题标题】:How to enter a website address using VBA and search如何使用 VBA 输入网站地址并进行搜索
【发布时间】:2018-12-20 04:40:01
【问题描述】:

我知道这看起来很容易。我已经输入了一个代码来尝试让它工作,但遇到了一个问题。以下链接上的格式对于所有城市和州都是相同的。只要您可以输入城市名称(“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/

【问题讨论】:

    标签: vba excel web web-scraping


    【解决方案1】:

    您需要用连字符连接标题中有空格的城市。 Counties 必须是正确的缩写,并且两者都区分大小写,即需要全部小写。因此,如果缺少这些连字符,您需要使用 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
    

    这会让你进入页面。那你怎么办……

    【讨论】:

      【解决方案2】:

      您知道这个网站有自己的数据搜索 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 年开始,这将在大约一秒钟内为美国每个“地方”的人口提取整个数据集。它将数据集的前 5000 个字符放入 Sheet1 上的单元格 A1(我建议将其放入新的 Excel 文件中)。

      我没有时间学习该网站的 API,但它似乎有很好的文档 On github 并且响应以 JSON 格式返回 - 如果你真的想制作一个强大的 excel 界面,请使用他们的 API 和后台连接 -他们有很多美国数据触手可及

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-03
        • 2011-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多