【问题标题】:scrape data from web page source where url doesn't change从 url 不变的网页源中抓取数据
【发布时间】:2020-07-13 16:11:32
【问题描述】:

我需要做以下事情

我有两个问题

  1. 我不知道如何选择“特殊医院”和“所有门诊医疗设施**注意 #2
  2. 当我手动选择这 2 种类型,然后单击某些医院时,URL 不会成为特定选择。 在我选择了 2 种类型后它变成了http://healthapps.state.nj.us/facilities/acFacilityList.aspx,然后当我点击医院时保持这种状态。 因此,我无法编写抓取这些页面的代码,因为我不知道如何为每家医院指定 URL。

抱歉,这必须是一个非常基本的问题,但我无法通过谷歌搜索任何对 Access VBA 有用的内容

这是从页面拉取数据的代码,我还没有做循环,所以这只是一个页面背后的源数据的基本拉取

Public Function btnGetWebData_Click() 
    Dim strURL
    Dim HTML_Content As HTMLDocument
    Dim dados As Object

    'Create HTMLFile Object
    Set HTML_Content = New HTMLDocument

    'Get the WebPage Content to HTMLFile Object
    With CreateObject("msxml2.xmlhttp")
        .Open "GET", "http://healthapps.state.nj.us/facilities/acFacilityList.aspx", False
        'http://healthapps.state.nj.us/facilities/acFacilityList.aspx
        .Send
        HTML_Content.Body.innerHTML = .responseText
        Debug.Print .responseText
        Debug.Print HTML_Content.Body.innerHTML
    End With
End Function

【问题讨论】:

  • 问题:您是否能够并且愿意使用不同的服务?与其尝试抓取网站,另一种选择可能是CMS NPPES NPI registry。您可以按州和分类搜索提供者(例如,您可以在新泽西州寻找特殊医院)。他们还提供了一个非常易于使用的free API。结果以 JSON 格式返回,因此您必须对其进行解析(我会推荐 this library)。
  • 哈哈有趣。我确实使用该文件,恐怕它没有我要查找的数据,我知道如何解析它:) 有人帮我用 python 写了一段。我会检查它是否有,谢谢你的想法!
  • 不,它没有。

标签: ms-access url web-scraping vba


【解决方案1】:

它导航到每个结果页面,并在其间返回主页,以便通过点击利用 postBack 链接。

Option Explicit
Public Sub VisitPages()
    Dim IE As New InternetExplorer
    With IE
        .Visible = True
        .navigate "http://healthapps.state.nj.us/facilities/acSetSearch.aspx?by=county"

        While .Busy Or .readyState < 4: DoEvents: Wend

        With .document
            .querySelector("#middleContent_cbType_5").Click
            .querySelector("#middleContent_cbType_12").Click
            .querySelector("#middleContent_btnGetList").Click
        End With

        While .Busy Or .readyState < 4: DoEvents: Wend

        Dim list As Object, i  As Long
        Set list = .document.querySelectorAll("#main_table [href*=doPostBack]")
        For i = 0 To list.Length - 1
            list.item(i).Click

            While .Busy Or .readyState < 4: DoEvents: Wend

            Application.Wait Now + TimeSerial(0, 0, 3) '<== Delete me later. This is just to demo page changes
            'do stuff with new page
            .Navigate2 .document.URL             '<== back to homepage
            While .Busy Or .readyState < 4: DoEvents: Wend
            Set list = .document.querySelectorAll("#main_table [href*=doPostBack]") 'reset list (often required in these scenarios)
        Next
        Stop                                     '<== Delete me later
        '.Quit '<== Remember to quit application
    End With
End Sub

与执行 postBacks 相同

Option Explicit
Public Sub VisitPages()
    Dim IE As New InternetExplorer
    With IE
        .Visible = True
        .navigate "http://healthapps.state.nj.us/facilities/acSetSearch.aspx?by=county"

        While .Busy Or .readyState < 4: DoEvents: Wend

        With .document
            .querySelector("#middleContent_cbType_5").Click
            .querySelector("#middleContent_cbType_12").Click
            .querySelector("#middleContent_btnGetList").Click
        End With

        While .Busy Or .readyState < 4: DoEvents: Wend

        Dim list As Object, i  As Long, col As Collection
        Set col = New Collection
        Set list = .document.querySelectorAll("#main_table [href*=doPostBack]")
        For i = 0 To list.Length - 1
           col.Add CStr(list.item(i))
        Next
        For i = 1 To col.Count
            .document.parentWindow.execScript col.item(i)
             While .Busy Or .readyState < 4: DoEvents: Wend
            'Do stuff with page
            .Navigate2 .document.URL
            While .Busy Or .readyState < 4: DoEvents: Wend
        Next
        Stop                                     '<== Delete me later
        '.Quit '<== Remember to quit application
    End With
End Sub

【讨论】:

  • 第二版完美运行!!第一次突出显示这一行 .Document.parentWindow.execScript col.Item(i)。没关系,第二个似乎可以满足我的需要。我现在接受答案还是等到我可以做赏金?再次感谢!!!!
  • 这取决于你。您可以通过不提供赏金来节省自己的代表点数。如果您提供赏金,您可能会得到更好的答案。如果有帮助,您可以随时投票。如果您愿意,请接受。你有很多选择。重要的是要获得您认为能够可靠地交付您需要的东西。
  • 我对答案很满意,我只是想为此放弃一些分数,这是一个非常有用的东西!另一个愚蠢的问题,我如何获得你循环通过的页面的源代码?我现在正在玩我的旧代码,将其插入,但我想我会问:)
  • innerHTML 应该是 .document.body.innerHTML 如果这就是你的意思吗?
  • 是的!你太棒了。那我现在怎么放弃积分呢?一旦我可以发布赏金,它会给你加分吗?我不太了解这个网站
猜你喜欢
  • 2020-12-19
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-04
  • 1970-01-01
  • 2020-01-07
相关资源
最近更新 更多