1

yelp.com からデータを取得する方法を見つけようとしています。

いくつかのキーワードと場所が含まれるスプレッドシートがあります。スプレッドシートに既にあるこれらのキーワードと場所に基づいて、yelp リストからデータを抽出しようとしています。

次のコードを作成しましたが、探している正確な情報ではなく、ばかげたデータを取得しているようです。

会社名、住所、電話番号を取得したいのですが、取得できるものは何もありません。ここの誰かがこの問題を解決するのを手伝ってくれたら。

Sub find()

Dim ie As Object
    Set ie = CreateObject("InternetExplorer.Application")
    With ie
        ie.Visible = False
        ie.Navigate "http://www.yelp.com/search?find_desc=boutique&find_loc=New+York%2C+NY&ns=1&ls=3387133dfc25cc99#start=10"
        ' Don't show window
    ie.Visible = False

    'Wait until IE is done loading page
    Do While ie.Busy
        Application.StatusBar = "Downloading information, lease wait..."
        DoEvents
    Loop

    ' Make a string from IE content
    Set mDoc = ie.Document
    peopleData = mDoc.body.innerText
    ActiveSheet.Cells(1, 1).Value = peopleData
End With

peopleData = "" 'Nothing
Set mDoc = Nothing
End Sub
4

1 に答える 1

5

IE で右クリックして を実行するとView Source、サイトで提供されるデータがドキュメントの.Body.innerTextプロパティの一部ではないことが明らかです。これは動的に提供されるデータの場合によくあることであり、そのアプローチはほとんどの Web スクレイピングにとって非常に単純すぎることに気付きました。

私はそれを Google Chrome で開き、要素を調べて、本当に探しているものと、DOM/HTML パーサーを使用してそれを見つける方法を理解します。Microsoft HTML Object Library への参照を追加する必要があります。

ここに画像の説明を入力

<DIV>タグのコレクションを返すようにしIfて、ループ内のステートメントでクラス名をチェックできると思います。

元の回答にいくつかの修正を加えました。これにより、各レコードが新しいセルに出力されます。

Option Explicit
Private Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub find()
'Uses late binding, or add reference to Microsoft HTML Object Library 
'  and change variable Types to use intellisense
Dim ie As Object 'InternetExplorer.Application
Dim html As Object 'HTMLDocument
Dim Listings As Object 'IHTMLElementCollection
Dim l As Object 'IHTMLElement
Dim r As Long
    Set ie = CreateObject("InternetExplorer.Application")
    With ie
        .Visible = False
        .Navigate "http://www.yelp.com/search?find_desc=boutique&find_loc=New+York%2C+NY&ns=1&ls=3387133dfc25cc99#start=10"
        ' Don't show window
        'Wait until IE is done loading page
        Do While .readyState <> 4
            Application.StatusBar = "Downloading information, Please wait..."
            DoEvents
            Sleep 200
        Loop
        Set html = .Document
    End With
    Set Listings = html.getElementsByTagName("LI") ' ## returns the list
    For Each l In Listings
        '## make sure this list item looks like the listings Div Class:
        '   then, build the string to put in your cell
        If InStr(1, l.innerHTML, "media-block clearfix media-block-large main-attributes") > 0 Then
            Range("A1").Offset(r, 0).Value = l.innerText
            r = r + 1
        End If
    Next

Set html = Nothing
Set ie = Nothing
End Sub
于 2013-10-11T01:29:49.287 に答える