Tech`s Report

MENU

【初心者向け】Pythonのスクレイピングでyahooニュースのデータを取得する

今回はスクレイピングを行う上で便利であるプログラム言語Pythonを用いて、WEB上にあるデータを取得したいと思います。
 

スクレイピングとは

簡単に言うと、WEBページにアクセスして、WEB上のHTMLの情報を抜き出して取得することを指します。
 
注意事項として このスクレイピング行為が禁止されているWEBサイトがありますのでご注意ください。
 

事前準備

それぞれコマンドプロンプトから下記コードを入力し、スクレイピングに必要なライブラリをインストールしてください。既に下記ライブラリをインストール済の方は不要です。
 

・requestsライブラリのインストール

pip install requests

 
・Beautiful Soupライブラリのインストール

pip install beautifulsoup4

 
そもそもPythonの開発環境を持っていないという方はこちらを参考に無料構築してみてください。
https://yu-report.com/entry/pythonInstall
 
 

スクレイピングを実装しよう

実施すること

簡単な実装例としてよく紹介されているyahooのトップページの主要ニュースの一覧を自動取得する処理を実装したいと思います。

https://news.yahoo.co.jp/

f:id:TechnologyShare:20200823194855p:plain

 

サンプルコード

実装

実際に抽出時に作成したコードは以下の通りになります。

import requests
from bs4 import BeautifulSoup
 
# yahooのサイトから情報取得
response = requests.get('https://news.yahoo.co.jp')

# レスポンスを成形
html = BeautifulSoup(response.content, 'html.parser')

# 特定のキーワードを抽出
for a in html.select('.topicsList .topicsListItem  a'):
 # 出力処理
 print(a['href'], list(a.strings)[0])
結果

プログラム実行後の結果は以下になります。(サイトトップの内容がそのまま出力されてますね)

https://news.yahoo.co.jp/pickup/6369069 東京で212人感染 重症2人増
https://news.yahoo.co.jp/pickup/6369076 東京30℃届かず 24日暑さ戻る
https://news.yahoo.co.jp/pickup/6369073 沖縄に活発な雨雲の帯 警戒を
https://news.yahoo.co.jp/pickup/6369072 中国 ワクチンの緊急投与開始
https://news.yahoo.co.jp/pickup/6369080 緊急避妊薬「薬局販売」に壁
https://news.yahoo.co.jp/pickup/6369079 ムネリン 病気付き合っていく
https://news.yahoo.co.jp/pickup/6369078 コロナ 開場10分前に試合中止
https://news.yahoo.co.jp/pickup/6369067 たんぽぽ白鳥 夫婦でギネス

 

サンプルコードの詳細解説

①requestsライブラリを使用してWEB上のHTMLを取得
# yahooのサイトから情報取得
response = requests.get('https://news.yahoo.co.jp')

get先のURLを任意のアドレスを指定すれば、対象のページの表示情報が取得できます。  
 

②BeautifulSoupを使用してhtml形式にパース
# レスポンスを成形
html = BeautifulSoup(response.content, 'html.parser')

スクレイピングではhtmlの表示情報を元に特定キーワードを抽出するため、BeautifulSoupを使用してhtml形式に変更してあげます。
 

③selectを使用してhtmlから抽出する条件を指定
html.select('.topicsList .topicsListItem  a')

WEBページのhtmlタグを見るとわかりますが、topicsList のtopicsListItem のa要素で抽出すればOKです。(ここはWEBページやキーワードごとに変更する必要があります。)

f:id:TechnologyShare:20200823200313p:plain  
 

④ループして出力
# 特定のキーワードを抽出
for a in html.select('.topicsList .topicsListItem  a'):
 # 出力処理
 print(a['href'], list(a.strings)[0])

selectで取得した内容は配列として返却されますので、for文でそのままループ可能です。

 
以上になります。