人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

webサイトからマクロでデータを抽出して
エクセル形式のデータを得たいです。
具体的ページとして
https://www.jetro.go.jp/j-messe/?action_fairList=true&page=1&limit=100
となります。

理想形として
題名、開催地、期間、概要
の4つのカラムで下に向かってデータが並ぶものを理想としています。

VBAはほぼ初心者で困ってしまっています。
よろしくお願いします。

●質問者: used-by-ryo
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● a-kuma3
●1000ポイント ベストアンサー

こんな感じで。
アクティブなシートの 2行目から、題名、開催地、期間、概要を書きだします。

Sub 展示会情報を抽出()
 Set xhr = CreateObject("MSXML2.XMLHTTP")
 URL = "https://www.jetro.go.jp/j-messe/?action_fairList=true&page=1&limit=100"
 xhr.Open "GET", URL, False
 xhr.send ""
 If xhr.StatusText = "OK" Then
 Set doc = CreateObject("htmlfile")
 doc.write xhr.responseText
 Set divList = doc.getElementsByTagName("DIV")
 For i = 0 To divList.Length - 1
 r = 2  ' 一行目はタイトル行
 If divList(i).className = "elem_text_list_news" Then
 Set Item = divList(i).FirstChild
 Do While Not Item Is Nothing
 Set Data = Item.getElementsByTagName("DD")
 Set Title = Data(0).FirstChild
 Set eventDate = Title.NextSibling
 Set place = eventDate.NextSibling
 Set Comment = place.NextSibling
 Cells(r, 1).Value = title.innerText
 Cells(r, 2).Value = place.innerHTML
 Cells(r, 3).Value = eventDate.innerHTML
 Cells(r, 4).Value = comment.innerHTML

 Set Item = Item.NextSibling
 r = r + 1
 If r > 200 Then  ' 念のため
 Exit For
 End If
 DoEvents
 Loop
 Exit For
 End If
 DoEvents
 Next
 Set doc = Nothing
 End If
 Set xhr = Nothing
End Sub






追記です。

欲しいのは日本開催の展示会全部なのですが
それは可能でしょうか?

絞り込んだ地域などをパラメータ渡しではなくセッションで持っているようなので、データの取り方を変えました。
こんな感じです。
「展示会情報を抽出」サブルーチンを呼び出してください。

Sub nav(oIE, sURL)
 oIE.Navigate sURL
 Do While oIE.Busy
 Application.Wait DateAdd("s", 1, Now)
 Loop
End Sub

Function nextElement(e)
 Do While Not e Is Nothing
 If e.NodeType = 1 Then
 Exit Do
 End If
 Set e = e.NextSibling
 Loop
 Set nextElement = e
End Function

Sub 展示会情報を抽出()

 Set oIE = CreateObject("InternetExplorer.Application")

 oIE.Visible = False

 sURL = "https://www.jetro.go.jp/j-messe"
 Call nav(oIE, sURL)
 Cells(2, 1).Value = "■"

 sURL = "https://www.jetro.go.jp/j-messe/?action_fairList=true&type=v1&v_2=009"
 Call nav(oIE, sURL)
 Cells(2, 1).Value = "■■"

 sURL = "https://www.jetro.go.jp/j-messe/?action_fairList=true&type=v2&v_2=009&v_3=002"
 Call nav(oIE, sURL)
 Cells(2, 1).Value = "■■■"

 sURL = "https://www.jetro.go.jp/j-messe/?action_fairList=true&page=1&limit=100"
 Call nav(oIE, sURL)
 Cells(2, 1).Value = "■■■■"

 Set oDoc = oIE.document
 Set vvv = oDoc.querySelectorAll("DIV.elem_text_list_news DD")

 For i = 0 To vvv.Length - 1
 Set data = vvv.Item(i)
 Set Title = nextElement(data.FirstChild)
 Set eventDate = nextElement(Title.NextSibling)
 Set place = nextElement(eventDate.NextSibling)
 Set Comment = nextElement(place.NextSibling)
 r = i + 2
 Cells(r, 1).Value = Title.innerText
 Cells(r, 2).Value = place.innerText
 Cells(r, 3).Value = eventDate.innerText
 Cells(r, 4).Value = Comment.innerText
 Range(Cells(r, 1), Cells(r, 4)).WrapText = False

 DoEvents
 Next

 oIE.Quit
 Set oIE = Nothing
End Sub

最初からページをたどっていくので、かなり遅くなっちゃいました。
最終的な一覧ページにたどり着くのに少々待たされるので、A2 のセルに簡易的に進捗状況を表示するようにしてます。
が四つになると一覧のページにたどり着いています。




追記です。
新しめのメソッドが駄目なのかな、ということで、古くからあるメソッドだけで書き直してみたものです。

