今回はいよいよ、具体的なスクレイピング方法をみていきましょう。
前回までで、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メソッドで特定の部分だけ抜き出し、それをプログラム上で整形するのが基本です。
次の記事では、スクレイピングしたデータをエクセルファイルに保存するやり方、を見ていきましょう。