質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

1回答

2559閲覧

VBAで楽天をスクレーピング

yumeno

総合スコア27

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

2クリップ

投稿2019/05/28 06:44

編集2022/01/12 10:55

前提・実現したいこと

はじめまして、スクレイピング初心者です。
現在、VBAでスクレイピングの勉強をしたいと思い、ネットで検索しながら日々奮闘しています。
やりたいことは、自分がよく使用するAmazonや楽天で、商品の価格を収集して比較し、一番安いサイトで購入することです。
しかし、htmlも勉強しながら構築していますが、VBAによるスクレイピングがうまくいきません。
なにとぞ、皆さんの英知をお貸しいただけるととてもありがたいです。
よろしくお願いいたします。

発生している問題・エラーメッセージ

商品名・ショップ名の取得が正しくない(どのタグを拾うべきかわからない) 「オブジェクトが必要です」

該当のソースコード

前提:スクレイピングしたい商品情報を検索し、ページを展開してからマクロを起動する

Option Explicit
'【要確認】
'webスクレイピングをするために環境設定を行う
'参考:https://rabbitfoot.xyz/vba-automation-ws1/
'楽天のお気に入りページを開いた上で実行してください。

Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias _
"URLDownloadToFileA" (ByVal pCaller As LongPtr, ByVal szURL As String, ByVal _
szFileName As String, ByVal dwReserved As LongPtr, ByVal lpfnCB As LongPtr) As LongPtr

'-----------------------------------------------------------------
'現在IEで開いている楽天の商品ページの情報を、シート状に取得する
'-----------------------------------------------------------------
Sub main()
Dim objIE As InternetExplorer '楽天の商品ページを格納
Dim sProductName As String '商品名
Dim sProductURL As String '商品URL
Dim ShopName As String 'ショップ名称

'IE取得関連 Dim objShell As Object 'shellオブジェクト格納 Dim objWindow As Object 'ウィンドウを格納 Dim vTmp As Variant Dim iIdx As Integer '画像取得関連 Dim objdivTags As Object '全divタグを格納 Dim objdiv As Object Dim sClassName As String 'タグのクラス名を格納 Dim iRow As Integer '---------楽天のページを取得する処理--------- Set objShell = CreateObject("Shell.Application") For Each objWindow In objShell.Windows 'IEウィンドウの判定 If InStr(LCase(objWindow.FullName), "iexplore.exe") > 0 Then 'タイトルに楽天.co.jpが含まれていれば商品ページと判定 If InStr(objWindow.document.Title, "楽天") > 0 Then Set objIE = objWindow Exit For End If End If Next '楽天のページが見つからなかった場合の処理 If objIE Is Nothing Then MsgBox "商品ページの取得ができませんでした。" End End If '---------------------------------------------- sProductName = objIE.document.getElementsByClassName("styles__title___B_fG6") sProductURL = objIE.document.getElementsByClassName("styles__blackLink___1Y806") ShopName = objIE.document.getElementsByClassName("ricon-shop-simple") '改行ごとに分割し、頭に「●」印を付けて再度結合させる    vTmp = Split(objIE.document.getElementById("feature-bullets").innerText, vbCrLf) **__←エラー箇所__** For iIdx = 0 To UBound(vTmp) If Trim(vTmp(iIdx)) <> "" Then ShopName = ShopName & "●" & Trim(vTmp(iIdx)) & vbCrLf End If Next '最終行+1を書き込み対象行に設定する iRow = Cells(Rows.Count, "A").End(xlUp).Row + 1 Cells(iRow, 1).Value = sProductName Cells(iRow, 2).Value = sProductURL Cells(iRow, 3).Value = ShopName

End Sub

VBA

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco_bauer

2019/05/28 07:09

エラー箇所の手前で、objIE.document.getElementById("feature-bullets").innerText の内容を確認してみてください。  「オブジェクトが必要です」というのは、エラー箇所で出るエラーメッセージなのですか?
yumeno

2019/05/28 07:34

>エラー箇所の手前で、objIE.document.getElementById("feature-bullets").innerText の内容を確認してみてください。 →「オブジェクトが必要です」とのエラーメッセージが表示されました・・・ >「オブジェクトが必要です」というのは、エラー箇所で出るエラーメッセージなのですか? →おっしゃるとおりです
guest

回答1

0

楽天で適当に4つほど商品のページを開いて、"ページのソースの表示"でHTMLを表示させ、そこに"feature-bullets"という文字列が含まれているかどうかを確認しました。

"feature-bullets"という文字列が含まれているページは、私が見た4件には含まれていませんでした。

そうしたページでは、

objIE.document.getElementById("feature-bullets")

がnullになりますから、

document.getElementById("feature-bullets").innerTex

で、「オブジェクトが必要です」というエラーが出ます。
当然ですね。

八百屋に行って「Playstation4」を売ってくださいと言ったのに、「ありません」と言われてしまいました。どうしてでしょう。 ぐらいの、笑えない冗談です。

==
スクレイピングをしたいなら、スクレイピングする対象のページのHTMLがどのような構造をしていて、どのようなIDが使われているのかといった下調べをしましょう。

そして、確実に見つかるはずのエレメントが取得できるかどうかを試すことで、自分のプログラムがちゃんと動作するかどうかの確認をしましょう。

「まず、相手を知る!」ことは、プロジェクトを進める際に重要な意味を持ちます。

投稿2019/05/28 08:30

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問