こんにちは。キノコードです。
「面倒な「ブラウザ操作」や「データ収集」の作業はPythonで自動化しよう|スクレイピングとは何か?できることや使い方をわかりやすく解説【PythonでRPA】」について説明します。
- Python学習サービス「キノクエスト」のご紹介
- レッスンで使ったファイルはこちら
- はじめに
- 具体的なケース その1
- 実行環境と環境構築
- ライブラリ、パッケージ、モジュール
- seleniumとbeautifulsoupについて
- ChromeDriverダウンロード
- ライブラリのインポート
- GoogleChromeを自動起動
- ページへ移動
- HTMLの要素の調べ方
- テキストの入力
- クリックの動作
- xpathでの要素の指定
- pyファイルで実行
- ソースコードの実行
- 具体的なケース その2
- beautifulsoup4のインポート
- beautifulsoupを使ってHTML解析
- タイトル取得
- <a>タグ取得
- URL取得
- 取得したデータのリスト化
- DataFrameへ変換
- 欠損値除外
- 特定の文字が含まれているか行を抽出
- CSVへの書き込み
- pyファイルでの実行
- Webスクレイピングの注意点
Python学習サービス「キノクエスト」のご紹介
キノコードでは、Pythonを習得するためのPython学習サービス「キノクエスト」を運営しています。
キノクエストには、学習カリキュラムがあり、学習順番に悩むことなく学習を進められます。
月額1,990円と本1冊分の値段です。
キノクエストの特徴は下記の通りです。
- Python学習をしている仲間が集まるコミュニティがある
- 1000問以上の問題を解いてプログラミングを習得
- 環境構築不要ですぐに始められる
- 動画と連動しているので、インプットもできる。
- 月額1,990円で、コミュニティもセット
キノクエストを詳しく知りたい方は、紹介ページをご覧ください。
▼キノクエストの紹介ページはこちら▼
https://kino-code.com/kq_service_a/
それでは解説をはじめます。
レッスンで使ったファイルはこちら
キノクエストでアカウントの新規登録に進み、メール認証を完了します。
ログインした状態(プラン選択画面が表示されます)で下記のボタンをクリックしてください。
はじめに
はじめに、ブラウザを自動操作して業務効率化するケースは、どんなケースでしょうか?
例えば、このようなケースをイメージしてください。
飲食店レビューサイトを複数運営している会社Aがあったとします。
会社Aに勤めるBさんは、毎日、出勤をしてから勤怠システムにログインをしてボタンをクリックしています。
その後、そのBさんは、昨日のアクセス数を調べるために、自社のサイトにログインしてアクセスログをダウンロードをしています。
会社Aは複数サイトを運営しているため、複数のサイトにログインして、アクセスログをダウンロードしています。
もしこの一連のデータ収集業務を自動化できたら、毎月どれくらいの時間を減らすことができるでしょうか。
例えば、1日1時間かかっているとしたら、月20時間くらい、年間で200時間以上くらい減らすことができます。
年間だと約1ヶ月分の労働時間です。
もし自動化できれば、他の業務ができたり、早く帰れたり、有給を取得したりできますね。
この面倒な作業はすべてPythonにやってもらいましょう
こんにちは。キノコードです。
皆さんは会社でブラウザを使ってデータ収集やデータダウンロードの仕事はありませんか?
例えば、自分の会社の特定のサイトからいって、データをコピーしてエクセルに貼り付け。また違うページにいきデータをコピー。それをExcelに貼り付け。などといったことです。
他にも、特定の会員サイトにログインをして、レポート作成のためにCSVやエクセルデータをダウンロード。ダウンロードしたファイルをコピーしてまたExcelに貼り付け。といった行為です。
まさに私がプログラミングを覚える前、やっていたことです。
例えば、毎日1時間の業務であれば、あなたの時給が1500円だとすると毎月3万円。社会保険やその他の経費も含めると5万円以上でしょうか。つまり、年間60万円以上のコストカットになります。見方を変えれば、60万円の利益を作っていることになります。したがって、営業利益が20%の会社なら、その業務効率化によって毎年180万円の売上を作っていることになります。
Pythonを使えばブラウザを使って、データ収集やデータダウンロードなどの業務を自動化できます。
このようにウェブサイトからデータを取得する技術のことを「ウェブスクレイピング」といいます。
Pythonは、このウェブスクレイピングが得意です。
なぜなら、Pythonにはウェブスクレピングに必要なライブラリが豊富にあるからです。
他にも、Pythonを使えば、エクセルを操作したりデータを入力したりすることもできます。また、Gmailなどのメールを使って送信もできます。
したがって、あなたのやっている仕事の一部を、完全自動化もできるかもしれません。
言い方を変えると、Pythonを覚えれば、今流行のRPA、ロボティック・プロセス・オートメーションが実現可能です。
しかも、有料ツールを使う必要はなく、Pythonは完全無料です。細かい調整も可能です。
今のあなたご自身のスキルに、RPAのスキルを付け加えれば、人材としての価値は高まり、年収があがるかもしれません。私は現に、色々な業務を効率化して、会社から評価をしてもらえました。
このレッスンを通して、毎年180万円を売り上げるプログラムを作ってみましょう。
また、実際にご自身の業務を効率化させて、会社での評価につなげましょう。
この動画は、ブラウザを使っての単純作業を効率化したい方、プログラミングを勉強しようと思っている方、プログラミングの基本は勉強したけど使いどころに困っている方に、お役立ちできればと思い動画を作成しました。
この動画では、Pythonによるウェブスクレイピングをデモストレーションのような形でお見せします。
動画で使ったソースコードもダウンロードできますので、それをちょっとイジってカスタマイズすることもできます。
この動画だけでは、カスタマイズできない方や、もっと詳しく勉強したい方のために、
Pandas入門コースというレッスン動画も作りました。
Python超入門コースとPandas超入門コースを学習すれば、業務効率化や自動化が可能になるでしょう。
Python超入門コースとPandas超入門コースのURLを概要欄に貼っておきます。
ご興味ある方はご覧ください。
Pythonを使った業務効率化の動画を今後どんどん出していく予定なので、「チャンネル登録」ボタンを押しておいてくださいね。
新しい動画が更新されたときに通知がいくように、復習をする時に動画がどこにいったかわからなくならないようにチャンネル登録をお願いします。
それでは本編にいってみましょう!
具体的なケース その1
今回、KinoCodeブログに会員専用のページを作りました。
テストアカウントとして、ユーザ名は「test_user」、パスワード「test_pw」を入力してログインしていきます。
そして、ダウンロードボタンをクリックして、ファイルをダウンロードしていきます。
実行環境と環境構築
まず、簡単にPythonを使うために、Anacondaを使っていきます。
Anacondaインストール方法は、Pythonの超入門コースの環境構築編をみてください。
概要欄にURLを貼っておきます。
AnacondaにはJupyter Labがインストールされています。Jupyter Labを起動してみましょう。
ちなみに、Jupyter Labの使い方についても、別動画で説明しています。こちらも概要欄にURLを貼っておきます。
起動方法は、macの場合はターミナル、Windowsの場合はコマンドプロンプトでJupyter Labと入力をしてエンターです。
Jupyter Labが起動しました。
ライブラリ、パッケージ、モジュール
次に、ライブラリをインストールしていきます。
まず、ライブラリとはなんでしょうか?
またライブラリに似たものとして、モジュールやパッケージという言葉があります。
これらの用語を最初に整理をしておきます。
ライブラリとは、よく使う機能・関数をまとめて、簡単に使えるようにしたものです。
そして、モジュールとは、関数やクラスなどを1つのPythonファイルにまとめたものです。
そして、いくつかのパッケージをまとめたものをライブラリといいます。
モジュール、パッケージ、ライブラリは、このよう関係になっています。
厳密に言葉の意味を理解しなくてもオッケーです。
ただ、ライブラリの中にパッケージがあって、パッケージの中にモジュールがあるのだと覚えておいてください。
そして、これらは簡単に使えるようにまとめてあるものだと思ってください。
seleniumとbeautifulsoupについて
ソースコードをみていきます。
さて、Pythonでのウェブスクレイピングは、seleniumというライブラリと、beautifulsoupというライブラリを使うのが一般的です。
この動画では、その両方の使い方を紹介していきたいと思います。
seleniumは、ブラウザ操作を自動化することができるライブラリです。
例えば、ブラウザを使って値をコピーをしたり、クリックをしたり、URLへ飛んだり、入力ボックスに値をいれることができます。
そのため、人がブラウザで操作するかのごとく振舞うことができ、特定のWebページからデータ収集したり、ファイルのダウンロードをすることができます。
そのようなことをするための機能を集めたライブラリが、seleniumです。
beautifulsoupは、HTMLを読み取るためのライブラリです。
ウェブページは、HTMLと呼ばれる言語で書かれています。
beautifulsoudは、このHTMLを読み取って、ページのタイトルを取得したり、URLの部分だけを取得したりすることができます。
それらに必要な機能を集めたライブラリが、beautifulsoupです。
!pip install selenium
それでは、「selenium」をインストールします。
「!(エクスクラメーション)」をかいて、次に「pip」を書きます。そして、「install」、最後に「selenium」書いて実行します。
実行は、シフトとエンターを押せばできます。
これで「selenium」をインストールできました。
次に、beautifulsoupをインストールします。
beautifulsoupにはいくつかバージョンがあるのですが、beautifulsoup4をインストールしましょう。
エクスクラメーションのあとに、pip install beautifulsoup4です。
これでインストールが完了です。
ChromeDriverダウンロード
Webブラウザは「Google Chrome」を使います。
「Google Chrome」を操作できるようにするために、「ChromeDriver」をダウンロードします。
「ChromeDriver」は、「Google Chrome」を操作するために必要なソフトウェアです。
まずmacの設定方法です。
macの方は、「brew install --cask chromedriver」と入力してエンターです。
これはhomebrewというものを使ってインストールしています。
homebrewをインストールしていない方は、必須アイテムなのでこの際、インストールしておきましょう。
homebrewのサイトを概要欄のURLに貼っておきますが、この記述をすればhomebrewのインストールができます。
記述内容はキノコードのブログに貼っておきます。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
次に、Windowsの設定方法です。
まず「Google」の公式ダウンロードサイトにいきます。
Webブラウザの検索欄に「ChromeDriver ダウンロード」を入力します。
ダウンロードページを開きます。
いろいろなバージョンがあります。
現在、利用している「Chrome」のバージョンと「ChromeDriver」のバージョンを合わせる必要があります。
「Chrome」のバージョンを調べてみます。
右上の「Google Chrome」の設定をクリックします。
次に、「ヘルプ」を選択し、「Google Chromeについて」をクリックします。
私が使っている「Chrome」は、〇〇〇です。
同じバージョンの「ChromeDriver」をダウンロードします。
「win32」をダウンロードしましょう。
zipファイルがダウンロードされました。
zipファイルをデスクトップにある「MyPandas」フォルダに展開します。
zipファイルを右クリックして、「すべて展開」をクリックします。
次に、「参照」ボタンをクリックし、「デスクトップ」を選択し、「MyPandas」を選択します。
最後に、「展開」ボタンをクリックします。
「MyPandas」フォルダをみてみましょう。
ファイル(chromedriver.exe)があります。
これでChromeDriverの設定が完了です。
Webブラウザを操作できるようになりました。
それでは、Jupyter Labでコードを書いていきます。
ライブラリのインポート
動画の最初にpipを使ってインストールしたライブラリを使えるようにするため、「selenium」や「pandas」などのライブラリをインストールしていきます。
from selenium import webdriver
import time
import pandas as pd
USER = 'test_user'
PASS = 'test_pw'
「selenium」をインポートしていきます。
まず、「from」書いて、「selenium」を書きます。
次に、「import」を書いて、「webdriver」を書きます。
「from」を書くと、モジュールの中の関数やクラスを指定してインポートすることができます。
import time
次に、「time」をインポートします。
timeには、経過時間を記録したり、処理を一時停止したいときに使います。
「import」を書いて、「time」を書きます。
import pandas as pd
次に、「pandas」をインポートします。
Pandasは、データ解析を支援する機能を提供するPythonのライブラリです。
Pandasには、PythonでExcelやcsv操作、グラフ化、人工知能開発で大切なデータの集計や加工などの機能が入っています。
今回は、ウェブスクレイピングで取得したデータをエクセルデータなどにまとめることができます。
「import pandas as pd」を書きます。
「as」は、ライブラリ名(pandas)を好きな名前にすることができます。
したがって、今後、「pd」という名前で「pandas」を使えることができます。
次にログインするサイトのIDやUSER名、パスワードを変数に格納しましょう。
今回、USER名はtest_userです。ダブルクオテーションで括ってUSERという変数に代入しましょう。
次にパスワードです。PASSという変数に、test_pwを代入しましょう。
GoogleChromeを自動起動
browser = webdriver.Chrome(executable_path = ‘C:\\Users\\KinoCode\\Desktop\\MyCode\\chromedriver.exe’) # Windows
browser = webdriver.Chrome() # Mac
次に、Chromeを自動で操作する記述します。
「browser」という変数を書いて、イコールを書きます。
次に、「webdriver」を書いて、ドットを書きます。
つづいて、Chromeを書いて、丸括弧を書きます。
Macの方は、このままで大丈夫です。
Windowsの方は、丸括弧の中に、「ChromeDriver」のパスを書きます。
ChromeDriverをダウンロードしたパスとexeファイルを記述しましょう。(executable_path = ‘C:\\Users\\KinoCode\\Desktop\\MyCode\\chromedriver.exe’)を書きます。
browser.implicitly_wait(3)
次に、「ChromeDriver」が見つかるまでの待ち時間を設定する記述を書きます。
まず、browserを書いて、ドットを書きます。
次に、「implicitly_wait」メソッドを書いて、引数に秒数を書きます。
implicitly_waitメソッドは、指定したドライバが見つかるまでの待ち時間を設定できます。
秒数は、3秒にします。
ページへ移動
url_login = “http://test.local/membership-login/”
次に、キノコードのブログのログインページにアクセスする記述を書きます。
まず、「url_login」という変数を書いて、イコールを書きます。
つづいて、ダブルクォーテーションを書いて、ログインページのURL(http://kino-code.work/membership-login/)を書きます。
「get」メソッドを使うと、指定したurlへ遷移することができます。
そして、browserを書いて、ドットを書きます。
つづいて、「get」メソッドを書いて、丸括弧を書きます。
丸括弧の中に、ブログのURL代入した変数(url_login)を書きます。
最後に、sleep関数を使って、処理を一時的に止めます。
これはjupyter labからpyファイルにしたときに、URLへ遷移する前に下の処理にいかないための記述です。
まず、「time」を書いて、ドットを書きます。
次に、「sleep」関数を書いて、丸括弧を書きます。
丸括弧の中に、一時停止したい秒数を書きます。
秒数は、3秒にします。
ログインページにアクセスしたことが分かるように、print関数でこちら(ログインページにアクセスしました)表示します。
実行してみます。ログインページにアクセスできました。
HTMLの要素の調べ方
element = browser.find_element_by_id(‘swpm_user_name’)
次にテキストボックスに入力していきます。
まずは、ユーザー名またはメールアドレスのテキストボックスにデータを入力していきましょう。
ところで、HTMLの要素には、class名やIDがふられています。
この要素をもとに場所を指定して、データを入力していきます。
要素の調べ方です。
GoogleChromeで右クリック。
検証をクリック。
新しいいウィンドウが開くので、左上の矢印のマークをクリック。
矢印のマークが変わった状態で、調べたい要素をクリック。
そうすると、classやidがでてきます。
今回はidで指定をしてみましょう。
ここのidはswpm_user_nameのようです。
では、このidをもとにコードを書いていきましょう。
テキストの入力
まず「element」という変数を書いて、イコールを書きます。
つづいて、「browser」を書いて、ドットを書きます。
次に、「find_element_by_id」を書きます。
こちら(find_element_by_id)を使うと、HTMLのIDを指定して要素を取得することができます。
つづいて、丸括弧を書いて、シングルクォーテーションを書きます。
シングルクォーテーションの中に、ユーザ名のテキストボックスの要素(swpm_user_name)を書きます。
element.clear()
次に、「clear」メソッドを使って、テキストボックスの要素に何も入っていない状態にします。
今回、キノコードのサイトには、テキストボックスに値が入っていませんが「メールアドレスはこちら」などといったように値が入っている場合があります。したがって、ここでは値をクリアする記述をします。
まず、変数(element)を書いて、ドットを書きます。
つづいて、「clear」メソッドを書きます。
次に、「send_keys」メソッドを使って、ユーザ名のテキストボックスの要素に入力していきます。
まず、変数(element)を書いて、ドットを書きます。
つづいて、「send_keys」メソッドを書いて、引数に「USER」変数を書きます。
次に、パスワードを入力していきます。
HTMLのidを調べてみます。swpm_passwordです。
シングルクォーテーションのところをこちら(swpm_password)書き換えます。
パスワードのテキストボックスの要素も何も入っていない状態にします。
こちら(element.clear())の記述をして、send_keysの記述をします。
send_keysの引数の値を「PASS」の変数に書き換えます。
ここまで実行されたことが分かるように、print関数を使って、こちら(テキストボックス入力完了)を書きます。
それでは実行してみましょう。
値が代入されました。
クリックの動作
browser_from = browser.find_element_by_name(‘swpm-login’)
次に、ログインボタンをクリックするために、HTMLの要素を調べてみましょう。
今回はidがないのでnameで要素を指定しましょう。
まず、「browser_from」という変数を書いて、イコールを書きます。
そして、「browser」を書いて、ドットを書きます。
「find_element_by_name」メソッドを書きます。
こちら(find_element_by_name)を使うと、HTMLのnameを指定して要素を取得することができます。
つづいて、丸括弧を書いて、シングルクォーテーションを書きます。
シングルクォーテーションの中に、ログインボタンの要素(swpm-login)を書きます。
次に、再度処理を3秒止めます。
こちら(time.sleep(3))をコピペします。
最後に、「click」メソッドを使って、「ログイン」ボタンをクリックします。
まず、変数(browser_from)を書いて、ドットを書きます。
次に、「click」メソッドを書きます。
ここまで実行されたことが分かるように、print関数を使って、こちら(ログインボタンを押しました)を書きます。
url = “http://kino-code.work/member-only/”
次に、会員専用ページに遷移して、ファイルをダウンロードします。
まず、「url」という変数を書いて、イコールを書きます。
次に、変数に会員専用ページのURL(”http://kino-code.work/member-only/”)を代入します。
次に、処理を1秒止めます。
こちら(time.sleep(3))をコピペして、引数を「1」にします。
次に、先ほど書いた「get」メソッドの記述をコピペします。
引数を「url」に書き換えます。
xpathでの要素の指定
browser_from = browser.find_element_by_xpath(‘/html/body/div[1]/div[3]/div/main/article/div/p/a’)
次に、HTMLのIDやnameが分からないときに、要素を取得する方法を説明します。
まず、「browser_from」という変数を書いて、イコールを書きます。
次に、「browser」を書いて、ドットを書きます。
つづいて、「find_element_by_xpath」を書いて、シングルクォーテーションを書きます。
シングルクォーテーションの中に、「xpath」を書きます。
「XPath」とは、「XML Path」を省略したものです。
「XML」とは、「HTML」と同じマークアップ言語のひとつです。
なお、「XPath」の取得方法が分からないと要素を取得することができないと思います。
そのため、「XPath」の取得方法も説明します。
例えば、キノコードブログで試してみます。
「朝活もくもく会」の画像の「XPath」を取得してみます。
まず、カーソルを画像にあわせて、右クリックをします。
次に、「検証」をクリックします。
つづいて、「画像」を選択しているところで、右クリックします。
次に、「Copy」を選択し、「Copy full XPath」をクリックします。
テキストエディタなどに貼り付けてみます。
「XPath」が表示されました。
次に、処理を1秒止めます。
こちら(time.sleep(1))をコピペします。
最後に、「click」メソッドを使って、ダウンロードリンクをクリックします。
次に、先ほど書いた「click」メソッドの記述をコピペします。
ファイルがダウンロードされました。
pyファイルで実行
では、今まで書いたコードをPythonファイルにして実行してみましょう。
Pyファイルにしたものがこれです。
ちなみに、Jupyter Labを簡単にPyファイルに変換する方法があります。
Pandas超入門コースのレッスン2で紹介したのでぜひご覧ください。
さぁ実行してみましょう。
全自動でExcelファイルダウンロードできました。
非常に便利ですね!
みなさんもぜひやってみて、業務効率化をしてみてください。
ソースコードの実行
いかがでしたでしょうか?
このように「selenium」ライブラリを使うと、ブラウザを自動で操作することができます。
毎日、どこかのサイトにログインをしてファイルをダウンロードする業務があったら効率化できますよね。
他の動画で、PythonによるExcel操作の解説をしました。これのコードのあとにExcel操作の記述をしたら、サイトへログイン、ファイルのダウンロード、エクセル作業をセットで自動化することができるでしょう
さて、ここまでがレッスンの真ん中です。
キノコードでは、このレッスンで使っているPythonやPandasの入門講座、Webスクレイピングの他にも業務自動化のレッスンを配信しています。
気に入った方は、チャンネル登録をお願いします。さて、次にいきましょう!
具体的なケース その2
それでは、HTMLを解析して、必要なデータを抽出する方法を説明します。
例えば、このようなケースをイメージしてください。
例えば、価格比較サイトを運営している会社Cがあったとします。
会社Cの担当者は、データ収集のために毎日ブラウザを使って販売サイト名とそのURLをファイルにまとめています。
Webサイトでのデータ収集は、単純作業。
たくさんのサイトを調査しているため、毎日約1時間くらいかかっています。
このデータ収集業務を自動化できたら、1か月で20時間くらい削減することができます。
あなたならどうしますか。我慢して単調な作業をしますか。それとも、上司にこの仕事はしたくないと訴えますか。
私なら、この面倒な作業はすべてPythonにやってもらいます。
それでは、Webスクレイピングでのデータ収集を始めていきます。
レビューサイトではありませんが、今回はKinoCodeブログを使います。
Webスクレイピングをして、PythonコースのタイトルとURLを取得していきます。
そして、そのデータをCSVファイルに書き込んでいきます。
beautifulsoup4のインポート
pip install beautifulsoup4
次に「beautifulsoup4」を使ったウェブスクレイピングをみていきましょう。
まず「beautifulsoup4」はこのレッスンの最初の方でインストールしましたね。
「beautifulsoup4」をインポートして使えるようにしましょう。
form、bs4、import、「beautifulsoup4」と記述します。
import urllib.request as req
次に、「urllib.request」をインポートします。
「urllib」は、URLを扱うためのPythonライブラリです。
そして、urllibの中の、requestを使うと、Webサイトにあるデータにアクセスすることができます。
インポートするために「import urllib.request as req」を書きます。
beautifulsoupを使ってHTML解析
html=”””
<html>
<head>
<meta charset=”utf-8″>
<title>キノコード</title>
</head>
<body>
<h1>情熱、熱意、執念</h1>
</body>
</html>
“””
それでは、「BeautifulSoup」を使って、解析していきます。
まずは簡単にHTMLを使って試してみましょう。
例えば、このようなHTMLを「html」という変数に代入したとします。
変数htmlの中身をみてみましょう
体裁が崩れて、よくわかりませんね。
このHTMLを「BeautifulSoup」を使って、解析していきます。
parse_html = BeautifulSoup(html,’html.parser’)
まず、「parse_html」という変数を書いて、イコールを書きます。
次に、「BeautifulSoup」書いて、丸括弧。
丸括弧の中に、先ほどHTMLソースを代入した変数htmlを書いて、カンマを書きます。
最後に、シングルクォーテーションを書いて、「html.parser」を書きます。
「html.parser」は、HTMLを解析するという意味です。
それでは、どのように解析されたかみてみましょう。
変数parse_htmlの中身を表示してみます。
HTMLとして、見やすくなってますね。
print(parse_html.prettify())
これを「prettify」メソッドを使って、さらに、きれいに整理されたHTMLを表示してみます。
まず、print関数を書いて、parse_htmlを書きます。
次に、ドットを書いて、「prettify」メソッドを書きます。
実行してみます。
きれいに整理されてますね。
タイトル取得
さて、ここからが本番です。
キノコードブログをWebスクレイピングしてデータを取得してみます。
仮で作った「Python超入門コースページ」に遷移する記述を書きます。
まず、「url」という変数を書いて、ブログのURL(”http://kino-code.work/python-scraping/”)を代入します。
次に、「response」という変数を書いて、イコール。reqドットurlopenです。
「urlopen」関数は、指定したウェブサイトのHTMLを取得することができます。
この「urlopen」関数を書いて、引数に取得したいウェブサイトのURLを記述します。
parse_html = BeautifulSoup(response,’html.parser’)
では、BeautifulSoupを使ってキノコードをサイトの情報を取得してみましょう。
さきほど、書いた「html」の部分を「response」に変えるだけです。
実行します。
取得したデータを代入した変数「parse_html」をみてみます。
HTMLがたくさんありすぎて何がなんだかわかりませんよね。
HTMLの<title>タグの部分を取得する方法があります。
parse_htmlにドット、タイトルです。
これをprint関数で表示させてみましょう。
HTMLのtitleタグの部分だけが取得できました。
print(parse_html.title.string)
しかし、titleタグもついてきてしまっているので、テキスト部分だけ取り出してみます。
「title」のあとにドットを書いて、「string」を書きます。
実行してみます。
テキストの部分のみ表示されました。
<a>タグ取得
print(parse_html.find_all(‘a’))
次に、URLを取得しましょう。
URLはaタグの部分に記載があります。
<a>タグについて補足します。
<a>タグとは、ページを遷移するために使うHTMLのタグです。
クリックすると、ページ内を移動したり、別のページに飛ぶことができます。
hrefの部分には、移動先のURLを書きます。
<a>の間に書いた部分は、リンクのテキストになります。
ページ内にあるaタグを全て取得します。
find_allで取得できます。
parse_htmlのあとにfind_all。すべてを取得したいタグを記述します。今回はaたぐなのでaをかきます。
printで表示させてみましょう。
すこしわかりにくいですが、aタグが取得できているのが分かります。
1番目のデータがあってわかりにくいので、「title_lists」という変数に先ほど取得した<a>タグのデータを代入して、2番目以降のデータをみてみましょう。
title_listsはリストなので、2番目から11番目のデータをみてみましょう。
リストは1番目は0、2番目は1なので、角括弧の中は、1コロン10です。
リストを詳しく知りたい方は、Python超入門コースをご覧ください。右上にリンクがでているはずです。
さて、実行してみます。きれいにaタグが取得できているようです。
これを先ほど説明をしたStringを使って、テキストのみを取得してみましょう。
title_listsの10を指定して、Stringを記述してみましょう。
タイトルだけがきれいに取得できました。
URL取得
次に、「href」属性のみを取得したいと思います。そうするとことで、URLのデータを取得できます。
title_listsの10を指定して、ドット、「attrs」を書きます。
attrsはアトリビューツの略です。アトリビュートは、英語で属性のことです。
attrsのあとは、角括弧、シングルクオテーションの中に、「href」を書きます。
それでは、実行してみましょう。
URLが表示されました。
URLも取得できたようです。
取得したデータのリスト化
title_list = []
url_list = []
for i in title_lists:
title_list.append(i.string)
url_list.append(i.attrs[‘href’])
タイトルとURLのリストを作成します。
まず、「title_list」と「url_list」というリストを定義します。
for i in title_listsと書いてコロンです。
こうすることにより、リストであるtitle_listsの中身が順次、iに代入されていきます。
for文の中に、まだ空のリストである「title_list」を書いて、ドット、appendを書きます。
pythonの「append」メソッドは、要素を追加することができます。
超入門コースの11、繰り返しでは複合代入演算子を使って要素を追加していきましたよね。
さて、つづいて、アペンドの中にタイトル(i.string)を書きます。
次に、URLも空のリストの「url_list」に追加していきましょう。
先ほどみたように、URLを取得するi.attrs[‘href’]を書きます。
それでは、実行します。
これでタイトルリストとURLリストができたはずです。
実行してみてみましょう。
タイトルが取得できています。
URLも取得できています。
DataFrameへ変換
最後に、タイトルリストとURLリストを1つのデータフレームにまとめて、CSVに書き出してみます。
まず、データフレームを作っていきましょう。
データフレームの作り方はPandas超入門コースのレッスン4で説明しますので詳しく知りたい方はそちらをぜひみてください。
データフレームを代入する変数「df_title_url」を書いて、イコール。
次に、pd、ドットDataFrame。丸括弧の中に辞書型を書きます。
カラム名の「Title」を書いて、データの部分のタイトル名が入っているリストのtitle_listを書きます。
カンマを書いて、URLの部分も同様の記述をします。
それでは、表示してみましょう。
データフレームにまとまりました。
欠損値除外
それでは、TitleのところにNoneという欠損値があるので、除いていきます。
欠損値を除くには、dropnaメソッドを使います。
変数名として「df_notnull」とします。
データフレームの「df_title_url」を書いて、dropna、丸括弧。
丸括弧の中にはhow=、シングルクオテーションでanyです。
これは行に1つでも欠損値があれば削除するという記述です。
ちなみに、allと記述すれば、行のすべての値がnullであったりNoneであったりすると削除するという記述です。
実行してみます。
表示してみましょう。
欠損値がなくなりました。
特定の文字が含まれているか行を抽出
「Python超入門コース」以外の行もあるので、除いていきます。
次に、タイトルに「Python超入門コース」が含まれているかどうか確認します。
特定の文字列を含むか判定するには、「str.contains」メソッドを使います。
「str.contains」メソッドは、特定の文字を含むとき「True」、含まないとき「False」を返します。
他にも、 特定の文字列で始まるものを判定したい場合は「str.startswith()」、特定の文字列で終わるものを判定したい場合は「str.endswith()」を使います。
まず、欠損値を除いたdf_notnullを書いて、角括弧を書きます。
今回はTitleのカラムに「Python超入門コース」という文字列が判定したいので角括弧の中はTitleです。
次に、「str」ドットをcontains「contains」丸括弧。丸括弧の中に特定したい文字列を記述します。
なので、このケースは、「Python超入門コース」です。
2から16までがTrueが表示されました。
データフレームにこのTrueかFalseのブール値を渡すと、Trueの行だけが返ってきます。
やってみましょう。
「Python超入門コース」が含まれる行のみ抽出できました。
では、これをdf_contain_pythonという変数に代入しましょう。
表示させてみます。
オッケーですね。
「Python超入門コース」が含まれる行のみ抽出できました。
CSVへの書き込み
最後に、CSVに書き込みます。
to_csvメソッドを使うと、指定したCSVファイルに値を書き出すことができます。
書き出したいデータフレームのあとにドットを書いてto_csv。
csvのファイル名はoutputとしましょう。なので、output.csvを丸括弧の中のシングルクオテーションの中に書きます。
これで、コードを全て書き終わりました。
それでは、実行してみましょう。
csvファイルができました。
pyファイルでの実行
さて、これをpyファイルにして実行してみましょう。
これが今のレッスンでやったコードをPyファイルに落としたものです。
実行してみます。
一瞬でcsvファイルができました。
URLが仮に1万個あってもあっという間にファイルができるでしょう。
また、これをWindowsのタスクスケジュールなどで時間になったらpyファイルを実行する仕組みを作っておけば、pyファイルの実行すらなくcsvファイルが完全自動でできあがります。
この時間になったらpyファイルが自動実行するやり方については、Windows、Macともに別の動画を作りたいと思います。
チャンネル登録をしてお待ちいただけると嬉しいです。
さて、コードを使ったレッスンは以上です。
Webスクレイピングの注意点
最後にWebスクレイピングの注意点について説明します。
まず、Webスクレイピングは利用規約に違反ケースがあるということです。
利用規約は必ず確認しましょう。
ちなみに、Webスクレイピングは禁止されていてもAPIでデータ取得することが許可されているサービスもあります。
APIを使ったデータ取得の動画も別途作りたいと思います。
次に、著作権に抵触するときです。
例えば、Webサイトに公開している画像に著作権があるとします。
この場合著作権者に許可が必要になります。
したがって、著作権違反にならないように気をつけましょう。
次に、Webサーバーに負荷をかけてしまうときです。
短時間で何度もリクエストを送ってしまうと、Webサーバに負担がかかります。
WebスクレイピングでWebサーバに負荷をかけてしまい、裁判になったケースもあります。
過度な負担をかけないよう注意しましょう。
みなさん、いかがだったでしょう。
このように、Pythonを覚えてコードを書いてしまえば、面倒な作業はPythonとコンピュータがすべてやってくれます。
もし仕事に取り入れたら、生産性を一気にあげることができます。
Pythonを習得して業務自動化に役立ててみてください。
またWebスクレイピングやRPA、ロボティック・プロセス・オートメーションの仕事は、今後はさらにニーズが高まってくると予想されます。
副業として稼ぐことも可能かもしれません。
キノコードでは、業務自動化のレッスンや、PythonやPandasのレッスン配信していきます。
気に入った方は是非チャンネル登録をお願いします。
それでは次のレッスンでお会いしましょう