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

すみません。誰か助けてください。
VBA以下URLからスクレイピングツールを作成していますが、もっと見るが押せず20件でマクロが止まってしまいます。

もっと見るを押して、次のデータを取得できるVBAコードを教えていただけないでしょうか?

URL
http://store.disney.co.jp/search/goodssearch.asp …

どなたかご教授お願いいたします。



ここら辺があやしいと思われる箇所です。

<div class="c-btn-more" style="display: block;" id="c-btn-more">もっと見る<i></i></div>
<div class="loading"><i></i></div>



<span id="_postdata">
<input type="hidden" name="scene" id="hidden_scene" value="newitem">
<input type="hidden" name="category" id="hidden_category" value="">
</span>

<input type="hidden" name="hidden_tree_top" id="hidden_tree_top" value="">
<input type="hidden" name="hidden_tree_large" id="hidden_tree_large" value="">
<input type="hidden" name="hidden_tree_medium" id="hidden_tree_medium" value="">
<input type="hidden" name="hidden_tree_small" id="hidden_tree_small" value="">
<input type="hidden" name="hidden_tree_character" id="hidden_tree_character" value="">
<input type="hidden" name="hidden_tree_option" id="hidden_tree_option" value="">
<input type="hidden" name="hidden_tree_feature" id="hidden_tree_feature" value="">

<input type="hidden" name="hidden_sale" id="hidden_sale" value="">
<input type="hidden" name="hidden_disp" id="hidden_disp" value="">
<input type="hidden" name="hidden_keyword" id="hidden_keyword" value="">

<input type="hidden" name="hidden_min_price" id="hidden_min_price" value="">
<input type="hidden" name="hidden_max_price" id="hidden_max_price" value="">

<input type="hidden" name="offset" id="offset" value="20">
<input type="hidden" name="itemcnt" id="itemcnt" value="20">
<input type="hidden" name="total" id="total" value="115">
<input type="hidden" name="hidden_search" id="hidden_search" value="">

<script type="text/javascript">

jQuery('#c-btn-more').click(function(){
var offset=parseInt(jQuery('#offset').val());
var cnt=parseInt(jQuery('#itemcnt').val());
var total=parseInt(jQuery('#total').val());

var postdata = {};
postdata["type"] = 'goodslist';
postdata["category"] = jQuery('#hidden_category').val();
postdata["tree_large"] = jQuery('#hidden_tree_large').val();
postdata["tree_medium"] = jQuery('#hidden_tree_medium').val();
postdata["tree_small"] = jQuery('#hidden_tree_small').val();
postdata["tree_character"] = jQuery('#hidden_tree_character').val();
postdata["tree_option"] = jQuery('#hidden_tree_option').val();
postdata["tree_feature"] = jQuery('#hidden_tree_feature').val();

postdata["min_price"] = jQuery('#hidden_min_price').val();
postdata["max_price"] = jQuery('#hidden_max_price').val();

postdata["sale"] = jQuery('#hidden_sale').val();
postdata["disp"] = jQuery('#hidden_disp').val();
postdata["limited"] = jQuery('#hidden_itemcnt').val();
postdata["keyword"] = jQuery('#hidden_keyword').val();
postdata["scene"] = jQuery('#hidden_scene').val();
postdata["offset"] = jQuery('#offset').val();
postdata["sort"] = jQuery('#sort').val();
postdata["search"] = jQuery('#hidden_search').val();

SetGoodsList(postdata);
offset=offset+cnt;
if(offset>=total){
jQuery('#c-btn-more').remove();
}
jQuery('#offset').val(offset);
});
jQuery(window).load(function() {

var cnt=parseInt(jQuery('#itemcnt').val());
var total=parseInt(jQuery('#total').val());

jQuery('#offset').val(cnt);

if((cnt)>=total){
jQuery('#c-btn-more').remove();
}
});
</script>

A 回答 (2件)

スクレーピング禁止令は、私の見た限りでは出てきませんでしたが、ここのサイトは大丈夫でしょうか。

ディズニー関連は、いろいろ文句が来るような話も聞きます。こうやって取れるのも、ほんの短い期間かもしれません。内容にそれほど責任はもてませんが、常識的な範囲で試してみてください。後で、プロバイダーを通して、ペナルティなど来ないよう祈るばかりです。

わざと、Sleep を入れて止めています。ほんの気休めです。
私のやり方を参考にしてみてください。
2行目から出すようになっています。

'//標準モジュール

Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)

