[[20200720215808]] 『ChromeでSelenium basicを利用してwebスクレイピメx(たまご) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ChromeでSelenium basicを利用してwebスクレイピング』(たまご)

google chromeでseleniumを使用しています。
サイトは読売新聞
https://www.yomiuri.co.jp/
になります。サイト内記事の掲載時間を取得しセルに貼り付けしようとするマクロを組んでいます。複数の時間を取得しようとしているのですが、良い方法が思いつきません。

掲載時間のセレクタは以下になります。

body > div.layout-contents > div.layout-contents__main > div > div.home-main-news-organization.p-category-latest > section > ul.p-category-latest-sec-list.p-list.p-list-col2 > li:nth-child(5) > article > div > div.c-list-date > time

ここで
セレクタの一分文字だけを変更すれば,複数の情報を取得できます。例えば、

li:nth-child(2) に変えれば他の時間も取得できます。(カッコ内の数字を変えただけ)
変数をセレクタの文字列の中に使用するとうまく動作するのですが、セレクタ全文を記載していると修正とか複雑化してしまいます。(コードが長い)

dim i as long
for i = 1 to 10

li:nth-child(" & i & ") >

.FindElementByのあとの記述を簡易にできないでしょうか?

Sub test1()

    Dim driver As New Selenium.WebDriver
    driver.Start "chrome", "https://www.yomiuri.co.jp/"
    driver.Get "/"
    Dim txt As String
    Dim i As Integer
    For i = 1 To 10
    txt = driver.FindElementByCss("body > div.layout-contents > div.layout-contents__main > div > div.home-main-news-organization.p-category-latest > section > ul.p-category-latest-sec-list.p-list.p-list-col2 > li:nth-child(" & i & ") > article > div > div.c-list-date > time").Text
    Range("A" & i) = txt
    Next i
    Set driver = Nothing
End Sub

< 使用 Excel:Office365、使用 OS:Windows10 >


 取得対象がよくわかっていませんが、
    Dim e As Object
    For Each e In driver.FindElementsByClass("c-list-date")
        i = i + 1
        Range("A" & i) = e.Text
    Next
 ではダメですか?

(γ) 2020/07/20(月) 23:05


(y)さん
ありがとうございました。
以下記載内容で動きました。
前に投稿したマクロだと変数iをどこまで取得すべきかと、どのように取得すべきかと憂鬱でしたが
(y)さんのマクロでそのような心配もなさそうですね。危うく、li:nth-child(i)のiの最大値をinstr関数やなんやらを駆使するとこでした。救われました。

Sub tintin()

    Dim driver As New Selenium.WebDriver
         driver.Start "chrome", "https://www.yomiuri.co.jp/"
         driver.Get "/"
    Dim txt As String
    Dim i As Integer
    Dim e As Object
    For Each e In driver.FindElementsByClass("c-list-date")
        i = i + 1
        Range("A" & i) = e.Text
    Next e
    Set driver = Nothing

End Sub

ところで、あの長い長文をFindElementsByClass("c-list-date")の"c-list-date"で集約できたのはなぜですか?xpathの途中の要素が異なっていても大丈夫なのでしょうか?

(たまご) 2020/07/20(月) 23:56


 Dim e As WebElement
 ときちんと宣言すべきでしたか。

 一般的な話として、要素の取得で真っ先に考えるのは、
 FindElementsByClass
 FindElementsByTag
 FindElementsById
 FindElementsByName
 などで、これで取得できるなら、簡単だし高速のようです。

 それでできなければ、構造を調べてから
 FindElementsByCss
 FindElementsByXPath
 や、その他、属性や値をチェックしながらの検索、
 さらには一つの要素からの関連で探すといった方法を
 とるのではないかと思います。

 # 以前にSelenium関連で質問された方なのかな。
 # 継続的に質問されるなら、同一HNのほうが双方にメリットがあると思います。
 # 別人なら失礼。
(γ) 2020/07/21(火) 10:13

(y)さん、

VBAのスクレイピング関連の情報が少なく、少しでもご存じの方の情報をいただけるのは非常に助かります。
利用するブラウザによっても情報が異なってくるので、ChormeやSeleniumを使用してとなると同じようなWEBブログばかり検索に引っかかり、情報元が限定的になってしまいます。
もう本か何かを買おうとしても、IEブラウザの本しか出版されていないんですよね。IE古くてサポート終了ですし・・・

IEでのマクロの組み方とcrhomeでのマクロの組み方の原理は同じみたいなので、応用して行くしかないのですが、「かゆいところに手が届かない」みたいなことが多く時間だけが消費されるんですよね。一次情報の焼き増しサイトが多いですし、マクロを組む者が時間を浪費という矛盾しか生まないです。しかも動くマクロは生まれないですし。

xPath等の情報を得られたのもPythonのサイトでしたし、結局、私の情報へのアプローチの仕方が下手くそなんですよね。そういう者にとって、こうしたら動くよみたいな助言は感謝しかないです。ありがとうございました。

 >># 以前にSelenium関連で質問された方なのかな。
 >># 継続的に質問されるなら、同一HNのほうが双方にメリットがあると思います。
 >># 別人なら失礼。
全くの別人でございます。以前に投稿されていた質問を見てコピペしていたので、フォーマットが似ていただけです。
(たまご) 2020/07/21(火) 12:40

追記、かつ余談です。

SeleniumBasicをダウンロードした際に
同梱されてくる Selenium.chmというヘルプファイルが有用です。
その存在に案外気づいていない人が多いんじゃないかなと思います。

ところで、上記の書き込みで、深く考えずコピーペイストしてしまい、
今読み返したら、なんでFindElementsByIdなんだよ、と思いましたが、
なんと、FindElementByIdの他にFindElementsByIdというのも両方あるんですよ、
知らなかった。

同様に、FindElementsByClassの他に、FindElementByClassもあるんですねえ、
単数形は最初に見つかったものだけを返す仕様のようです。
これも知らなかった。

まったくの余談でした。

(γ) 2020/07/21(火) 12:50


(y)さん

ご返信ありがとうございます。今、Selenium.chmを見ていたのですがなかなか使えそうでした。こんなのがあるとは存じていませんでした。ただ、英語版でした。日本語版も探さないといけないですね。ただ、以下パスの中に
%USERPROFILE%\AppData\Local\SeleniumBasic\Examples\
サンプルデータがありました。ログイン時に入力するパスワードのキャッシュデータの操作スクショ保存、ログインボタンを要素取得とかせずにメソッド等から実行できるみたいなので見てみる価値はありそうです。
新たな発見できました。これだけでも非常に有用な情報です。VBSとかもあったのでもうエクセル開かずにウェブスクリプトできそうです。
(たまご) 2020/07/21(火) 14:08


Examplesフォルダは有益ですね。ご存じかと思っていました。
英語でも余り難しいことないので、コード例とか見るだけでも十分使えますね。

日本語翻訳されたSelenium.chmは見たことないですね。
必要ならDeepLにでも掛けて翻訳するとよいかもしれませんが、
翻訳するとバグが混入しますし、見るところは限られているでしょう。

(γ) 2020/07/21(火) 14:55


(y)さん

ご返信ありがとうございます。英語版の説明書をわざわざ読む気にもなれませんしね。
ただ、わかりにくいwebサイトを見ているよりかは有益かもしれないです。

誤字脱字多くて恥ずかしいのでそろそろ御暇します。この度は、大変助かりました。ありがとうございました。
(たまご) 2020/07/21(火) 15:46


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.