BeautifulSoup入門 スクレイピング実践編 タイトルとリンク取得まで【python】

02 28, 2019

スクレイピングをしたい

Webサイトから情報をまとめてCSVでごにょごにょしたいなどにスクレイピングは便利です。
今回は、Pythonのスクレイピングによく使われるBeautifulSoupを使って勉強していきます。 BeautifulSoupには便利な機能がたくさんあります。 今回もcrieitさんからデータを抜いていきます。(制作者のdalaさんには了解済み)

今回の目標

今回の目標はタイトルと記事URLの取得とします。

ライブラリの導入

BeautifulSoup単体ではURLをからデータを持ってこれません。 requestsを併用します。

from bs4 import BeautifulSoup
import requests

Requestsを使って、webからデータを取得

requestsを使用してデータを持ってきます。

url = "https://crieit.net/"
r = requests.get(url)

BeautifulSoupで要素を整形する

つぎにBeautifulSoupで要素を整形する

soup = BeautifulSoup(r.text)

crieitの記事タイトルの中身を確認

抜きたいデータはタイトルとURLですのでその箇所の要素を確認します。

<h5 class="card-title">
 <a href="https://crieit.net/posts/Tilemap-5c73afa5127c1">Tilemapからミニマップを作成してみた①</a>
</h5>

取り方としては

  • h5タグで絞り込む
  • classで絞り込む

とかでなんとかなりそうです。

soup.find_all

試しにsoup.find_allで値を取得してみましょう。

titles =soup.find_all("h5")
print(titles)
[<h5 class="card-title">クロス投稿可能</h5>, <h5 class="card-title">自由に投稿</h5>, ]

のように配列で渡されてきました。これでは視認性が悪いです。forで表示してみましょう。

for title in titles:
  print(title)

すると

<h5 class="card-title">Nuxt.js+ExpressのプロジェクトをTypeScript化する</h5>
<h5 class="card-title">Firestoreの参照型によるリレーションを試す</h5>
<h5 class="card-title"><a href="https://crieit.net/posts/Tilemap-5c73afa5127c1">Tilemapからミニマップを作成してみた①</a></h5>
<h5 class="card-title"><a href="https://crieit.net/posts/BeautifulSoup-soup">BeautifulSoup入門 soup.の挙動を確認する</a></h5>

のように出力されます。aタグで拾ってきた方が良さそうです。

soup.selectを使う

そこでsoup.selectを使うとCSSセレクタで抽出ができます。

titles =soup.select("h5 a")
print(titles)
for title in titles:
  print(title.text)
  link = title.get("href")
  print(link)

これで無事

Tilemapからミニマップを作成してみた①
https://crieit.net/posts/Tilemap-5c73afa5127c1
BeautifulSoup入門 soup.の挙動を確認する
https://crieit.net/posts/BeautifulSoup-soup
BeautifulSoup入門 HTMLを取得して表示する【Python】
https://crieit.net/posts/BeautifulSoup-HTML-Python

のようにキチンと取得できました。

動くサンプル

Python3


コリ

コリといいます。奈良県でサラリーマンをしています。GatsbyJSでサイトを作るのが趣味です。