seleniumが使いたい人 in Python

# 初めに
スクレイピングがしたくてプログラミング始めました～
って人はそうおらんだろうｗ
わかんない。いたらごめん。コメントしてねｗ。

さて、今回はスクレイピング（selenium君使う）についてです。
なんでこんなこと書くかといいますと、そこらの記事が古いからです。
「コピペしてやってんのに動かね～～～怒怒怒」ってことばっかだったので、結局公式ドキュメント（最低限）を見てなんとなくしか理解できていません。

# スクレイピングってなんや～
「スクレイピング」といいますが、正しくは「webスクレイピング」です。
webスクレイピングとは、皆さんが今もご覧になっているような、webサイトから、そのサイトの情報を（情報といっても、膨大な量の）自動的に取得するものです。


-
- 初めに
- スクレイピングってなんや～
- スクレイピングの需要
- 環境を作る

# スクレイピングの需要
クラウドワークス（というサイトです。）でスクレイピングの案件に絞り込みをかけますと、現時点で多分２３件の案件がありますね。（実際にちまちま数えたのではなく、ブラウザコントロール上でコードを書いたので、「多分」です）。
というように、それなりに需要はあるものです。
案件があるといっても、実際にはただ単にデータを取得するだけではなく、そのためのツール開発も必要になってきたりします。

# 環境を作る
今回はPythonを使いますので、それは確認されたし。
では、まず絶対必要ですので、selenium君ダウンロードしましょう！
[selenium君がいるところ](https://pypi.org/project/selenium/)に生きましょう！
・・・行きましょう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674822/d41a5e93-54f2-40b7-eb75-4c47842e8022.png)

はい、いけました～♪
で、selenium 4.17.2（あなたが見てるときはもっと新しいかも）とか書いてあるやつの下にpip install seleniumというコマンドが書かれているので、コピーボタンを押して、コマンドラインにペースト、で、ENTER！
これでselenium君は好きなように使えます！（わ～い）

続いて「driver」をダウンロードします。
driverは、簡単に言ったら、ブラウザ（ChromeとかFireFoxとか）を操作するやつです。
こいつも絶対に必要。

まず、[こいつがいるとこ](https://googlechromelabs.github.io/chrome-for-testing/)へごー。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674822/e2e8a76d-fb47-79fd-eb83-b6179a1a06d6.png)

はい、いけました。で、下にスクロールしていただきます。

すると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674822/69a18951-2b30-4035-3d26-388bfbc22a26.png)

って感じなのがあるので、このStable（安定したって意味）の欄のを使います。

:::note warn
それで、まだChrome持ってないわぁというひとは、[普通にChromeダウンロードするとこ](https://www.google.co.jp/chrome/)でダウンロードしてください。
:::


で、わき役A（適当に言ってるだけです。ちゃんと必要なヤツです。）のdriverをダウンロードします。
表のBinaryって書いてある欄の、chromedriverです。あなたのPlatform（環境）がwindowsかmacかlinuxかまた別物かは分かりませんが、あなたに合ったものを選んでください。
私はwindowsなので、そうやって進みます♪

で、URL欄のurlコピーして、そのページを開くとdriverさんがダウンロードされますので、少々お待ちください～♪

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674822/4f928486-a6b0-6e1b-24ff-5e8f7237597c.png)

ダウンロード出来ましたので、そのzipファイルを任意の場所に回答します。
そして、chromedriverさんを環境変数PATHに追加します。

以上で必要な人たち（selenium & chromedriver）を私達は手中にしました（わっはっは）

