[Python3]Webスクレイピングで繰り返し構造のデータを取得する

公開日: : Python, 自動化

スポンサーリンク

Python3のBeautifulSoup4でWebスクレイピングをしました。パッと調べた感じだとaタグだけを取得するといったものなどのシンプルなサンプルが多く、今回divタグなどを使った繰り返しのブロック構造をループで再帰的に取得したかったのですが、ちょっと苦戦しましたのでやり方を載せておきます。

環境

Python 3.6
requestsモジュールやbeautifulsoup4が必要なのでそれぞれpipで取得しておきました。また、Pythonの環境はPycharmをAnacondaと連携させて使っています。

サンプル

サンプルでは文字列としたHTMLを準備して動作の確認を行いました。

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import requests
import bs4
import sys
import time

html = """
<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
    <h1>サンプル</h1>
    <div id="contents">
        <div class="entry">
            <div class="header"><a href="http://example.com/">Example Domain</a></div>
        </div>
        <div class="entry">
            <div class="header"><a href="https://www.yahoo.co.jp/">Yahoo!</a></div>
        </div>
        <div class="entry">
            <div class="header"><a href="http://b.hatena.ne.jp/">はてなブックマーク</a></div>
        </div>  
        <div class="entry">
            <div class="header"><a href="https://togetter.com/">togetter</a></div>
        </div>     
    </div>  
  </body>
</html>
"""

if __name__ == "__main__":
        # Web上からスクレイピングする場合
        # url = "http://~"
        # res = requests.get(url)
        # soup = bs4.BeautifulSoup(res.text, "html.parser")

        # html文字列から取得
        soup = bs4.BeautifulSoup(html, "html.parser")
        h = soup.select(".entry")
        for s in h:
            t = s.select(".header a")[0]
            href = t.get('href')
            text = t.get_text()
            print(href)
            print(text)
http://example.com/
Example Domain
https://www.yahoo.co.jp/
Yahoo!
http://b.hatena.ne.jp/
はてなブックマーク
https://togetter.com/
togetter

selectをうまく使って無事思い通りのスクレイピングができました。正直この例であればaタグを直接取ってこればいいのですが、headerクラスに日付やカテゴリなどの別の情報がある場合でもこの方法でブロックごとに取得してくることができます。
実際にWeb上から取得する場合はコメントアウトしている箇所を参考に取得してきてください。

また、今回はあまり関係ないかもしれませんが、同じサイトを連続的にスクレイピングする場合はある程度sleep処理などで時間を待ってから次のアクセスに移るのが一般的なので負荷をかけすぎないようご注意ください。

スポンサーリンク
Amazon

  • このエントリーをはてなブックマークに追加

関連記事

[DAZ Studio]水面を作成する

DAZで海を作成しようとしたのですが、水面ってどう作るのだろう?と思い

[DAZ Studio]服にShaderを適用して色・質感を変える方法

DAZ StudioでShaderという属性のアイテムがあると思います

[DAZ Studio]太った女性の3DCGを作成する

 最近DAZ Studio(Pro 4.10)で遊んでいるのですが、そ

DAZ Studio 4.10 Proの入門メモ(メリット・デメリットなど)

 リアルな人のレンダリングをしたくてDAZ Studioを初めてみまし

Music Center for PCでウォークマンが認識されない場合の楽曲の取り込み方法

 ウォークマンの乗り換えキャンペーンというのを見つけたのでそれに乗っか

→もっと見る

  • Author : ががんぼ
    プログラミングやWeb関係で気付いたことについてメモしていく予定。だいたいが備忘録ですが、自分でサンプルを作って動かしてみたりしています。