いろいろな言語でSeleniumを使う方法を紹介します。ここでは「C#」で検索したときの検索結果1ページ目のタイトルとurlを抜き出します。このとき、広告は無視します。単純にリンクだけを抜き出そうとすると検索結果とはぜんぜん関係ないものも取得されてしまうので少しだけ工夫します。
HTMLを調べてみると検索結果の部分はこのようになっています。実際はもっと複雑ですが、不必要な部分は省略して単純化しています。
|
検索ボックス <input type="search" name="p" value=""> それぞれの検索結果のタイトルとリンクが表示されている部分 <div class="sw-CardBase"> <div class="sw-Card Algo"> <div class="sw-Card__title"> <a href="url" class="sw-Card__titleInner" > <h3 class="長いので省略">タイトル</h3> </a> </div> </div> </div> |
“sw-Card Algo”となっている部分が通常の検索結果です。この部分が”sw-Card Ad js-Ad”であれば広告であり、”sw-Card AnswerChiebukuro”であれば知恵袋へのリンクです。
そのため<div class=”sw-Card Algo”>と</div>の間を抜き取って、それぞれのhref属性の部分がurl、<h3>と</h3>の間がページのタイトルということになります。
C#の場合
最初にNuGetで以下をインストールしておきます。
|
Install-Package Selenium.WebDriver Install-Package Selenium.WebDriver.ChromeDriver |
そのあと
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
using System; using System.IO; using System.Reflection; using System.Text; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; public class Program { static void Main() { string driverFolderPath = Directory.GetParent(Assembly.GetExecutingAssembly().Location).FullName; ChromeOptions options = new ChromeOptions(); options.AddArgument("--headless"); // Webドライバーのインスタンス化 IWebDriver driver = new ChromeDriver(driverFolderPath, options); // URLに移動します。 driver.Navigate().GoToUrl(@"https://www.yahoo.co.jp/"); IWebElement searchBar = driver.FindElement(By.Name("p")); searchBar.SendKeys("C#"); searchBar.Submit(); System.Threading.Thread.Sleep(3000); var elements = driver.FindElements(By.ClassName("Algo")); StringBuilder sb = new StringBuilder(); foreach (IWebElement element in elements) { IWebElement link = element.FindElement(By.ClassName("sw-Card__titleInner")); string text = link.FindElement(By.TagName("h3")).Text; sb.Append(text + "\n"); string url = link.GetAttribute("href"); sb.Append(url + "\n"); sb.Append("\n"); } Console.WriteLine(sb.ToString()); driver.Quit(); } } |
Pythonの場合
seleniumがインストールされていない場合はインストールしておきます。chrome用のseleniumドライバが必要ですが、C#編の実行ファイルがあるフォルダにchromedriver.exeがあるので、これをPythonのソースファイルがあるフォルダと同じフォルダにコピーしておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
from selenium import webdriver from selenium.webdriver.chrome.options import Options import time from selenium.webdriver.remote.webelement import WebElement def get_result(): options = Options() options.add_argument('--headless') driver = webdriver.Chrome(options=options) driver.get('https://www.yahoo.co.jp/') driver.find_element_by_name('p') search_bar = driver.find_element_by_name('p') search_bar.send_keys('C#') search_bar.submit() time.sleep(2) elements = driver.find_elements_by_class_name("Algo") for element in elements: link_element : WebElement = element.find_element_by_class_name("sw-Card__titleInner") text_element : WebElement = link_element.find_element_by_tag_name("h3") print(text_element.text) url = link_element.get_attribute("href") print(url) print('') driver.close() get_result() |
VBA
これまで使ったことがなかったので大苦戦。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
Option Explicit Sub GetSearchResult() Dim driver As New Selenium.ChromeDriver driver.AddArgument "--headless" 'SeleniumでChromeを使用する初期設定 Call driver.Start("chrome") 'YahooのURLを開く driver.Get ("https://yahoo.co.jp") Dim searchBar As WebElement Set searchBar = driver.FindElementByName("p") searchBar.SendKeys ("C#") searchBar.Submit Application.Wait Now() + TimeValue("00:00:03") Dim elements As WebElements Set elements = driver.FindElementsByClass("Algo") Range("D1") = elements.count Dim index As Integer index = 0 Dim element As WebElement For Each element In elements index = index + 1 Dim link As WebElement Set link = element.FindElementByClass("sw-Card__titleInner") ' Dim text As String ' text = link.FindElementByTag("h3").text Cells(index, 1) = link.FindElementByTag("h3").text Cells(index, 2) = link.Attribute("href") Next element '一時停止(F5を押せば再開して終了する) Stop End Sub |
鳩でも分かるC#管理人からのお願い
できる仕事であれば請け負います。鳩でもわかるC#管理人はクラウドワークスに在宅ワーカーとして登録しています。お仕事の依頼もお待ちしております。
⇒ 仕事を依頼する
コメントについて
コメントで英語などの外国語でコメントをされる方がいますが、管理人は日本語以外はわからないので基本的に内容が理解できず、承認することもありません。それからへんな薬を売っているサイトやリンク先のサイトが存在しないというスパムコメントも多々あります。
Some people make comments in foreign languages such as English, but since the manager does not understand anything other than Japanese, he basically cannot understand the content and does not approve it. Please use Japanese when making comments.
そんななか日本語のコメントもいただけるようになりました。「○○という変数はどこで宣言されているのか?」「××というメソッドはどこにあるのか」「例外が発生する」「いっそのことソース丸ごとくれ」という質問ですが、管理人としては嬉しく思います。「自分が書いた記事は読まれているんだな」と。疑問点には可能な限り答えます。記事に問題があれば修正いたします。
そのうえでお願いがあります。「匿名」という味も素っ気もない名前ではなく、捨てハンでいいのでなにかハンドルネームをつくってほしいと思います。
管理人のモチベーションアップのために
よろしければご支援お願いします。
⇒ 管理人の物乞いリスト