みなさんこんにちは。
前回の投稿からかなりの時間が空いてしまいました。というのも、Pythonでやりたいことが見つからず迷走しており・・・そんな私にぴったりの良書を見つけました。
退屈なことはPythonにやらせよう――ノンプログラマーにもできる自動化処理プログラミング
しかしこなすだけでは意味がないため購入は踏み止まり、なんとかやりたいことを絞り出しました。
”Webスクレイピング”ってやつです。ご存知の方も多いはず。要はネット上から情報を取得して解析する。むむむ…難しそうだ。接続先のサーバに負荷をかけないよう注意も必要とのこと。怖い怖い。
さてやりたいことは・・・
Yahoo!ニュースからニュースの各記事のタイトルを取得する。
以下のサイトを参考にさせていただきました。
requestsとBeautifulSoup4が必要なのでPythonにあらかじめインストールしておきます。
1 2 3 4 5 |
import requests from bs4 import BeautifulSoup url = 'http://news.yahoo.co.jp/' res = requests.get(url) soup = BeautifulSoup(res.text,"html.parser") |
requestsでgetしたHTMLのソースを、BeautifulSoupでパース(HTMLの意味や構造を解釈)します。print(soup)して確認すると中身がダダっと表示されるはずです。
ソースの中身をみると、各記事のタイトルは<h1>タグ&”ttl”クラス、<p>タグ&”ttl”クラスの中に入っているようでした。そこでsoupからfind_allで全て取り出します。
6 7 8 9 10 11 |
h1s = soup.find_all("h1",class_="ttl") # 全ての<h1 class="ttl">...</h1>を取得 for h1 in h1s: print(h1) ps = soup.find_all("p",class_="ttl") # 全ての<p class="ttl">...</p>を取得 for p in ps: print(p) |
そうするとこんな感じで出力されました。
1 2 3 4 5 6 7 8 9 |
# 出力結果 <h1 class="ttl"><a href="https://news.yahoo.co.jp/pickup/6281094" onmousedown="this.href='https://news.yahoo.co.jp/pickup/6281094'">立憲 国会審議の復帰を検討<span class="icNew">new</span></a></h1> <p class="ttl"><a href="https://news.yahoo.co.jp/pickup/6281093" onmousedown="this.href='https://news.yahoo.co.jp/pickup/6281093'">南禅寺で刺激臭 客ら喉の痛み<span class="icPhoto">写真</span></a></p> <p class="ttl"><a href="https://news.yahoo.co.jp/pickup/6281087" onmousedown="this.href='https://news.yahoo.co.jp/pickup/6281087'">パリで若者暴徒化 マック放火<span class="icVideo">映像</span></a></p> <p class="ttl"><a href="https://news.yahoo.co.jp/pickup/6281092" onmousedown="this.href='https://news.yahoo.co.jp/pickup/6281092'">1兆円市場? 睡眠負債ビジネス<span class="icPhoto">写真</span></a></p> <p class="ttl"><a href="https://news.yahoo.co.jp/pickup/6281080" onmousedown="this.href='https://news.yahoo.co.jp/pickup/6281080'">FB 閲覧履歴消去できる新機能<span class="icPhoto">写真</span></a></p> <p class="ttl"><a href="https://news.yahoo.co.jp/pickup/6281095" onmousedown="this.href='https://news.yahoo.co.jp/pickup/6281095'">協会会長「伊調と話したい」<span class="icPhoto">写真</span><span class="icNew">new</span></a></p> <p class="ttl"><a href="https://news.yahoo.co.jp/pickup/6281098" onmousedown="this.href='https://news.yahoo.co.jp/pickup/6281098'">TOKIO会見 山口脱退申し入れ<span class="icPhoto">写真</span><span class="icNew">new</span></a></p> <p class="ttl"><a href="https://news.yahoo.co.jp/pickup/6281097" onmousedown="this.href='https://news.yahoo.co.jp/pickup/6281097'">TOKIO4人が会見 冒頭で謝罪<span class="icPhoto">写真</span><span class="icNew">new</span></a></p> |
ちなみに8、11行目のprintのところをtextだけにすると…
6 7 8 9 10 11 |
h1s = soup.find_all("h1",class_="ttl") # 全ての<h1 class="ttl">...</h1>を取得 for h1 in h1s: print(h1.text) ps = soup.find_all("p",class_="ttl") # 全ての<p class="ttl">...</p>を取得 for p in ps: print(p.text) |
いい感じで出力されました。
1 2 3 4 5 6 7 8 9 |
# 出力結果 立憲 国会審議の復帰を検討new 南禅寺で刺激臭 客ら喉の痛み写真 火災4件1人死亡 不審火続く写真new 1兆円市場? 睡眠負債ビジネス写真 FB 閲覧履歴消去できる新機能写真 協会会長「伊調と話したい」写真new TOKIO会見 山口脱退申し入れ写真new 松岡 山口は甘ったれた発言写真new |
「写真」と「new」の文言が不要なので次回の投稿で削除したいと思います。今日はこのへんで。