BeautifulSoup4でアベンジャーズの記事をスクレイピングする
- 2019年06月17日
- CATEGORY- 1. 技術力{技術情報}
2019年4月、『アベンジャーズ/ エンドゲーム』が公開されました。
私は映画ももちろん見ましたがそれだけでは足りず、日々映画の情報サイトを漁ってアベンジャーズに関する記事を読んでいます。
しかし毎日記事を見にいくのは手間ですし、見逃してしまう可能性もあります。
そこで、映画の記事サイトをスクレイピングしてアベンジャーズの記事を抽出し、Slackに通知する様にしました。
環境
pythonとスクレイピング用のライブラリとしてBeautiflSoup4を使います。
- python3.7
- bs4==0.0.1
https://www.crummy.com/software/BeautifulSoup/bs4/doc/
スクレイピングの手順
スクレイピングは以下のステップで進めていきます。
1.スクレイピング対象のURLを決める
2.ページのHTML構成を理解する
3.抽出する内容(htmlタグ)を決める
4.プログラム実装
1. スクレイピング対象のURLを決める
今回はシネマカフェという映画情報のサイトの洋画の最新記事一覧ページを対象とします。
2. ページのHTML構成を理解する
HTMLを眺めると、その構成が見えてきます。
今回着目した点は
- 記事に関する一覧情報は<div class=”news-list”>タグに囲まれている。
- 記事一覧の<section>タグ内に1記事あたりの情報が記載されている。
です。なのでこれらのタグ内の情報をうまいことスクレイピングできれば、欲しい情報が取れそうです。
以下、htmlの抜粋です。
1 | < div class = "news-list" > |
2 | < section class = "item item--highlight item--cate-cinema item--cate-cinema-foreign item--subcate-foreign" > |
3 | < a class = "link" href = "/article/2019/06/14/62061.html" > |
4 | < img class = "figure" src = "/imgs/std_l1/434215.jpg" alt = "インドのお受験描く笑いと感動の『ヒンディー・ミディアム』日本公開決定 画像" > |
5 | < div class = "figcaption" > |
6 | < span class = "group" >洋画ニュース</ span > |
7 | < time class = "date" datetime = "2019-06-14T14:00:04+09:00" >2019.6.14 Fri 14:00</ time > |
8 | < h2 class = "title" >インドのお受験描く笑いと感動の『ヒンディー・ミディアム』日本公開決定</ h2 > |
9 | “インドのお受験”をテーマに描く珠玉の教育エンターテインメント『ヒンディー・ミディアム』(原題:Hindi Medium)が、9月6日(金)より日本でも公開決定。 |
10 | </ div > |
11 | </ a > |
12 | </ section > |
13 | ~~~~ 上のsectionタグが記事の数だけ続く ~~~~ |
14 | </ div > |
3. 抽出する内容(htmlタグ)を決める
Slackには以下の情報を通知させたいです。
- タイトル である h2タグ
- 記事投稿日 である timeタグ
- 記事のリンク である aタグ
4. プログラム実装
今回はスクレイピング処理のみ解説をします。
HTML情報を取得し、その中身をBeautifulSoupで用意されているfind()メソッドとfind_all()メソッドを使って抽出していきます。
1 | # HTMLの情報を取得 |
2 | r = requests.get(const.BASE_URL + const.SCRAPING_URL) |
3 | # BeautifulSoupオブジェクトを作成。これによってhtmlタグをツリー構造として扱える様になる。 |
4 | soup = BeautifulSoup(r.content, 'html.parser' ) |
5 | # find()メソッドでclassを指定して記事一覧情報を取得 |
6 | news_list = soup.find( class_ = 'news-list' ) |
7 | # find_all()メソッドでsectionタグを1つずつ取得し、捜索していく |
8 | for section in news_list.find_all( 'section' ): |
9 | # 記事の中に検出したい文字列があるかチェックをしていく |
10 | for target_word in const.TARGET_WORDS: |
11 | if target_word in section.text: |
12 | # 以下、Slackへの通知処理 |
find()メソッド、find_all()メソッドはどちらもHTMLのタグ情報を引数として、要素を検索できます。
find()は引数に一致する結果を1つ返すのに対し、find_all()は一致したものを全て返します。
findした結果はhtmlタグを指定することで、さらに深く取得することができます。上の例の場合、section.h2でh2タグの情報が、section.timeでtimeタグの情報が取得できます。
BeautifulSoupはこの様にfind~メソッドが複数用意されており、これらを用いて要素を取得していく事になります。
実行結果
Slackに通知ができました。
まとめ
今回はBeautifulSoup4を用いてスクレイピングを行い、アベンジャーズの記事をSlackに投稿しました。
今後の課題としては、特定のサイトにしか載らない記事もあるので、複数のサイトを一気にスクレイピングできたらいいなと思います。
- 2019年06月17日
- CATEGORY- 1. 技術力{技術情報}