Sub GetDatathruIE()
  Dim strURL As String
  Dim objIE As Object
  Dim i As Long, j As Long, a As Long
  Dim k As Long, v As Long, cnt As Long, page As Long
  Dim lastCell As Range
  Dim cbtn
  Dim itm_Ea
  Dim itm_C
  Dim itmLists, pn
  Dim ar
  Dim buf
  Dim MaxItm  As Long
  
  strURL = "http://store.disney.co.jp/search/goodssearch.asp …
  On Error GoTo ErrHandler
  Set objIE = CreateObject("InternetExplorer.Application")
  objIE.Navigate2 strURL
  ' objIE.Visible = True  ''最初はVisible はTrueにしたほうがよいです。
  Do While objIE.Busy Or objIE.ReadyState <> 4: DoEvents: Loop
    With objIE
      Set pn = .document.GetElementsbyClassName("p-navbar__result")
      If pn.Length = 0 Then
        MsgBox "サイトが変わったか、全アイテム数が取れません", vbExclamation
        Exit Sub
      Else
        MaxItm = Val(Replace(pn(0).innerText, "全", "")) 'アイテム全部の数を取る
      End If
      page = Int(MaxItm / 20) - CInt(((MaxItm Mod 20) > 0)) 'ページ数
      ''GoTo ErrHandler '(サイトが開くか予行演習)
      
      '-------------------これ以降がデータ取得------------
      For a = 1 To page
        If a = 1 Then
          Set itmLists = .document.GetElementsbyClassName("item-list grid")
        Else
          Set itmLists = .document.GetElementsbyClassName("new li_item" & CStr((a - 1) * 20))
        End If
        If itmLists.Length = 1 Then
          Set itm_Ea = itmLists(0)
          Set itm_C = itm_Ea.ChildNodes
        End If
        If a = 1 Then
          j = 1 '行の始まりの一つ手前(2行目から)
        Else
          Set itm_C = itmLists
        End If
        '--------------
        For i = 0 To itm_C.Length - 1
          If TypeName(itm_C(i)) = "HTMLLIElement" Then
            buf = Trim(itm_C(i).innerText)
            v = 1
            ar = Split(buf, vbCrLf)
            For k = 0 To UBound(ar) - 1
              If Trim(ar(k)) <> "" Then
              If Trim(ar(k)) Like "詳細を見る*" Then Exit For
                Cells(j + 1, v).Value = ar(k)
                DoEvents '暴走を止めるため
                If Val(ar(k)) > 0 Then Exit For '.ループから抜け出る
                v = v + 1
              End If
            Next k
            cnt = cnt + 1
            j = j + 1 'jは行数
            If cnt > MaxItm Then Exit For '' jは行数であり、アイテム数, 全アイテム数よりも越えたらおしまい
          End If
          buf = ""
          If IsArray(ar) Then
            Erase ar
          End If
        Next i
        ' GoTo ErrHandler 'ここを外すと、1回で終わる
        If a = 1 Then
          Set cbtn = .document.GetElementByID("c-btn-more")
        ElseIf a = page Then
          Exit For
        End If
        cbtn.Click
        Sleep 2000
      Next a
    End With
ErrHandler:
    Set lastCell = Cells(Rows.Count, 1).End(xlUp)
    Range("A1", lastCell).Resize(, 4).WrapText = False
    If Err <> 0 Then
       MsgBox Err.Description
    Else
      MsgBox MaxItm & "件 正常終了しました。", vbInformation
    End If
    objIE.Quit
    Set objIE = Nothing
End Sub
'//取得画面
「VBAでWEBもっと見るを押して情報を取」の回答画像1
    • good
    • 0
この回答へのお礼

WindFaller様。ありがとうございました。
スクレーピングって危険なんですね。。。。
大変助かりました。今後ともよろしくお願いいたします。

お礼日時:2016/06/03 19:05

#1の回答者です。



> スクレーピングって危険なんですね。。。。

一部では、すごく嫌われているみたいです。代表的なものは、ハローワークの仕事検索とかダメになりましたね。モーグも、アマゾンもダメですね。他にも、証券・為替でサイトによって取れないところや、改行コードが、Windows標準と違うと、取れないところがあります。

でも、今のやり方なら、そんなに何度もするわけではないから、問題はないと思うのですが……。1日に1度、変わる程度だと思います。
    • good
    • 0
この回答へのお礼

WindFaller様。

本当にご親切にありがとうございます。
スクレ―ピング時は十分注意してプログラム行いたいと思います。

今回の件無事解決いたしました。
重ねてお礼いたします。

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

お礼日時:2016/06/03 22:07

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