すみません。誰か助けてください。
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>
No.1ベストアンサー
- 回答日時:
スクレーピング禁止令は、私の見た限りでは出てきませんでしたが、ここのサイトは大丈夫でしょうか。
ディズニー関連は、いろいろ文句が来るような話も聞きます。こうやって取れるのも、ほんの短い期間かもしれません。内容にそれほど責任はもてませんが、常識的な範囲で試してみてください。後で、プロバイダーを通して、ペナルティなど来ないよう祈るばかりです。わざと、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
'//取得画面
WindFaller様。ありがとうございました。
スクレーピングって危険なんですね。。。。
大変助かりました。今後ともよろしくお願いいたします。
No.2
- 回答日時:
#1の回答者です。
> スクレーピングって危険なんですね。。。。
一部では、すごく嫌われているみたいです。代表的なものは、ハローワークの仕事検索とかダメになりましたね。モーグも、アマゾンもダメですね。他にも、証券・為替でサイトによって取れないところや、改行コードが、Windows標準と違うと、取れないところがあります。
でも、今のやり方なら、そんなに何度もするわけではないから、問題はないと思うのですが……。1日に1度、変わる程度だと思います。
WindFaller様。
本当にご親切にありがとうございます。
スクレ―ピング時は十分注意してプログラム行いたいと思います。
今回の件無事解決いたしました。
重ねてお礼いたします。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- JavaScript Javascript初心者|jQueryの.val()で値を取得し複数の要素を連結させる方法知りたい 2 2022/06/02 12:06
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- JavaScript 以前の質問だと、どの条件でも配列が表示されてしまいます。 1 2022/07/09 11:40
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
チェックボックスの返す値
-
FC2 掲示版のカスタマイズの仕...
-
Error: No Recipient というエ...
-
アンケートで質問を複数ページ...
-
hiddenで送ったデータの取り出し方
-
cgiの改造なんですけど助けてく...
-
python subprocessに関する質問
-
テキストエリアのデータを隠し...
-
wordの数式について 定積分を書...
-
ラジオボタンが両方とも選択で...
-
WEBページを強制的に横画面で見...
-
ディレクトリのファイル数取得
-
フォントサイズを変えるには?
-
selectboxの画面遷移で、postデ...
-
ブックマークからのアクセスを...
-
select値をhiddenのvalueに渡し...
-
コンボ1の内容に応じてコンボ...
-
<select>タグの幅設定
-
INPUT TYPE
-
htmlファイルが表示できません
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
チェックボックスの返す値
-
別formのhidden項目を自form値...
-
チェックボックスでのvalue値の...
-
チェックボックスで選択した内...
-
Error: No Recipient というエ...
-
python subprocessに関する質問
-
CGIでチェックボックスを使...
-
CGIに渡しているパラメータを表...
-
掲示板の文字色指定について
-
hiddenで送ったデータの取り出し方
-
CGIで書き出したJavaScriptの動...
-
ランキング作成
-
クリップボードに記憶した文字...
-
フォームの内容を確認するペー...
-
CGIフォームから飛ばすメールで...
-
アンケートフォームで前のペー...
-
CGIフォームから飛ばすメールが...
-
VBAでWEBもっと見るを押して...
-
検索フォーム設置時のnameの文...
-
フォームの入力内容の後ろに文...
おすすめ情報