開発案件でPythonでクローリング&スクレイピングをする機会があったので、そこで新たに学んだことを使い、簡単にクローリング&スクレイピングをやってみます。
目標
日経電子版を対象にカテゴリー名を引数に指定カテゴリーページ1ページ分の全タイトルを返すだけの簡単なものをつくっていきます。
上図の青枠で囲った記事タイトルを取得します。
また今回新たに学んだこととしてエラー処理についても簡単に実装します。
コード
from typing import List
import requests
from bs4 import BeautifulSoup
def get_nikkei_news(category: str) -> List[str]:
"""
記事カテゴリーを指定して日経電子版のホームページをクローリング
@param category: 記事カテゴリー
@return:記事タイトルのリスト
"""
titles = list()
base_url = 'https://www.nikkei.com/'
base_url_2 = '/archive/'
try:
response = requests.get(base_url + category + base_url_2)
response.raise_for_status()
response.encoding = response.apparent_encoding
soup = BeautifulSoup(response.text, "html.parser")
# スクレイピング
title_list = soup.find_all('span', class_='m-miM09_titleL')
for title in title_list:
title_text = title.text
titles.append(title_text)
except requests.exceptions.HTTPError:
print("{}カテゴリーページへのアクセス失敗".format(category))
except Exception as e:
print(e)
return titles
title_name_list = get_nikkei_news("technology")
for title_name in title_name_list:
print(title_name)
実行結果
オプト、AIで広告分類する仕組み開発
ディーカレット、仮想通貨を電子マネーにチャージ
トレードオフ破る非常識の無線通信、軍艦島で実証中
五輪の感染症対策 ワクチン接種と防蚊準備を
自動運転バス、既に実用化 福島第1原発を走っている
日本マイクロソフト、独SAPと連携してクラウド拡販
「総合証券サービス目指す」 LINE証券の一問一答
アルトア、「自撮り」の本人確認で融資可能に
[FT]逆転の発想が生んだ世界最大のAI用チップ
LINE、証券サービス開始 1株単位で取引可能
コード解説
-
try~except
構文:発生した例外に応じたエラー処理ができる。try
節の中でエラーが発生すると、そのエラーに対応したexcept
節の処理へと移行する。 -
requests.get('url')
:指定したURLに対してHTTPリクエストを送信し、サーバから返却されるHTTPレスポンスを戻り値として返す。 -
response.raise_for_status()
:ステータスコードが200番台以外だった場合エラーを起こす
HTTPステータスコード | 意味 |
---|---|
100番台 | 処理中 |
200番台 | 成功 |
300番台 | リダイレクト |
400番台 | クライアントエラー |
500番台 | サーバーエラー |
-
response.encoding = response.apparent_encoding
:極力文字化けが起こらないようにコンテンツを取得できる -
BeautifulSoup(response.text, "html.parser")
:第一引数にHTML、第二引数にHTMLパーサーを指定できる。最初から使えるhtml.parser
を指定している。HTMLの字句解析をして、タグなどを判断してデータ構造として取得するプログラムをHTMLパーサーという。 -
soup.find_all('span', class_='m-miM09_titleL')
:グの子孫要素を調べてフィルタにマッチする全ての子孫要素をリスト型で返す -
except requests.exceptions.HTTPError:
:ステータスコードが200番台以外だった場合のエラー時の処理 -
except Exception as e:
:例外の内容を知る