Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10 Home : Excel 2016)
VBAのスクレイピングについて
投稿日時: 21/10/16 13:40:11
投稿者: がんばってる老人

Seleniumに挑戦中の老人初心者です。
あるサイトにアクセスして目的の情報を取得しようとしてエラーになります。
 
Sub Test()
.....省略
 
'目的のページがSelenium.ChromeDriverで表示するところまで正常に動作
 
'スクレイピング開始
Temp = Driver.FindElementByTag("#output > table > tbody > tr:nth-child(1) > td").Text '←エラー
Debug.Print Temp    
 
エラーの内容は、
実行時エラー'7'
No SuchElementError
Element not found for Tag=#output>table.tbody>tr.nth-child(1).td
です。
 
目的の情報の位置(デベロッパーツールで取得)
Copy selecter
#output > table > tbody > tr:nth-child(1) > td
 
Copy outerHTML
<td>&nbsp;C#6</td>
 
Copy js path
document.querySelector("#output > table > tbody > tr:nth-child(1) > td")
 
Copy full Xpath
/html/body/div/div[2]/div[2]/div[2]/div[1]/table/tbody/tr[1]/td
 
ご教示いただければ、幸いでございます。よろしくお願いいたします。
 
 
 

回答
投稿日時: 21/10/16 20:32:35
投稿者: 半平太

これでワークしないですか。
 
Temp = Driver.FindElementByXPath("/html/body/div/div[2]/div[2]/div[2]/div[1]/table/tbody/tr[1]/td").Text

回答
投稿日時: 21/10/16 21:07:34
投稿者: Touchan

すみません。質問者です。アカウントの情報更新(年齢)をしようとして、ミスしたんでしょうか、ログインできなくなってしまい。新しくアカウント取得しました。「がんばってる老人」ですがあたらしく「Touchan」で登場しました。
ご教示ありがとうございました。Xpathは既に試しましたが同じエラーがでています。
実際のURLを記載します。’https://www.petitmonte.com/labo/zettai-onkan/
あと、pythohでは情報を取得できています。
!pip3 install helium
from helium import *
#絶対音感のURLにアクセス
driver = start_chrome('https://www.petitmonte.com/labo/zettai-onkan/')
手動で「許可」をクリック
#TDタグを検出
    _items = find_all(S('td'))
    items = [_item.web_element.text for _item in _items]
    #items[0]= コード items[1]= 音階(鍵盤) items[2]=周波数
    print(str(items[0]))
結果:C3
 
どうしても解決したくて投稿いたしました。よろしくお願いいたします。

回答
投稿日時: 21/10/16 22:45:11
投稿者: 半平太

「開始」ボタンをクリックした後の話なのかなぁ・・と言う気がしていますが、
 余り深入りしたくないので、申し訳ないですが私はここまでとします。

回答
投稿日時: 21/10/17 00:03:55
投稿者: simple

されようとしていることが説明不足でよくわかりません。
勝手に推測を重ねて、こういうことですか?

Sub test()
    Dim driver As Selenium.WebDriver
    Dim url As String
    
    url = "https://www.petitmonte.com/javascript/musical_scale_frequency.html"
    Set driver = New Selenium.WebDriver
    driver.Start "chrome"
    driver.Get url
    driver.FindElementsByTag("table")(2).AsTable.ToExcel [Sheet1!A1]
End Sub

回答
投稿日時: 21/10/17 06:11:27
投稿者: simple

想定場面が違っているかも知れませんが、なんらかの参考になれば幸いです。
追加して参考となりそうなことをメモしておきます。
 
●(ヘルプの利用)
SeleniumBasicをインストールしたフォルダに、
Selenium.chm というヘルプファイルがあります。
これを常に参照するとよいと思います。
 
●(要素参照の各種の方法)
DOMの各エレメントを参照するには、大別して、
・FindElementById Method とか、FindElementByTag Methodなどの伝統的なもの、
・CSSを使った参照
・XPATHを使った参照
などがありますが、上から順次トライされたほうがよいと思います。
最初のものは比較的シンプルで、動作も安定しているそうです。
下の二つは、動作が不安定なこともあるので、後順位にしたほうがよさそうです。
 
また、FindElementByTagとFindElementsByTagなど、単複で意味が明確に違ってきますので
注意が必要です。
 
なお、
FindElementByTag("#output > table > tbody > tr:nth-child(1) > td")
と言うコードは、
"#output > table > tbody > tr:nth-child(1) > td"
自体がTagではないので不可ですね。

回答
投稿日時: 21/10/17 08:57:09
投稿者: Touchan

半平太様
>「開始」ボタンをクリックした後の話なのかなぁ 
SetCursorPos 390, 206
mouse_event 2
Sleep 100
mouse_event 4 で「許可」ボタンをおしてます。
「許可」をおせば「開始」を押さなくても音階表示が開始されます。
さらに音階表示が完全に表示されるまで
Driver.Wait 2000 で待ちを入れています。
 
