Webスクレイピングの世界へようこそ!
みんな、Webスクレイピングって聞いたことある?簡単に言うたら、インターネット上の情報を自動で集めてくる技術なんや。この技術を使うことで、手動で情報を集める時間を大幅に削減できるんやで。たとえば、毎日同じサイトから商品情報を集めたいとき、手でコピペしてたら気が狂うで。そこで、スクレイピングを使えば、スッと自動でデータを取ってきてくれる!
せやから、これを学ぶことで、データ分析やプロジェクトに必要な情報を効率よく集められるようになるんや。つまり、時間も手間も節約できるってわけやな。さあ、今回はCSSセレクタを使って、どんな要素を抽出できるか見ていこうか!
CSSセレクタの基本概念
さて、まずはCSSセレクタの基本を押さえておこう!これが分かれば、ウェブページのどの要素を抽出するかを指定するのがめっちゃ楽になるで。CSSセレクタは、HTMLの要素を選択するためのパターンを定義するもんや。
基本的なセレクタの種類
-
要素セレクタ
特定のHTMLタグを選ぶ時に使う。例えば、全ての<p>
タグを選ぶには、p
と書くだけや。 -
クラスセレクタ
特定のクラス名を持つ要素を選ぶ時に使う。クラス名の前にドット(.)を付けるんや。例えば、クラス名がexample
やったら、.example
と書くんやで。 -
IDセレクタ
特定のIDを持つ要素を選ぶ時に使う。ID名の前にはシャープ(#)を付ける。例えば、IDがheader
やったら、#header
と書くんや。 -
属性セレクタ
特定の属性を持つ要素を選ぶ時に使う。例えば、href
属性を持つ全てのリンクは、a[href]
と書くんや。
セレクタの組み合わせ
セレクタは組み合わせて使うこともできるで。たとえば、特定のクラスを持つ<div>
タグを選びたい時は、div.example
と書けばOKや。これで、必要な要素をピンポイントで抽出できるようになるんや。
これがCSSセレクタの基本的な概念や!次は、BeautifulSoupを使って実際にセレクタを使った要素の抽出方法を見ていこうな!
BeautifulSoupでのセレクタの使用方法
さて、次はBeautifulSoupを使って、実際にCSSセレクタで要素を抽出する方法について見ていこうか!BeautifulSoupは、PythonでHTMLやXMLを解析するためのライブラリやで。これを使うと、ウェブページの構造を簡単に扱えるようになるんや。
BeautifulSoupのインストール
まずは、BeautifulSoupをインストールする必要があるで。Google Colabでは簡単にインストールできるから、以下のコードを実行してみてな。
!pip install beautifulsoup4
!pip install lxml
ウェブページを取得する
次に、ウェブページのデータを取得するためにrequests
ライブラリを使うで。以下のサンプルコードを見てみてな。
import requests
from bs4 import BeautifulSoup
# ウェブページのURL
url = 'https://example.com'
# ページを取得
response = requests.get(url)
# BeautifulSoupオブジェクトを作成
soup = BeautifulSoup(response.content, 'lxml')
CSSセレクタを使って要素を抽出
BeautifulSoupではselect
メソッドを使って、CSSセレクタに基づいて要素を抽出できるで。例えば、全ての<p>
タグを抽出したい時は、以下のように書くんや。
# <p>タグを全て抽出
paragraphs = soup.select('p')
# 抽出した内容を表示
for p in paragraphs:
print(p.text)
クラスセレクタやIDセレクタも同じように使えるで。例えば、クラスがexample
の要素を抽出したい時は、以下のように書くんや。
# クラスがexampleの要素を抽出
examples = soup.select('.example')
# 抽出した内容を表示
for example in examples:
print(example.text)
こんな感じで、CSSセレクタを使って要素を簡単に抽出できるんや!これで、必要な情報をサクッと取る準備が整ったわ。次は、複雑な構造からの情報抽出について見ていこう!
複雑な構造からの情報抽出
さあ、次はもう少し複雑なHTML構造から情報を抽出する方法について学んでいこうか!ウェブページは色んな要素が絡み合っていることが多いから、複雑な構造でも正確にデータを取るスキルが必要やで。
ネストされた要素の抽出
まず、ネストされた要素を抽出する方法を見てみよう。たとえば、ある<div>
の中に複数の<p>
タグや<span>
タグが入っている場合やな。以下のコードを見てな。
# ネストされた<div>の中の<p>タグを抽出
nested_divs = soup.select('div.nested-class')
for div in nested_divs:
paragraphs = div.select('p')
for p in paragraphs:
print(p.text)
このコードでは、<div>
の中にある<p>
タグを抽出して表示してるんや。select
メソッドを使って、どんどん深い階層までアクセスできるのがポイントやな。
属性を使った抽出
次に、特定の属性に基づいて情報を抽出する方法も見てみよう。たとえば、特定のdata-*
属性を持つ要素を探したい時は、以下のように書くんや。
# 特定のdata属性を持つ要素を抽出
data_elements = soup.select('[data-example="value"]')
for element in data_elements:
print(element.text)
このコードでは、data-example
属性がvalue
の要素を全て抽出して、その内容を表示してるで。属性セレクタを使うことで、特定の条件に合った要素を的確に抽出できるで!
複雑なセレクタを使う
さらに、複雑なセレクタを使って、より具体的な要素を抽出することもできるんや。たとえば、特定のクラスを持つ<ul>
の中の<li>
要素を抽出したい時は、こんな感じや。
# 特定のクラスを持つ<ul>の中の<li>要素を抽出
list_items = soup.select('ul.list-class li')
for item in list_items:
print(item.text)
こうすることで、必要な情報だけを効率よく抽出できるようになるんやで。
これで、複雑な構造からの情報抽出についての基本が分かったな!次は、抽出したデータを整形して保存する方法について学んでいこう!
抽出したデータの整形と保存
さて、次は抽出したデータをきれいに整形して保存する方法について考えていこう!データをそのまま使うこともできるけど、整形して保存することで後から使いやすくなるから、しっかりやっていこうな!
抽出したデータの整形
まず、抽出したデータを整形するためには、リストや辞書にまとめるのが一般的や。例えば、抽出した<p>
タグの内容をリストに保存する場合は、こんな感じや。
# 抽出した<p>タグの内容をリストに保存
paragraphs = soup.select('p')
paragraph_texts = [p.text for p in paragraphs]
これで、全ての<p>
タグの内容がparagraph_texts
というリストに保存されたで。リスト内包表記を使うことで、簡単に整形できるんや!
データの保存
整形したデータをCSVファイルに保存する方法を見てみよう。Pythonではpandas
ライブラリを使うと、データフレームを作って簡単にCSVに保存できるで。まずは、pandas
をインストールしてな。
!pip install pandas
次に、抽出したデータをデータフレームに変換して、CSVに保存するコードを見てみよう。
import pandas as pd
# データフレームを作成
df = pd.DataFrame({
'paragraphs': paragraph_texts
})
# CSVファイルに保存
df.to_csv('extracted_data.csv', index=False)
このコードでは、paragraphs
というカラムを持つデータフレームを作成して、extracted_data.csv
という名前で保存してるんや。これで後から簡単にデータを読み込んで使えるようになるで!
JSON形式での保存
もしJSON形式でデータを保存したい場合は、以下のように書けるで。
# JSON形式で保存
df.to_json('extracted_data.json', orient='records', lines=True)
これで、データがextracted_data.json
というファイルに保存されるんや。JSON形式は、特にAPIとのやりとりに便利やから、覚えておくとええで!
これで抽出したデータの整形と保存方法が分かったな!次は、動的コンテンツの扱い方について基本的な概念を紹介していくで!
動的コンテンツの扱い方(基本的な概念紹介)
さて、最後は動的コンテンツの扱い方についてや!動的コンテンツとは、JavaScriptを使ってページが読み込まれた後に表示される情報のことを指すんや。これらの情報は、通常のHTTPリクエストでは取得できないから、少し工夫が必要やで。
動的コンテンツとは
動的コンテンツは、例えばボタンをクリックしたり、スクロールしたりすることで新しいデータが表示されるウェブページや。これらの要素を取得するためには、単純にrequests
を使っても無理やから、別のアプローチが必要や。
Seleniumを使った動的コンテンツの取得
動的コンテンツを扱うためには、Selenium
というライブラリを使うのが一般的や。Seleniumは、ブラウザを自動操作できるツールやから、JavaScriptで生成されたコンテンツも取得できるんや。まずは、Seleniumをインストールしてみよう。
!pip install selenium
次に、ブラウザのドライバが必要やから、Chromeの場合は以下のようにしてダウンロードする必要があるで。
!apt-get update # to update ubuntu to correctly run apt install
!apt install -y chromium-chromedriver
Seleniumを使ったサンプルコード
では、実際にSeleniumを使って動的コンテンツを取得する基本的なコードを見てみよう。
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
# Chromeのオプションを設定
chrome_options = Options()
chrome_options.add_argument('--headless') # ヘッドレスモード
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
# Chromeドライバを指定
service = Service('/usr/bin/chromedriver')
driver = webdriver.Chrome(service=service, options=chrome_options)
# ウェブページを開く
driver.get('https://example.com')
# 動的コンテンツを取得
content = driver.find_element_by_css_selector('.dynamic-class')
print(content.text)
# ブラウザを閉じる
driver.quit()
このコードでは、ヘッドレスモードでChromeブラウザを開いて、指定したページを表示し、動的に生成された内容を取得しているんや。最後にブラウザを閉じるのも忘れずにな!
注意点
動的コンテンツを扱う際は、ページの読み込みが終わってからデータを取得することが重要や。場合によっては、WebDriverWait
を使って、特定の要素が表示されるまで待つことも必要やで。
これで動的コンテンツの基本的な扱い方が分かったな!動的な情報を取得することで、より多くのデータを収集できるようになるから、ぜひ試してみてな!これで今回の章はおしまいや。お疲れさまでした!
【Pythonで動的コンテンツを扱う】Seleniumを使ったデータ収集の基本と実践例!