プロが教える店舗&オフィスのセキュリティ対策術

何をやってもダメで質問させていただきます。要はWebの中の「次へ」のボタンをクリックしたいと思っています。

途中でシートに取り込む箇所が在りますが取り込んでいる様子は全然ないです。Webページの周りのデータは取り込んでいるのですが。
 コードは以下の通りです。どうも肝心の「次へ」があるaのタグをスキップしているようです。
なぜこうなるのか分かりません。

Option Explicit
Sub webdata()

Dim objIE As InternetExplorer
Dim doc As HTMLDocument
Dim 取得URL As String
Dim objtsugi As Object
Dim pt As Object
Dim endline As Long


Application.ScreenUpdating = False


取得URL = "http://www.kaigokensaku.mhlw.go.jp/23/index.php? …

Set objIE = CreateObject("InternetExplorer.Application")

objIE.Visible = True
objIE.navigate 取得URL

Do While objIE.Busy Or objIE.readyState < READYSTATE_COMPLETE
DoEvents
Loop

Set doc = objIE.document

Application.Wait [Now()] + 200 / 86400000
Do While objIE.Busy Or objIE.readyState < READYSTATE_COMPLETE
DoEvents
Loop

'*******************

Set pt = doc.getElementById("contentsMainInner")

For Each objtsugi In pt.getElementsByTagName("a")
endline = Cells(Rows.Count, 27).End(xlUp).Row + 1 'ただの確認用です。
Cells(endline, 27) = objtsugi.outerHTML  'ただの確認用です。
If InStr(objtsugi.outerHTML, "次へ") > 0 Then
objtsugi.Click
' Call WaitFor(3)
Exit For
End If
Next

'*******************

objIE.Quit
Set objIE = Nothing

End Sub

質問者からの補足コメント

  • 「次へ」の上の idタグ の「contentsMainInner」ではOKなのですが「次へ」の上の直ぐ上の「pagerTop」で

    Set pt = doc.getElementById("pagerTop")
    For Each objtsugi In pt.getElementsByTagName("a")



    にするとsetの行は黄色くなりptはnothingになってしまいます。ここが分からないです。
    なお途中にblockなどの文字が見えており、ひょっとすると子の文字から下は何かブロックされているのかなとも思っています。

    No.1の回答に寄せられた補足コメントです。 補足日時:2018/10/30 11:58

A 回答 (2件)

こんにちは



対象サイトをざっと見ただけですが・・・
クリックなさろうとしている要素は、iframeタグの中にありますよね?
iframe内は別の文書(document)なので、読み込まれるタイミングも別々ですし、その文書中の要素はメインの文書の要素ではありません。
ついでに言うと、「次へ」などで表示を切り替える際は、このiframeの部分だけ再読み込みで切り替える仕組みかと思います。

>どうも肝心の「次へ」があるaのタグをスキップしているようです。
メイン文書の直接の子孫要素のようにして取得しようとなさっているので、失敗しているものと想像します。
(上述のように、別文書の構成要素ですので、メイン文書内には存在しない)

以下のような手順でテストしてみました
 1)iframeで表示中の文書オブジェクトを取得
 2)当該文書の読み込みが完了しているかを確認
 3)対象要素を取得(=「次へ」の要素)
 4)上記をクリック

きちんと検証はしていませんが、一応、動作すると思いますのでご参考までに。

※ ご提示のコードではリンクタグ全体からループして該当要素を探していますが、
 ピンポイントで直接指定できますので、そのように変えてあります。
※ ご提示のコードでは、クリックしたらブラウザをQuitしてしまっているので、
 結果が表示できているのか疑問です。(多分、何も確認できない)
 ひとまず、STOPで停止させるようにしてあります。

以下のコードを、ご提示のコードのobjIEがreadyになった後に続けてみてください
('******************* のコメント行の次から)

Set doc2 = doc.getElementById("resultListFrame").contentWindow.document

Do While doc2.readyState <> "complete"
DoEvents
Loop

Set nxtElm = doc2.querySelector("#pagerTop li.pagerNext a")
nxtElm.Click
Stop
    • good
    • 0
この回答へのお礼

出来ました。違うドキュメントだったんですね。
有難うございました。夢にまで出てきたのですが良い睡眠がとれそうです。
良かった。・・です。
ついでに表示件数にも挑戦します。これもできそうです。

お礼日時:2018/10/30 21:57

こんにちは。



まだ、詳しく見たわけではありませんが、そのサイトは通常取れるはずのTagが取れませんね。
どうやら、フレームになっているようで、「次へ」をクリックしても、アドレスには変化ありません。通常だったら、別に「次へ」をクリックしなくても、アドレスから変更できます。

直接、フレームの中のページにアクセスして、「次へ」のタグから、オブジェクトを取り出して、Click する方法しか思いつきません。私は、このようなものは、初めてなので、何のために相手側がしているかを考えると、クローリング対策なのかなと勘ぐってしまいます。

<li class="pagerNext"><a href="javascript:void(0);" onClick="pagerForm(5,5,null,null)
この部分が取れれば、稼働するはずです。
この回答への補足あり
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。
フレームですか?自分の能力を超えているようです。
試してみます。とはいってもどうするかまだ分からない状態です。高い壁が有りそうです。

お礼日時:2018/10/30 11:20

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