重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

ご回答者様

いつもお世話になっております。
表題の件、マイホーム購入のために不動産情報を見たり不動産屋から資料を取り寄せています。
不動産屋の資料はPDFがほとんどで比較がしにくいのでスーモのスクレイピングを考えております。

下記項目を抽出予定です。
URL

https://suumo.jp/jj/bukken/ichiran/JJ010FJ001/?a …


抽出項目

物件名
販売価格
所在地
沿線・駅
専有面積
間取り
バルコニー
築年数
取扱業者
担当
電話番号

ソースは我流ですが途中まで作成しました。

Dim ObjIE As InternetExplorer

Set ObjIE = CreateObject("InternetExplorer.Application")

ObjIE.Visible = True

Dim ws As Worksheet
Dim ws2 As Worksheet
Set ws = ThisWorkbook.Worksheets("実行")
Set ws2 = ThisWorkbook.Worksheets("Output")

LastRow = ws.Cells(Rows.Count, 2).End(xlUp).Row

If LastRow = 2 Then
MsgBox "URLが記載されていません"
Exit Sub
End If

ws2.Cells.Clear

ws.Range("E3:E24").Copy
ws2.Range("A1").PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True

i2 = 1

imax = ws.Cells(i, 3) '
If imax = "" Then imax = 9999999

imaxc = 1

Do Until i = LastRow + 1

ObjIE.Navigate ws.Cells(i, 2)

Call waitrespons1(ObjIE)

Loop

For Each Obj In ObjIE.Document.getElementsByClassName("dottable-vm") '物件名
Cells(i, 2) = Obj.innerText
Exit For
Next



i = i + 1



Msbox = 完了しました


End Sub











Sub waitrespons1(ObjIE As Object)
Do While ObjIE.Busy = Ture Or ObjIE.ReadyState < READYSTATE_COMPLETE

DoEvents

Loop

End Sub


下記内容が分かりません。

1.物件名の後のClasswo指定したが物件名が抽されない。
2.次のページがある場合(今回であれば3件目以降の次のページ)に飛ぶにはどうしたら良いか。

当方、初心者ですので根本的なソースの誤りがあれば修正頂きたいです。

販売価格
所在地
沿線・駅
専有面積
間取り
バルコニー
築年数
取扱業者
担当
電話番号

上記内容につきましては現在質問を差し上げている内容が解決されてから対応します。

お忙しい所恐れ入りますが宜しくお願い致します。

A 回答 (2件)

部分サンプルをどうぞ


For Each Obj In ObjIE.Document.getElementsByClassName("dottable-vm") '物件名
Cells(i, 2) = Obj.innerText
Exit For
Next
i = i + 1
を下記に変える

  Dim Str As Object, i As Long, j As Long
  i = 0
  j = 1
  For Each Str In objIE.document.getElementsByClassName("dottable-line")
    If Str.innerText Like "物件名*" Or i >= 1 And i <= 5 Then ’この辺りは、HTMLソースをご覧ください。または、この条件文をなくし出力項目を確認してください。
      Sheets(2).Cells(j, 1) = Str.innerText ’インデックス2のA1セルから出力(検証する場合、変えてください)
      i = i + 1
    End If
    If i = 5 Then i = 0
    j = j + 1
  Next Str

あくまで、ターゲットのページ(ソースコード)の場合です。
TagName("dt")でobjElement.NextSiblingは、未検証、ぱっと見ダメそう。

また、不足分などは、ページのソースコードを見る限り、
ClassName("storecomment-txt")
ClassName("shopmore-title")
ClassName("makermore-tel")
などで抽出できるかと、、思います。

まずは、スクレイピングのみプロシージャを完成させた方が良いかと
その後、Cells.EntireRow.AutoFitなど考えてみてはいかがでしょう。

また、モジュールの最初に Option Explicit を加えましょう。
VBE > ツール > 編集  初心者ならすべてをチェック(個人的意見)
全てをチェックしたVBEを使用すれば、コード自体のタイプミスなどは、減ると思いますよ。
「スーモ スクレイピングの件」の回答画像2
    • good
    • 0

質問にあるコードですが、色々と難がありますね。


変数宣言、タイプミスを含め、検証して示された方が良いかと思います。
抜粋コードにしても読む側から見て ?が付きます。ざっくりでタイプミスであろう箇所が3か所ありますよ。
i2 = 1 imax = ws.Cells(i, 3)
If imax = "" Then imax = 9999999
Do While ObjIE.Busy = Ture
また、i = i + 1を必要とするループはどれ?

>2.次のページがある場合(今回であれば3件目以降の次のページ)に飛ぶにはどうしたら良いか。

これは、項目を指しているのか、それとも表示ページ(該当ページの遷移<div class="pagination pagination_set-nav">もしくは<p class="pagination-parts"><a href="を指しているのか
項目として同じ項目を飛ばしたいと言う事であれば、簡単な方法として、すべてをシートに書き込んだ後、重複削除を行った方が良いと思います。(個人的に検証段階で確認し易い)

いずれにしても、ws.Range("E3:E24").Copyなどのスクレ―ピングに不要と思われる個所を追加する前に
シンプルに対象ページをスクレ―ピングして対象のキーワードを抽出するコードを一旦書いてはどうでしょう。
スクレ―ピングの方法もいくつかありますし、HTMLの知識も必要になり道のりは、まだ遠い気もしますが、学習してください。
∴物件名などを抽出するサンプルは、控えます。

参考サイト https://www.vba-ie.net/
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!