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

お疲れさまです。

いつも回答くださる皆様、本当にありがとうございます。
今回もエクセルのVBAについて教えてください。

今、IE制御ではなくHTTPを使用した、WEBデータの取得を勉強しております。
HTTPでWEBデータを取得した際、WEB上のボタンをクリックしWEB画面が変わった場合
この画面をまたHTTPで取得したいと思います。

こちらの方法どなたか詳しい方がおりましたら、ご教授頂きたくお願いいたします。

取得のURLは以下です(アマゾン)
https://www.amazon.co.jp/%E3%80%90%E3%83%8E%E3%8 …


以下、作成したマクロ
xmlhttpのサブルーチン
Call http.Open("SET", URL, False)

メイン
Set html1 = xmlhttp1.HtmlDocOpen(http1, "https://www.amazon.co.jp/%E3%80%90%E3%83%8E%E3%8 …


For Each 要素 In html1.getElementsByClassName("a-size-small")
DoEvents
If InStr(要素.innerText, "新品の出品") > 0 Then
要素.Click

Exit For
End If
Next

’ここで画面が変わるので、その情報をまたHTTPで制御をしたいです。!!!

For Each 要素 In html1.getElementsByClassName("a-icon a-icon-jp a-icon-prime-jp a-icon-small")
DoEvents
If InStr(要素.innerText, "プライム") > 0 Then
要素.Click
Exit For
End If
Next


’ここで画面が変わるので、その情報をまたHTTPで制御をしたいです。!!!
’今のままですと、一番初めに取得したHTTPからデータを持ってきてしまっております。


If html1.getElementsByClassName("a-size-large a-color-price olpOfferPrice a-text-bold").Length > 0 Then
i = html1.getElementsByClassName("a-size-large a-color-price olpOfferPrice a-text-bold").Length - 1
If i > 2 Then i = 2
For p = 0 To i
Sheet1.Cells(j + 1, 2) = html1.getElementsByClassName("a-size-large a-color-price olpOfferPrice a-text-bold")(p).innerText
Next p
End If

A 回答 (2件)

追加情報です。



本日、ちょっと自分の書いたコードを見直すことがあって、気がついたことですが、私のコードの中で、WinHttp.WinHttpRequest.5.1を使っているものがあります。

XMLHTTP とほぼ同様な使い方だとは思います。

それで、自分はどうしているかというと、また、最初に戻って、URLを与えてて、Openして、必要な箇所を取っていました。

----
Start:
 objHTTP.Open "GET", strURL, False
 objHTTP.Send

 If objHTTP.Status = 200 Then
   httpLog = objHTTP.ResponseText
   Call LogAnalyzes(httpLog) '-->この中で、次のリンク先アドレスを取得し、strURLに代入し、[Start] に戻るわけです。
 Else
   MsgBox "アクセスに失敗しました。" & ":" & objHTTP.Status
   End
 End If

----

だから、ログインなどの手順が必要なものには不向きというか、もう一度、ログインから初めていくという問題があります。しかし、また、そういう操作が必要なものというものは、それほど多くありません。

なお、この手のロボット・データ収集は禁止されている模様です。
https://www.amazon.co.jp/gp/help/customer/displa …
利用許可およびサイトへのアクセス
    • good
    • 0

こんにちは。



最初に、ちょっと気になる部分として、
> xmlhttp1

これで取得して、動的(dynamic)にスムーズに変わりますでしょうか?それを使うのは、新しくもあり、古くからもありですが、動的に変えるのは、やはりIEオブジェクトからの方が楽です。

最初の起動から見ていないのではっきりと明言は出来ませんが、IEではなく、 Document 側も、間違いなければ、HTMLDocumentを使っていらっしゃるようです。

方針を変えたのでしょうか。この場合、確か、画面が変わるのは、HttpHeader の状態から判定するのではなかったかと思います。一応、HttpHeader のログも取ってみたけれど、読み方を完全に忘れてしまいました。

xmlhttp に取得した情報を、POSTして組み立てるようなことをするのだったと思います。私は、xmlHttp 等で連続して取得する方法を知りません。なぜかというと、HttpHeaderのGET/POST の読み方が分からないからです。

今、私は勘違いしているのかもしれませんが、IEで取り続けている
限りは、もともと、そんな必要はないわけです。IEなら、一応、定
まった場所なら、そちらに飛ばせられます。URLさえ取得すれば、
objIE.Navigate URL で、進むからです。

それと、私には分からない部分は、今完全自動化しているようにも見えません。すでに、Class 名が取れているのですから、単発でとっても同じことです。

だったら、もう、Evernote形式で、クリップでデータを取るように、Excel等でインポートしたほうが楽ではないでしょうか。

何か、特別の変更があったようですが。

最後に、この「プライム」は、一体、どこを指しているのか、よく分かりませんでした。

For Each 要素 In html1.getElementsByClassName("a-icon a-icon-jp a-icon-prime-jp a-icon-small")
DoEvents
If InStr(要素.innerText, "プライム") > 0 Then
要素.Click '←こちらは、別の場所に飛ばせられないように思うのですが。
Exit For
End If
Next
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

私のプログラムミスもあり、ご指摘の箇所でクリックができておりませんでした。
xmlhttpですとIEよりダントツに早いのと、別の作業がIEでできるメリットがありXMLHTTPを使用しました。

IEですとWEB画面が切り替わると新しい情報を取得してきてくれるのですが、XMLHTTPは一番初めにロードしたページの情報を保持してしまう様です。

色々調べまして、キャッシュの問題等あるようです。

教えて頂いた通り、IEによる制御にしました・・・・

いつもありがとうございます。

お礼日時:2016/11/13 18:38

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