:::note info
- さらっと書きましたが、zipファイルの任意の場所への解凍の仕方については、
[このページ](https://teshi-learn.com/2020-08/beginner-windows10-path-setup/)を参照してみてください。
- さらっと書きましたが、chromedriverさんの環境変数PATHへの追加については、
windowsの方は[このページ](https://teshi-learn.com/2020-08/beginner-windows10-path-setup/)を参考にして環境変数PATHの仕方を理解し、
"任意の場所/chromedriver.exe"
を追加してください！
- その他の方orどうしろっちゅうねんというひとは、ググるor私の記事にコメントいただくor私のメール（[マイページ](https://qiita.com/chi1180)に記載しています）になんか送って頂くとかしていただくとokです。
:::

# コードを書いていく
あ～疲れた。
そうです、環境を作っていくのはめんどくさいんです。
じゃ、今からコードを書いていきましょう！ちなみに私のPythonのバージョンは3.10ですね～

まず、基本的なものから始めましょう。
下記のコードは、QiitaをChromeで開くだけのシンプルなコードです。

```python:超シンプルコード
from selenium import webdriver  # selenium君からwebdriverをインポート

driver = webdriver.Chrome()  # webdriverをChromeのヤツで使います。

url = "https://qiita.com/"  # 今回はQiitaのホームページにしています。
driver.get(url)  # driverがurlのページを開きます
```

実行したら、Chromeのウィンドウが開かれ、Qiitaのページが開かれ、閉じられるはずです。
開かれたらすぐに閉じてしまうので少しわかりにくいかもです。

:::note warn
driver = webdriver.Chrome()
は、よく
driver = webdriver.chrome()
に書き間違えられます。エラーになるので注意して！
:::

このコードだけではスクレイピングもなにもないですね。
では、ちゃんとしたコードを書いて、モノを作っていきましょう！
最終的に、Qiitaのホームページに表示される記事のタイトルとその記事のurlを取得していくものを作っていきましょう！

解説は大変だ！そうだ！コメントで適当にしてしまえ！
というわけで、皆さん頑張ってください。

```python:これができればまあ何とかなるだろう
from selenium import webdriver  # selenium君からwebdriverをインポート
from selenium.webdriver.common.by import By  # webページの要素の選択に必要なヤツです。インポート！
from selenium.webdriver.chrome.options import Options  # chromeを動かす際にオプションをせっていするのに使います。インポート！

driver = webdriver.Chrome()  # webdriverをChromeのヤツで使います

url = "https://qiita.com/"  # QiitaのURL
driver.get(url)  # driverでURLのページを開きます

# ブラウザコンソールで確認すると、
# それぞれの記事は、class="style-l2axsx"であり、
# 記事のリンクは、記事内で探すaタグの一番最初のもの.hrefで、
# 記事タイトルは、記事内で探すh2タグの.innerTextで取得できます

# 記事のタイトルを入れる配列
titles = []

# 記事のurlを入れる配列
urls = []

# ここから、driverで要素を見つけていきます
# driverで要素を見つけるには、[ driver.find_element ] もしくは、[ find_elements ] を用います
# 前者は単一の要素もしくは初めに見つけた要素のみ、後者は複数の要素を見つけます

# まず、表示されている記事全部を取得します
# クラスでの要素の参照は、driver.find_elements(By.CLASS_NAME, クラス名)　とします
articles = driver.find_elements(By.CLASS_NAME, "style-l2axsx")

# それでは、articlesの全ての記事のタイトルとURLを配列に納めていきます
for article in articles:
    # 要素をタグ名（a, h1, bodyなど）で取得する場合は、
    # driver.find_elements(By.TAG_NAME, タグ名)　とします
    # driver の部分は、その要素が入っている要素でも可能です

    # タイトルはinnerTextなので、[ .text ] で取得します
    title = article.find_element(By.TAG_NAME, "h2").text

    # URLはアトリビュートなので、[ .get_attribute(アトリビュート名) ] で取得します
    url = article.find_element(By.CLASS_NAME, "style-32d82q").get_attribute("href")

    # titles、urlsのそれぞれの配列に、取得したtitle、urlを入れます
    titles.append(title)
    urls.append(url)

# 最後に、記事のタイトルとその記事のURLを出力します
for i in range(len(titles)):
    print(titles[i], urls[i])

# これで終了です！
# お疲れさまでした！コードを実行してみましょう！
```

以上な感じですね！
コンソールは、こんな感じに出力されます（私は今回はPycharmを使用しました）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674822/5cdaeaa0-3d1d-d8dd-b61e-4ca5fd725413.png)


お疲れ様でした！seleniumでのwebサイトの自動操作に関してもっと知りたいという方はググってみると、英語のはそれなりに出てきます。
公式ドキュメント：[一応日本語ですよ♪](https://www.selenium.dev/ja/documentation/)

# CSVファイルの作成の仕方
ここまでで、データの取得はできました。しかし、このままでは単にデータをコンソールに出力するだけであんまり意味なしです。
CSVファイルに出力するコードを作成しましょう！
CSVファイルとは、・・・確か・・・コンマ、セパレータ、バリューズ・・・みたいな感じだったはずです。

それでは、下記のコードを先ほど書いたコードの一番下に追加しましょう！

```python:csvファイルに
# 取得したデータをcまとめる変数
datas = ""

# 取得したデータをcsv形式にします
for i in range(len(titles)):
    datas += titles[i] + ", " + urls[i] + "\n"

# ファイルの作成
# 作成したファイルは、このコードを保存しているディレクトリ（ファイル）に保存されます
with open("datas.csv", "w") as file:
    file.write(datas)
```

上記のコードを実行したら、CSVファイルが作成されてます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674822/74cfb64f-1d16-56df-245a-ccb44b2aeae1.png)

ファイルを開いて、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674822/3be0dd93-3c47-8904-93f7-28022c44a5ad.png)

のようになっていたら、成功です！
お疲れ様でした！！！

# 最後に
今回のように単純なスクレイピングの案件はたぶん存在しません。実際には、複数のサイトを自動で定期的に実行するツールの開発というふうになったり、今回のQiitaのサイトを案件にするとしたら、指定した量の記事のそれぞれのタイトル、URL、タグ、いいね数、ストック数などを定期的に取得し、データを更新するツール、くらいじゃないと案件にはならないかな？と思います。

でも、今回はseleniumの基本的な使い方を知ったと思います。
今回のはあくまで「超基本」です。
実際の案件を内容を見て実際にやってみるのもよいかもしれません！

お疲れ様でした！
そして、最後まで読んでくれてありがとう！
🍫（今日はバレンタインデー♪）