[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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
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
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
ご返信ありがとうございます。今、Selenium.chmを見ていたのですがなかなか使えそうでした。こんなのがあるとは存じていませんでした。ただ、英語版でした。日本語版も探さないといけないですね。ただ、以下パスの中に
%USERPROFILE%\AppData\Local\SeleniumBasic\Examples\
サンプルデータがありました。ログイン時に入力するパスワードのキャッシュデータの操作スクショ保存、ログインボタンを要素取得とかせずにメソッド等から実行できるみたいなので見てみる価値はありそうです。
新たな発見できました。これだけでも非常に有用な情報です。VBSとかもあったのでもうエクセル開かずにウェブスクリプトできそうです。
(たまご) 2020/07/21(火) 14:08
日本語翻訳されたSelenium.chmは見たことないですね。
必要ならDeepLにでも掛けて翻訳するとよいかもしれませんが、
翻訳するとバグが混入しますし、見るところは限られているでしょう。
(γ) 2020/07/21(火) 14:55
ご返信ありがとうございます。英語版の説明書をわざわざ読む気にもなれませんしね。
ただ、わかりにくいwebサイトを見ているよりかは有益かもしれないです。
誤字脱字多くて恥ずかしいのでそろそろ御暇します。この度は、大変助かりました。ありがとうございました。
(たまご) 2020/07/21(火) 15:46
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.