simple様
説明が拙く申し訳ありません。
目的のぺージ(https://www.petitmonte.com/labo/zettai-onkan/)
へアクセスして「許可」ボタンを押して表示されるコード、音階、周波数を取得したいと思ってます。
それぞれの位置はデベロッパーツールのCopy selecterで取得しました。
#output > table > tbody > tr:nth-child(1) > td
#output > table > tbody > tr:nth-child(2) > td
#output > table > tbody > tr:nth-child(3) > td です。
 
>"#output > table > tbody > tr:nth-child(1) > td"自体がTagではないので不可ですね。
この辺が勉強不足でわかっていません。
FindElementByTag 以外 ByClassやCssやIdなど色々あるのはわかっているのですが何を使ってよいのわかりません。
 
目的の位置の周辺のソースは次の通りです。
 <div id = "output">
    <table>
      <tbody>
        <tr>
          <th style = "width:120px;">コード</th>
           <td>&nbsp;G5</td>
        </tr>
        <tr>
          <th style = "width:120px;">音階(鍵盤)</th>
           <td>&nbsp;<ソ(59/88)/td>
        </tr>
        以下省略 
    の中の「G5」や「ソ(59/88)」を取得したいのです。
 
よろしくご指導いただけますようお願いたします。
 
 

回答
投稿日時: 21/10/17 12:24:02
投稿者: simple

私の環境では、「許可」という表示すら出ないのです。
私の提案の"table"タグをごっそり取得してしまう手も、まったく無視されていますし、
これ以上時間を掛けるインセンティブがわきません。
>この辺が勉強不足でわかっていません。
HTMLを復習されることではないですか?
頑張って下さい。

回答
投稿日時: 21/10/17 19:34:12
投稿者: Touchan

皆様に色々ご指導いただき、お世話になりましたが、結局むりでした。
どうしても必要なため、やむを得ずとんでもなく泥臭い方法で情報取得を実現しました。
なんの参考にもなりませんが、何かのまじないにしてください。
 
TEMP = driver.PageSource 'ページ全体のソースを取得
WORK = Split(TEMP, "<td>&nbsp;") '目的情報直前の記述でSplit
       
        Debug.Print Mid(WORK(4), 1, InStr(WORK(4), "<") - 1)
        Debug.Print Mid(WORK(5), 1, InStr(WORK(5), "<") - 1)
        Debug.Print Mid(WORK(6), 1, InStr(WORK(6), "<") - 1)
 
ご指導いただいた方々ありがとうございました。
あらためて、HTMLの再勉強とFindElementB....の勉強をしてスマートなプログラムを書けるよう精進します。
なお、質問者のアカウントで入れなくなってしまったので、閉じることができず、申し訳ありません。

回答
投稿日時: 21/10/21 22:00:07
投稿者: simple

解決策ではないのですが、テーマに関する印象を書いておきます。
 
私の古いPCでは感応しなかったのですが、別のPCで内容がわかりました。
【ユーザーの周囲にある「音」に反応して、その周波数、音階をリアルタイムで表示する】
というもののようですね。
 
主たる機能はJavascriptが担っており、Ajax的に特定項目をJavascriptで更新するというものです。
chromeを操作するユーザー側からすれば、
・どのような音が発生するかは自分のコントロール外であること
・項目の更新に伴ってなんらかのイベントが発生するわけでもなさそう(自信なし)
ということなので、目的を達成するのは、大変難しい課題であるという印象です。
 
静的なElementを取得する手法ではいかんともしがたいですね。
一定期間ごとに項目内容を取得するといった方法になるのでしょうか?
 
少なくとも、学習材料としては大変不適当なものであると言わざるを得ないと思います。
もっと基本的なものを材料に学習されることをお勧めします。

回答
投稿日時: 21/10/21 23:38:48
投稿者: Touchan

simple様 再度のアドバイスありがとうございました。
今回の挑戦の目標は、サウンドの設定をステレオミキサーにして、
(外部雑音削減)音楽ファイルを再生して、このサイトで時系列に
音階を取得します。
 
取得した音階をシート上に記録、また取得時刻 (Timer関数)も同時に
取得・記録します。
 
最終目標は、その曲の楽譜を自動作成しようとしています。
 
泥臭い方法ではありましたが、現在、音楽を再生してその音階を連続
して取得することはできました。
 
いま楽譜作成プロセスに入っています。
なんども、本件にかかわっていただきありがとうございます。
今回の件に限らず、今後ともよろしくご指導いただければ幸甚でご
ざいます。ありがとうございました。

回答
投稿日時: 21/10/27 03:55:38
投稿者: gorby

>Seleniumに挑戦中の老人初心者です
 
Webスクレイピング目的で、私も昔はSeleniumを使っていましたが、現在は、無料で、より高機能なUiPath Community Editionを使っています。(法人向けと同じ機能を個人であれば無料で使えます)
 
直接の回答ではありませんが、ご参考まで。

回答
投稿日時: 21/10/27 09:28:09
投稿者: Touchan

gorby様 ご指導ありがとうございました。
さっそく調べて挑戦してみたいと思います。

トピックに返信