いろいろな言語でSeleniumを使う方法を紹介します。ここでは「C#」で検索したときの検索結果1ページ目のタイトルとurlを抜き出します。このとき、広告は無視します。単純にリンクだけを抜き出そうとすると検索結果とはぜんぜん関係ないものも取得されてしまうので少しだけ工夫します。
HTMLを調べてみると検索結果の部分はこのようになっています。実際はもっと複雑ですが、不必要な部分は省略して単純化しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
検索ボックス <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>の間がページのタイトルということになります。
Contents
C#の場合
最初にNuGetで以下をインストールしておきます。
1 2 |
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 |
pip install selenium |
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 |