目的
- 最後にPythonを触ったのが、1年前とかなのでこの勉強を通し思い出す
- 思い出しついでにスクレイピングについて勉強する
- コードを書くことそのものを勉強する
環境
- Windows11 Pro
- Python 3.12.3
- VSCode
今回の勉強内容
- requestsとBeautifulsoupを使ったスクレイピングの基礎
今回のゴール
- ページトップの主要ニュースの文字列を取得する
スクレイピングする対象
https://www.yahoo.co.jp/
※https://www.yahoo.co.jp/robots.txt 見た感じしてよさそうだったので。
理解間違えていてダメだったら教えてください。
スクリプト
全体
import requests
from bs4 import BeautifulSoup
url = "https://www.yahoo.co.jp/"
html = requests.get(url)
soup = BeautifulSoup(html.content, "html.parser")
main_news = soup.find(class_="_2jjSS8r_I9Zd6O9NFJtDN-")
for news in main_news.find_all("span"):
if news.text == "NEW":
continue
classes = news.get("class", [])
if "fQMqQTGJTbIMxjQwZA2zk" in classes and "_2VDw54wcDejORZkozpOysW" in classes:
continue
print(news.text)
出力結果
パキスタンとタリバン 再決裂
12歳人身取引か 母は27回の渡航歴
71歳が運転する車と衝突 女性死亡
鳥インフル防疫で休職や骨折 調査
米ウェンディーズ 数百店舗閉鎖へ
引退表明の坂本花織 4度目の優勝
RYOKI「BE:FIRST」を脱退へ
Number_iの新曲が物議 TOBE回答
各ブロックの解説
import requests
from bs4 import BeautifulSoup
requestsについて
サードパーティーのHTTPライブラリらしいです。
HTMLとかをいい感じにしてくれるらしいです。
BeautifulSoupについて
こちらもサードパーティーのライブラリです。
HTMLをいい感じに解析してくれるらしいです。
# 解析するurlを指定する
url = "https://www.yahoo.co.jp/"
# requestsでurlをいい感じにする
html = requests.get(url)
# BeautifulSoupでいい感じになったwebページの中身を解析する
soup = BeautifulSoup(html.content, "html.parser")
# 抜き出したいタグを指定する
main_news = soup.find(class_="_2jjSS8r_I9Zd6O9NFJtDN-")
findメソッドについて
findメソッドはhtml内の指定した個所を見つけてくれるらしいです
タグの見つけ方
今回の趣旨とは外れますが、自分のためにタグの見つけ方について
-
F12キーを押下する - 開発者ツールの左上の→マークをクリックする
- HTML上の解析したい個所にカーソルを合わせてクリックする
- classが見つかる
- 開発者ツールでクラスを右クリック > copy > outerHTML でclassがコピーできる
# main_newsに入ってるclassに属するspanタグすべてをfor文で抜き出す
for news in main_news.find_all("span"):
# そのまま回すと"NEW"も出力されてしまうのでcontinueで回避する
if news.text == "NEW":
continue
# 更新時間も取得されてしまうので、更新時間のclassを指定する
classes = news.get("class", [])
# 2つクラスがあったので回避する
if "fQMqQTGJTbIMxjQwZA2zk" in classes and "_2VDw54wcDejORZkozpOysW" in classes:
continue
# 取得した内容からHTMLのタグをtextメソッドで消して出力する
print(news.text)
ifについて、はじめは
if news.text....
continue
elif ....
continue
みたいな書き方をしてました。
考えてみれば当たり前で、ifが成立しちゃったらelifは処理されないんだから駄目だよねってなりました。
完全に忘れてるねえ。
そんなこんなで今回目的とするyahooトップページの主要ニュースの文字列を取得する。ができました。
めでたしめでたし。
参考