Pythonと聞けば何を思い浮かべますか?まず出てくるのは機械学習やAIでしょう。それらに加えて、多くの大規模ウェブアプリケーション作りにも使われたりしています。YoutubeとかSpotyfyは実はPythonで作られていたりします。
そんなPythonを今から学びたい初心者の方に向けて、簡単だけど面白く、強力なツールであることを実感できるコードを紹介します。
簡単で面白いウェブスクレイピング
ウェブスクレイピングとはウェブ上にあるデータを機械的に収集することです。Pythonによるウェブスクレイピングのコードは初心者でも簡単に書ける割には、様々なことへ応用できる強力な代物です。
ここでは、某ニュースサイトのトップ記事を収集し、コメントが200件以上ついている記事のヘッドラインを表示するコードを書いてみましょう。
import requests
from bs4 import BeautifulSoup
# 某ニュースサイトのURL
url = 'https://www.yahoo.co.jp/'
# リクエストを送信してHTMLコンテンツを取得
response = requests.get(url)
response.encoding = response.apparent_encoding # 文字化け防止
# BeautifulSoupオブジェクトを作成
soup = BeautifulSoup(response.text, 'html.parser')
# 特定の記事を含む<article>タグを探す
articles = soup.find_all('article', class_='QLtbNZwO-lssuRUcWewbd')
for article in articles:
a_tag = article.find('a')
if a_tag:
# 記事のタイトルを取得
title = a_tag.find('h1').text.strip()
print(title)
さて、以上のコードを実行すると次のようにヘッドラインを抽出することができます。まずはコピペで動作確認してみてください。

ここからは、このコードを解説します。
1. 必要なライブラリのインポート
import requests
from bs4 import BeautifulSoup
requests
: ウェブページの内容を取得するために使用します。このライブラリを使って、指定したURLのHTMLデータをダウンロードできます。
BeautifulSoup
: 取得したHTMLデータを解析し、必要な情報を抽出するために使用します。HTMLの構造を理解しやすい形に変換して、タグやクラスに基づいて特定の要素を簡単に見つけることができます。
まだインポートしていなかったら、pipコマンドでインストールしてください。(詳しくはこちら)
2. URLの定義
url = 'https://www.yahoo.co.jp/'
スクレイピングの対象となるYahooニュースのトップページのURLを指定します。
3. リクエストの送信とHTMLコンテンツの取得
response = requests.get(url)
response.encoding = response.apparent_encoding # 文字化け防止
requests.get(url)
: 指定したURLにHTTP GETリクエストを送信し、そのレスポンスをresponse
変数に格納します。
response.encoding = response.apparent_encoding
: レスポンスの文字コードを、レスポンスから自動的に推測したもの(apparent_encoding
)に設定します。これにより、日本語などの特定の文字が文字化けすることを防ぎます。
4. BeautifulSoupオブジェクトの作成
soup = BeautifulSoup(response.text, 'html.parser')
BeautifulSoup(response.text, 'html.parser')
: 取得したHTMLテキスト(response.text
)からBeautifulSoupオブジェクトを作成します。このオブジェクトを通じて、HTMLの解析や情報の抽出が行えます。第二引数の'html.parser'
は、HTMLを解析するために使用するパーサーを指定しています。
5. 記事の探索とタイトルの表示
articles = soup.find_all('article', class_='QLtbNZwO-lssuRUcWewbd')
for article in articles:
a_tag = article.find('a')
if a_tag:
title = a_tag.find('h1').text.strip()
print(title)
soup.find_all('article', class_='QLtbNZwO-lssuRUcWewbd')
: HTMLから特定のクラス属性を持つ<article>
タグを全て見つけ、そのリストをarticles
に格納します。for article in articles
: 取得した各<article>
タグに対してループ処理を行います。a_tag = article.find('a')
: 各<article>
タグの中から最初の<a>
タグを探します。if a_tag:
:<a>
タグが見つかった場合にのみ、次の処理を行います。title = a_tag.find('h1').text.strip()
:<a>
タグ内の最初の<h1>
タグのテキスト(ニュースのタイトル)を取得し、先頭と末尾の余計な空白を削除します。print(title)
: 取得したタイトルを出力します。
このコードにより、某ニュースサイトのトップページに表示されるニュースのタイトルがコンソールに列挙されます。ウェブページの構造が変わると、セレクタや取得方法を更新する必要がありますので、注意してください。
まとめ
いかがでしたか?これで、シンプルなPythonコードで、データ収集を自動的に行うことができました。Pythonの面白さを体験していただけていたら嬉しいです。