【中級編4】PythonでWebページをスクレイピングしよう

Python入門

今回はいよいよ、具体的なスクレイピング方法をみていきましょう。

前回までで、Webページから情報を抜き出す方法が分かりました。

本記事では、抜き出したデータを整理する方法を解説しましょう。

Pythonの具体的なスクレイピング方法

Pythonでの具体的なスクレイピング方法を解説します。

今回では、Yahoo!ニュースのサイトから、「特定カテゴリのニュースのみをまとめる」プログラムを作っていきます。

以下のStepに分けて、分かりやすく解説していきましょう。

  • Step1.今日のニュース一覧を取得する
  • Step2.「None」を除外する
  • Step3.リンク一覧を取得する
  • Step4.特定のカテゴリのニュースのみ取得する

Step1.今日のニュース一覧を取得する

まず、今日のニュース一覧を取得します。

Yahoo!ニュースのサイトにアクセスしてHTMLを取得し、ニュース一覧の部分だけ抜き出しましょう。

○コード例

import requests
from bs4 import BeautifulSoup

# Webページの情報を取得する
site_data = requests.get("https://news.yahoo.co.jp/topics")
soup = BeautifulSoup(site_data.content, 'html.parser')

# 特定のクラスだけを抜き出して表示
for a in soup.select(".sc-kIPQKe.eMCmdt"):
	data = str(a.string).rstrip()
	print(data)

○実行結果

いつもどおり、getメソッドでアクセスし、BeautifulSoupモジュールでHTML解析しています。

その後、selectメソッドを使って、「class=”sc-kIPQKe eMCmdt”」の部分のみを抜き出しています。

selectメソッドは複数のクラスを使っているものも、抜き出すことが可能です。

抜き出したデータを、string型に変更し、rstripメソッドで不要なものを除外しています。

これで、ニュース一覧が表示されるようになりました。

Step2.「None」を除外する

Step1の実行結果をみると、「None」が混ざっているのがお分かり頂けるかと思います。

こちらを除外する方法をみていきましょう。

○コード例

import requests
from bs4 import BeautifulSoup

# Webページの情報を取得する
site_data = requests.get("https://news.yahoo.co.jp/topics")
soup = BeautifulSoup(site_data.content, 'html.parser')

# 特定のクラスだけを抜き出して表示
for a in soup.select(".sc-kIPQKe.eMCmdt"):
	data = str(a.string).rstrip()
	# Noneを除外する
	if data == "None":
		continue
	print(data)

○実行結果

Noneを除外する方法は簡単です。

if文を使って「data == “None”」に当てはまる場合、スキップすれば良いのです。

if文に関して詳しく知りたい方は、【入門編8】Pythonのif文を使って条件分岐をやってみようを読んでください。

これがNoneが削除され、ニュース一覧のみが表示されました。

Step3.リンク一覧を取得する

ニュース一覧だけでなく、リンクの一覧も取得しましょう。

○コード例

import requests
from bs4 import BeautifulSoup

# Webページの情報を取得する
site_data = requests.get("https://news.yahoo.co.jp/topics")
soup = BeautifulSoup(site_data.content, 'html.parser')

# 特定のクラスだけを抜き出して表示
for a in soup.select(".sc-kIPQKe.eMCmdt"):
	data = str(a.string).rstrip()
	# Noneを除外する
	if data == "None":
		continue
	
	# ニュースタイトルとリンクを表示
	print(data,a.get("href"))

○実行結果

print文を先程から変更しました。

getメソッドに「href」を指定することで、リンクのみを抜き出しています。

これでニュースタイトルとリンクが、スペース区切りで表示されます。

Step4.特定のカテゴリのニュースのみ取得する

最後に、特定のカテゴリのニュースだけを取得するように変更しましょう。

○入力データ

business

○コード例

import requests
from bs4 import BeautifulSoup

# ニュースのカテゴリを入力させる
category = input("ニュースのカテゴリは?:").rstrip()

# Webページの情報を取得する
site_data = requests.get("https://news.yahoo.co.jp/categories/" + category)
soup = BeautifulSoup(site_data.content, 'html.parser')

# 特定のクラスだけを抜き出して表示
for a in soup.select(".sc-kIPQKe.eMCmdt"):
	data = str(a.string).rstrip()
	# Noneを除外する
	if data == "None":
		continue
	
	print(data,a.get("href"))

○実行結果

上記ではinput関数を使い、ニュースのカテゴリをコマンドプロンプトから入力できるようにしています。

たとえば「business」と入力すると、「https://news.yahoo.co.jp/categories/business」にアクセスし、ビジネスのニュースのみを取り出せるようになっています。

これで、自分が知りたいニュースのみを、まとめられるようになりました。

まとめ

本記事では、具体的なスクレイピング方法を解説しました。

スクレイピングとは、こういった手順で行っていきます。

selectメソッドで特定の部分だけ抜き出し、それをプログラム上で整形するのが基本です。

次の記事では、スクレイピングしたデータをエクセルファイルに保存するやり方、を見ていきましょう。

挫折率が高い??プログラミング学習のポイント
駆け出しエンジニアが一緒に学ぶ
CANITは、Progateやドットインストールで独学している人達同士をつなげます。駆け出しエンジニアのあなたのためのSNSです。
Python入門
【この記事を書いた人】
谷津弘樹

某自社開発のIT企業に勤めていた元webプログラマーです。主にサーバーサイド側を担当し、phpを使った開発経験があります。現在は退職しフリーランスライターとして活動中。IT系の記事を主に執筆し生計を立てています。

CANIT
タイトルとURLをコピーしました