どうもヨスケです。
プログラミングがやりたくて、Pythonを勉強し始めて早くも約1か月です。
コーディングルールはprogate有料コース 1078円/月(税込み)で学習できましたので、これからは、写経!写経!写経でレベル上げ中です!
※「写経」とは:模範解答を書き写しながら解法を習得するできる受験生御用達の勉強法
プログラミング初心者でも大丈夫!Pythonプログラミングでできる「Webスクレイピング」について解説します。
プログラミングを初めて1か月のヨスケでも書ける、簡単なPythonコードで、ニュースサイトのトップニュースを抽出して、テキストで一斉書き出しができるか実験します。
■この記事でわかること ・Webスクレイピングとは何か? ・webスクレイピング技術でどんなことができるのか? ・簡単!Pythonでwebスクレイピングをやってみよう! ・Webスクレイピングをする際の注意事項を必ず押さえよう!
Webブラウザの自動操作プログラムの記事も書きました!こちらもあわせてご覧ください。
Webスクレイピングとは?
Webスクレイピングとは、ウェブサイトから情報を取得し、その情報を扱って(加工して)新たな価値を生み出すことです。スクレイピングとも呼ばれます。
Webスクレイピング技術の活用例
Webスクレイピング技術を活用している事例をいくつか紹介します。
ニュースのまとめサイト
SmartNewsやグノシーなどのニュースアプリは、複数のニュースサイトから定期的に記事情報を取得して、ユーザの嗜好に合わせたニュースを表示するなど
検索エンジン
GoogleやYahoo!の検索エンジンも、検索結果を表示する際に該当のWebページの文章や画像などが見れると思いますが、これもスクレイピング技術を使用したWebサービスです。
市場動向や株価の予測
市場動向予測
あるサイトで毎週公開される売り上げに関する統計データを、公開の都度取得し、データの推移を分析することで今後の数値予測をする。
株価推移予測
株価についてもこれまでの株価推移とインターネット上にある経済ニュースを取得し、AIの株価予測エンジンの入力とすることで、将来の株価予想をサービス展開することが可能です。
Webスクレイピングの注意点
自動で外部サイトの情報を取得することが可能なスクレイピング技術も、使い方によってはサイトの禁止事項に抵触したり、法律違反になることがあります。必ず、スクレイピングを行うWebページがスクレイピングをしても良いものかどうかを確認するようにしてください。
例)Yahoo!ファイナンスのページはスクレイピング処理を禁止しています。
例)高速/連続処理を行うこともあり、サーバーに負荷をかけてしまう懸念あり。
Yahooニュースサイトから主要トピックスを抽出してみよう!
実際にPythonプログラミング歴1か月のヨスケがWebスクレイピングを実現できるのか試してみました!
成果物の確認
Yahoo!ニュースのトップページに、主要トピックスとして8つのニュースが表示されています。
毎日のトピックスが自動でパソコンに溜まっていくことができたら。。。
どうでもよいけど、久保君、ゴールしてる!
「Yahoo!ニュースのトップページから、主要トピックス8ニュースのタイトルとURLを抽出して、CSVファイルにテキスト保存する」プログラムを作成することを目標とします。
準備 環境構築
今回のWebスクレイピングのPythonプログラムを作成するにあたって、「BeautifulSoup」と呼ばれるライブラリを使用しました。スクレイピングのためのモジュール、メソッド(関数)が豊富で、非常に簡単にWebスクレイピングを実現できます。HTMLのコードを解析、自動でタグ付けしてくれます。
PythonがよくWebスクレイピングに適していると言われるのは、このBeautifulSoupがあるからです。
Pythonの環境やBeautifulSoupのセッティングなどは、キノコードさんのyoutube動画を見ていただければ、非常にわかりやすく解説してくれています。
準備 Yahoo!ニューストップページのHTMLソースの確認
BeautifulSoupで抽出・解析をしても、Yahoo!ニュースのhtmlソースのどこに主要トピックスのタイトルとURLが記載されているのかを理解しないと、ほしい情報だけを取り出すことができません。
Google Chromeであれば、該当ページが表示されている状態で「右クリック」➞「検証」を選択すると、htmlソースが表示され、ページ内で該当する箇所が青くハッチングされるので、htmlの知識があまりない人でも容易に確認ができます。
見ると<div></div>で囲まれた範囲が主要トピックスに関連していることがわかります。
さらに詳細に見れば、タイトルとURLが記載されている部分がわかります。
取り出したい情報の場所がわかれば、もうこっちのものです!
いきなりPythonソース全部載せ!
細かい説明は省き、ソースを掲載します。コメントに処理の説明を付けましたので、ソースを見ながら確認してみてください。
#requestsとBeautiful Soup のイン ポート
import requests
from bs4 import BeautifulSoup
#csvのインポート
import csv
#datetimeのインポート
import datetime
#Yahoo!ニュースのURLを変数化
url = "https://news.yahoo.co.jp/"
# このあたりはおまじない!わからなくてもOK! 狙いのURLのhtmlをタグごとに解析します。
response = requests.get(url)
soup = BeautifulSoup(response.content, "html.parser")
# Beautiful Soup の find() で、主要ニュースの部分のみを抽出します。
today = soup.find("section", attrs ={"id":"uamods-topics"})
# 記事のタイトルとURLがある部分を抽出
entries = today.find_all("li")
# CSV出力用リスト
today_list = []
index = 1
# あるだけ情報を取得する
for entry in entries:
# "li"の箇所のタイトルに該当するテキスト(ページ上の文章)を取得
title = entry.get_text()
# "li"の箇所のURLを取得
entry_url = entry.find("a").get("href")
# 出力用リストにタイトルとURLを格納
today_list.append([index, title ,entry_url])
# インデックスをインクリメント
index += 1
# 現在時刻を取得
dt_now = datetime.datetime.now()
#結果をCSVファイルに書き出し。ファイル名は現在時刻
with open(str(dt_now.year)+'_'+str(dt_now.month)+'_'+str(dt_now.day)+'_'+str(dt_now.hour)+str(dt_now.minute)+'_NewsTopics.csv', 'w')as file:
writer=csv.writer(file,lineterminator='\n')
writer.writerows(today_list)
コメントを付けまくりましたが、40行程度です。すごく簡単!
実行結果
Pythonプログラムの実行結果です。生成されたCSVファイルの中身を確認します。
主要トピックス8ニュースのタイトルとURLを出力することに成功しました!
まとめ
・Python歴1か月の初心者でもWebスクレイピングの実装が可能です!
・Yahoo!ニュースの主要トピックスのタイトル・URLを自動取得できるプログラムが完成!
・該当ページのhtmlの構成を理解して、取り出したい情報の場所を把握しよう。Google Chromeがおススメ◎
・今後は、毎日同じ時刻にトピックスを取得する方法を調査して、今回のWebスクレイピングプログラムをレベルアップさせていきます。こうご期待です。
Webスクレイピングの勉強に使用した本
今回はprogateの学習が終わっていましたので、新たに下記参考書を購入して学習を進めていました。サンプルコードの位置行一行で何をしているのか解説があり非常にわかりやすかったです。
ご参考まで。