Sub nav(oIE, sURL)
 oIE.Navigate sURL
 Do While oIE.Busy
 Application.Wait DateAdd("s", 1, Now)
 Loop
End Sub

Function nextElement(e)
 Do While Not e Is Nothing
 If e.NodeType = 1 Then
 Exit Do
 End If
 Set e = e.NextSibling
 Loop
 Set nextElement = e
End Function

Sub 展示会情報を抽出()

 Set oIE = CreateObject("InternetExplorer.Application")

 oIE.Visible = False

 sURL = "https://www.jetro.go.jp/j-messe"
 Call nav(oIE, sURL)
 Cells(2, 1).Value = "■"

 sURL = "https://www.jetro.go.jp/j-messe/?action_fairList=true&type=v1&v_2=009"
 Call nav(oIE, sURL)
 Cells(2, 1).Value = "■■"

 sURL = "https://www.jetro.go.jp/j-messe/?action_fairList=true&type=v2&v_2=009&v_3=002"
 Call nav(oIE, sURL)
 Cells(2, 1).Value = "■■■"

 sURL = "https://www.jetro.go.jp/j-messe/?action_fairList=true&page=1&limit=100"
 Call nav(oIE, sURL)
 Cells(2, 1).Value = "■■■■"

 Set oDoc = oIE.document
 Set ddList = oDoc.getElementsByTagName("DD")
 r = 2
 For i = 0 To ddList.Length - 1
 If ddList(i).ParentNode.ParentNode.className = "var_ptb10 elem_text_list_news_pad" Then
 Set Data = ddList(i)
 Set Title = nextElement(Data.FirstChild)
 Set eventDate = nextElement(Title.NextSibling)
 Set place = nextElement(eventDate.NextSibling)
 Set Comment = nextElement(place.NextSibling)
 Cells(r, 1).Value = Title.innerText
 Cells(r, 2).Value = place.innerText
 Cells(r, 3).Value = eventDate.innerText
 Cells(r, 4).Value = Comment.innerText
 Range(Cells(r, 1), Cells(r, 4)).WrapText = False
 r = r + 1
 End If
 DoEvents
 Next

 oIE.Quit
 Set oIE = Nothing
End Sub

used-by-ryoさんのコメント
ありがとうとざいます!! 形式としては完全な回答ありがとうございます。 私の手違いでしたが、このURLだと 全体の展示会情報の入手でした・・・・ 欲しいのは日本開催の展示会全部なのですが それは可能でしょうか? (URLは同一?) https://www.jetro.go.jp/j-messe/ ここから アジア>日本 と選択していくと行けるところです。 不勉強でコマンドのブラッシュアップができませんで 私のミスで申し訳ございませんが これに対応できましたら、ポイントは全部差し上げます

a-kuma3さんのコメント
>> 欲しいのは日本開催の展示会全部なのですが それは可能でしょうか? << 回答に追記しました。

used-by-ryoさんのコメント
ありがとうございます。 プログレスバーの??は4つまでいきますが エラーで次に進みません。 デバッグでは Set vvv = oDoc.querySelectorAll("DIV.elem_text_list_news DD") にて 実行時エラー"438" オブジェクトは、このプロパティまたはメソッドをサポートしていません。 が出てしまいます。 本当にお手数をおかけしておりますが・・・ もう少しお願いしてもよろしいでしょうか。 本当にありがとうございます。

a-kuma3さんのコメント
>> 実行時エラー"438" オブジェクトは、このプロパティまたはメソッドをサポートしていません。 << Excel と IE は、何を使ってますか? ぼくは、Excel 2010 + IE10 で動作確認しました。。 JETRO のサイトのドキュメントモードは下位互換にしてませんよね? こちらで動作確認に使ったブックをアップロードしておきました。 http://firestorage.jp/download/8d5e6c7ab8f73a730501a95a618cfba8e4d444f0

a-kuma3さんのコメント
新しめのメソッドが駄目なのかな、という気がしたので、昔からある DOM のメソッドで書き直してみたコードも追記しておきました。

used-by-ryoさんのコメント
何度もありがとうございます。 現在、こちらの環境はexcel2013+IE8でした。 まだ、同じく oDoc.querySelectorAll の部分でエラーぽいのですが・・・ 環境を合わせることを検討してみます

a-kuma3さんのコメント
>> まだ、同じく oDoc.querySelectorAll の部分でエラーぽいのですが・・・ << いけない。間違えました。 三番目のコードの querySelectorAll は不必要な行です。 回答を修正して不必要な行を削除しましたので、そちらで試してみてください。 IE8 だと、querySelectorAll は未対応だったような気がします。

質問者から

表記のURLは世界全体の展示情報でしたが
欲しい情報は日本国内の展示会情報です。

https://www.jetro.go.jp/j-messe/
ここから
アジア>日本
と選択していくと行けるところです。


関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