アプリ版:「スタンプのみでお礼する」機能のリリースについて

お疲れさまです。
エクセルの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サイズ

A 回答 (2件)

こんにちは。



最初に、今回は、サイトの利用条件を確認をしていませんが、これはスクレイピングマクロとは呼べるほど過激な内容ではありませんから、相手様に迷惑かけないレベルとしては、ちょうどよい内容かもしれません。本格的にスクレイピングにしてしまうと、自分のプロバイダーから電話でも来そうな気がしてきます。

一応、マクロは作ってみたものの、文字数のアップロード制限がありますので、出せませんでした。私がよく使う手法は、画面を見ながら、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 のみで作りました。

私の作ったコードは、様子見にさせていただくことにして、その代わり、取得した画像を御覧ください。
「エクセルVBAによるIE制御(セレクトボ」の回答画像1
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
ここの点ですが、教えて頂ければと思います。

<ご回答文抜粋>
ご質問が、セレクトボックスとおっしゃっていたので、すぐに理解できませんでしたし、在庫の表示は、◯と数字の両方があります。ご質問の中のULRのように、表示がない所もあります。

<さらにご質問>
ご質問の中のULRのように、表示がない所もあります。ですが、質問で上げさせていただきましたURLですが、サイズのセレクトボックスを選択すると在庫が表示されます。

質問がわかりにくく申し訳なかったのですが、マクロでセレクトボックスを選択すると在庫が出てこないので、何か方法があればと思いご質問させていただきました。

お礼日時:2016/10/23 16:39

#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
    • good
    • 0
この回答へのお礼

お忙しいところありがとうございます。

私も悪戦苦闘しております。( ノД`)…

今回、いろいろとお時間を裂いてしまい、申し訳ございませんでした。

解決作が見つかりましたら、ここにアップします。

本当にありがとうございました。

お礼日時:2016/10/24 12:47

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