お疲れさまです。
エクセルのVBAを使用してスクレイピングマクロを作成しております。
どなたか詳しい方がおりましたら、力を貸していただきたいと思います。
URLはこちらです→ https://shop.sanrio.co.jp/products/detail.php?pr …
在庫を取得したいのですが、在庫を表示させるためには、セレクトボックスを選択しないといけません。
以下のマクロを作成しましたが、在庫数が取得できない状況にあります。
詳しい方がいらっしゃいましたら、何がいけないか教えて頂けると助かります。
ページ = "https://shop.sanrio.co.jp/products/detail.php?pr …
objIE.navigate (ページ)
時間 = Now
Do While objIE.Busy Or (objIE.readyState <> 4 And objIE.readyState <> 2)
DoEvents
If Now > 時間 + TimeValue("00:00:15") Then
Exit Do
End If
Loop
Set objDOC = objIE.document
'セレクトボックスの値取得(こちらはうまく取得できました)
(※ここでエクセルのセレクトボックスシートへセレクトボックスの値を書き出しております)
If objDOC.getElementsByClassName("summarySelect01 hasCustomSelect").Length > 0 Then
Sheets("セレクトボックス").Select
Cells.ClearContents
s = 1
For Each 要素 In objIE.document.getElementsByTagName("select")
If 要素.Name = "classcategory_id1" Then
For Each 要素1 In 要素.all.tags("option")
If 要素1.Value = "" Then Exit For
Sheets("セレクトボックス").Cells(s, 1) = 要素1.Value
Sheets("セレクトボックス").Cells(s, 2) = 要素1.innerText
s = s + 1
Next
Exit For
End If
Next
※ここからが問題の箇所です。
'在庫の取得
ax = Sheets("セレクトボックス").Range("A1").End(xlDown).Row
Set SELECT1 = objIE.document.getElementsByClassName("summarySelect01 hasCustomSelect")(0)
For s = 2 To ax
SELECT1.Value = Sheets("セレクトボックス").Cells(s, 1)
Sleep 20
SHT.Cells(n, "f") = Sheets("セレクトボックス").Cells(s, 2) & objIE.document.getElementsByClassName("fs16")(0).innerText _
& vbCrLf & SHT.Cells(n, "f")
Stop
Next s
Stop
エクセルのセレクトボックスシートは以下の様に値が取得されています。
A列(value) B列(innertext)
__unselected 選択してください
3489 Mサイズ
3488 Lサイズ
No.1ベストアンサー
- 回答日時:
こんにちは。
最初に、今回は、サイトの利用条件を確認をしていませんが、これはスクレイピングマクロとは呼べるほど過激な内容ではありませんから、相手様に迷惑かけないレベルとしては、ちょうどよい内容かもしれません。本格的にスクレイピングにしてしまうと、自分のプロバイダーから電話でも来そうな気がしてきます。
一応、マクロは作ってみたものの、文字数のアップロード制限がありますので、出せませんでした。私がよく使う手法は、画面を見ながら、Excelのシートにインポートする方法です。その分、コードが長くなってしまいます。
答えだけ書いておきます。
ご質問の要件は、 "box_right_summary"
にほぼ必要な情報を満たしているはずです。
下に書いたように、子ノードから取り出すほうが楽だと思います。
もちろん、InnerText 直接でもよいでしょう。
(ステートメントは「With objIE」 となっていますから、間違えないようにしてください。document の失敗で、objIEまで壊したくないからです。つまり、objIEは使い回しを考えていたからです。)
Set bxrt_sum = .document.getElementsByClassName("box_right_summary")
c_cnt = bxrt_sum.Length
If c_cnt > 0 Then '商品情報1 (ChildNodeから取得)
With bxrt_sum(0).ChildNodes
For i = 0 To .Length - 1
ndn = .Item(i).NodeName
If Left$(ndn, 1) <> "#" Then
buf = .Item(i).innerText
ご質問が、セレクトボックスとおっしゃっていたので、すぐに理解できませんでしたし、在庫の表示は、◯と数字の両方があります。ご質問の中のULRのように、表示がない所もあります。
もしも、InputBox のことでしたら、こういう場合は、その場所にないことが多いものです。今回は、たまたま、ID="num" が存在していましたので、
Set oNum = .document.getElementByID("num") '数量の取得
qty = oNum.Value
として取得しました。
ただ、この手の基本は、まず、HTMLコードをみて、Table がありそうなら、それで試してみるというのが常套手段です。作成は、InternetExplorer のみで作りました。
私の作ったコードは、様子見にさせていただくことにして、その代わり、取得した画像を御覧ください。
ご回答ありがとうございます。
ここの点ですが、教えて頂ければと思います。
<ご回答文抜粋>
ご質問が、セレクトボックスとおっしゃっていたので、すぐに理解できませんでしたし、在庫の表示は、◯と数字の両方があります。ご質問の中のULRのように、表示がない所もあります。
<さらにご質問>
ご質問の中のULRのように、表示がない所もあります。ですが、質問で上げさせていただきましたURLですが、サイズのセレクトボックスを選択すると在庫が表示されます。
質問がわかりにくく申し訳なかったのですが、マクロでセレクトボックスを選択すると在庫が出てこないので、何か方法があればと思いご質問させていただきました。
No.2
- 回答日時:
#1の回答者です。
読み違えまして、大変すみません。
現在、FireFox のFireBugで、コードを見ながら試してみましたが、解決策が現在、私には見つかりません。できると思っていただけに、今、反省と落胆しています。
私の知っている範囲は、一通り試しました。
以下、SBox1(0) は ご質問のSELECT1 同義です。
SBox1.selectedIndex =1
とか、
SBox1(0).options.value ="3489"
でいけると思ったのですが、それでも変化しないし、
SBox1(0).fireEvent("onchange")
でも、画面が変化しませんでした。
options.value は、書き込みできています。
画面が変化する時は、このようなClass表示が現れることはわかりました。
"summarySelect01 summarySelect01Focus summarySelct01Changed"
これによって、書き換えられるのだろうと思いますが、そのイベントが見つかりません。
まったく同類の質問を見つけましたが、そこでも解決の目処が立ちません。
三流君 IE SELECTタグの選択 .SelectedIndex=nで選択
フィードバック
ホームページに来た質問
http://www.ken3.org/vba/backno/vba154.html
お忙しいところありがとうございます。
私も悪戦苦闘しております。( ノД`)…
今回、いろいろとお時間を裂いてしまい、申し訳ございませんでした。
解決作が見つかりましたら、ここにアップします。
本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) マクロで最終行から上に検索を逆にしたい 1 2022/05/17 18:27
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Excel(エクセル) なぜExit Subがあるのかわかりません 4 2023/02/19 12:34
- Visual Basic(VBA) VBAでのループ順序について 3 2023/03/13 10:55
- Visual Basic(VBA) VBA 請求書自動作成 3 2022/04/24 01:58
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- Visual Basic(VBA) 形式を選択して貼り付け 以下のコードで「元」シートと「先」シートのA列に同じ値があったら指定範囲をコ 5 2022/11/11 07:30
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでActiveDirectoryのユーザ...
-
ListView 項目の選択/選択解除...
-
count(*)で取得した値をJAVAの...
-
VB.NETで DataRow()を利用して...
-
JavaScriptでWindowsログオンID...
-
VBA:小数点以下の数字を取得で...
-
getParameter と getAttribut...
-
データ数をカウントしたいのですが
-
NTPサーバから時刻を取得する
-
jQueryによるajaxで、CGIからの...
-
利用者側のMACアドレスを取得し...
-
コンボボックス表示文字列を取...
-
like演算子内に変数って使えな...
-
整数の桁数が取得できません
-
PCインストール済みのアプリケ...
-
LAN内接続マシン数及びIP、マシ...
-
URIでのページの移動について
-
ディスプレイの表示可能な解像...
-
VBA リストボックス内の値を複...
-
JavaScriptでリンク先やリモー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでActiveDirectoryのユーザ...
-
VB.NETで DataRow()を利用して...
-
ListView 項目の選択/選択解除...
-
VBA:小数点以下の数字を取得で...
-
count(*)で取得した値をJAVAの...
-
データ数をカウントしたいのですが
-
like演算子内に変数って使えな...
-
ListViewで複数選択された項目...
-
Flexgridで選択行の列の値を取...
-
エクセルVBAで複数選択できるよ...
-
JavaScriptでWindowsログオンID...
-
利用者側のMACアドレスを取得し...
-
郵便番号検索APIにてget Elemen...
-
COMポート 名前を取得する方法
-
コンボボックス表示文字列を取...
-
VBA Shapesの座標からセル位置...
-
Spreadの選択行の取得について
-
VBScriptで数値にコンマを付け...
-
C言語におけるコンピュータ名・...
-
Excel VBA でログインしてい...
おすすめ情報