3コマンドラインにURLが出力されたら成功です。このように属性にアクセスして取得することが可能です。classをコマンドラインに出力してみてください。category-1が出力されたら成功です。ヒント:書き足すだけではなく、階層を上げて属性を取得してみましょう。配列で回す次は要素を配列に入れて操作してみましょう。以下のように書いてみましょう。3ブログTOPに表示されている記事すべてのタイトルがコマンドラインに出力されたら成功です。次はURLを配列に入れて表示させてみましょう。3コマンドラインにURLが10個出力されたら成功です。演習titlesという配列を宣言し、記事タイトルを10個titlesに格納した後にすべて出力してみましょう。ヒント:配列をeachで回して1つずつ出力してください。デバックデバックはプログラミングで超重要です。マスターしてください。pryというgemもありますが、今回は標準で入っているdebugを使ってみます。先程のコードの中にデバックを入れてみます。3以下のようにコマンドラインに出力されて止まりますね(rubyのバージョンが違うと表示のされ方が違います)。'a').attribute("href")(rdb:1)配列のeachの最初で動きが止まった状態です。入れて実行してみましょう。ページの一番目の記事タイトルが表示されますね。打ち込んでみてください。コードを1行進めることができます。実行したら後はEnterキーを叩くたびに1行ずつ進んでいきます。入力してみてください。先程と違うタイトルが表示されるはずです。このようにコードを途中で止めてコードを実行することができます。これはseleniumを実行するのに非常に重要なスキルになりますので、是非習得してください。叩くとデバックを抜けられます。qとyで抜けないとコードを実行できないので必ずデバックを抜けるようにしてください。演習urlsのeachの中にdebugを入れて変数urlの中身をコマンドラインに出力してみてください。cでコードを再開させたり、デバックを抜けてみてください。ページャの移動ここまででそれなりにスクレイピングできるようになりましたね。ページャをクリックしてページ移動し、最後のページまでURLを収集してみましょう。page-numbers”」となっていますね。以下のようにコードを書き換えてください。(Selenium::WebDriver::Error::InvalidSelectorError)というエラーが出て落ちてしまいます。これはclassというセレクターの中では複合クラス名は使えませんというエラーです。2つのクラスがあるので、エラーになってしまいました。いう時はnextかpage-numbersのどちらかだけを使えばよいと思うのですが、チュートリアル3でやったようにclassは複数の個所で使われている可能性があります。いう時はxpathを使ってみましょう。XPathがいう項目があります。ここをクリックすることでxpathが取得できます。先ほどのコードを修正しましょう。3実行すると2ページ目が表示されましたね。演習2ページ目に表示されている記事のURLをコマンドライン上に出力させてみてください。ループとブレイク先程の演習ではどのようにコードを書きましたか?こういう風に書いた人もいるのではないでしょうか。3これでもいいのですが、もしページが100ページくらいあった場合、コードがべらぼうに長くなってしまいます。そこでループとブレイクを使ってURLを収集してみましょう。以下のように書き換えてみてください。3プログラミングっぽくなってきましたね。if文とloop文とeach文が出て来るなんてかなりプログラミングっぽいです。8行目から18行目までがループされています。16行目でbreakされています。9行目から11行目までが表示されたページでURLをurlsに格納しています。13行目では次のページにいくリンクが表示されているかをチェックしています。find_element”s”になっていることに注意です。先ほどとxpathが違うことにも注目です。先ほどのxpathだと1ページ目と2ページ目を永遠に行き来するようになってしまっていました。チュートリアル7でclassを見た時にnextとpage-numbersの2つがスペース区切りで入っていましたね。それをそのままclassで書くとエラーになってしまいました。このようにxpathで表現することによって正常に動作するようになります。これは呪文みたいなものなので覚えておいてください。このブログでもxpathを利用する場合のtipsの記事があるので参考にしてください。xpathについてのtipsさて、話を戻しますが、find_elementsにてこの要素の数を数えて、1以上だった時に14行目に入り、0だった時に16行目でloopをbreakしています。14行目ではfind_elementでページャの要素にアクセスし、clickでクリックしています。これでページを遷移することができます。クリックした後はまた9行目に戻ってURLを収集し、今度は次のページへいく要素がないのでbreakしてloopを抜けています。あとは20~22行目で集めたすべてのURLをputsしていますね。これだけでこのブログのすべての記事のURLを収集することができてしまいました。記事のURLではなく、タイトルの文字列を収集してコマンドライン出力してみましょう。各ページへのアクセスすべてのURLを収集することができるようになったので、今度はそのURLたちにアクセスしてみましょう。以下のように書き換えてみてください。3すべてのURLにアクセスしていますね。要素のクリックや各ページへのアクセスをしてみるとその動きが高速であることがわかったと思います。高速だからこそ、要素が現れる前にクリックしてしまったりしてエラーになってしまうことがあります。そこでwaitを使ってみましょう。以下のようにページを遷移した後に要素が現れるまで待つというコードを追加します。3driverの宣言の下でwaitを宣言しています。wait.untilの中に書いてあることがtrueになるまで待つ、つまりclass=”post”が現れるまで待つということになります。要素が表示されるまで待つとなると以下のようになります。}sleepで待つのではなく、waitを使った方が良いという記事を本ブログで書いていますので、こちらも読んでみてください。要素を待つ時にsleepを使うのはオススメしない演習ページャをクリックする際にページャが表示されるまでwaitするというコードを追加してみてください。CSVに書き出すさあスクレイピングの仕上げです。各ページで表示されている要素をCSVに書き出しましょう。以下のように書いてみてください。|file|file.write(csv_file)end1行目でcsvライブラリを呼び出しています。これを呼び出さないとselenium-webdriverと同様にcsvライブラリを使用できません。3行目ではbomを宣言しています。Mark」の略で、UTF-8形式でcsvを作った際にbomをつけていないとエクセルで開いた時に日本語が文字化けしたりしてしまいます。日本語を扱う際はbomをつけましょう。4~6行目では宣言したbomを使ってcsvオブジェクトを作っています。csvファイルではなく、ここではまだオブジェクトです。3行目ではNo、Title、URLという列を作っています。8~10行目では先程作ったcsv_fileというオブジェクトをresult.csvに書き込んでいます。ようにするのですが、csvオブジェクトを書き出すためにFile.openになっています。今まで書いたコードと合体させて、csvファイルに各ページのタイトルとURLを書きだしてみましょう。以下のように書き直してください。1end実行するとresult.csvが出力されますね。これがスクレイピングの力です!35行目でtitleに記事のタイトル、36行目でpage_urlに記事のURLを格納しています。変数urlに記事のURLが入っているのですが、あえて現在のページのURLを取得する関数を使用してみました。37~39行目でresult.csvに追加しています。addの略で、行を追加していくという意味になります。38行目で行にNoとTitleとURLを書き込んでいます。1しているので、次に入ってくるiはプラス1された数値になっています。演習csvファイルに「selenium」というカラムを追加して、各行で「最高」という文字列を決め打ちで出力してみてください。webdriverの広い範囲を身につけられたということになります。自分でいろんなサイトで試してみることで実力があがっていくと思います。‘s’).send_key(“selenium”)というコードを実行するとブログの右上のサーチボックスにseleniumという文字が入力されたり、できることはたくさんありますよ!seleniumをやってみたいという方がいたら是非この記事を紹介してあげてください。最後までお読みいただきましてありがとうございました。コメントをキャンセルメールアドレスが公開されることはありません。date*日本語が含まれない投稿は無視されますのでご注意ください。コメントデータの処理方法の詳細はこちらをご覧ください。