Python

BeautifulSoupでよく使うスクレイピングのやり方

Python

「BeautifulSoup」とは、Pythonでスクレイピングするのに便利なライブラリです。

「BeautifulSoup」を使うことで簡単にWEBサイト内のデータ解析を行う事ができます。

よく使うスクレイピング使い方についてまとめてみました。

1. BeautifulSoupのインストール方法

pip経由でインストールします。

> pip install beautifulsoap4

2. 基本的な使い方

2.1. 任意のidで要素を探す – find()

# titleというidの部分を抽出
title = soup.find(id="title")

# テキスト部分を表示する
print(title.string)

2.2. 複数の要素を取得する – find_all()

# aタグを全て抽出
links = soup.find_all("a")

for a in links:
    href = a.attrs['href']
    text = a.string
    print(text, ">", href)

2.3. CSSセレクタを使う select_one() / select

1つの要素だけ取得するにはselect_oneを使います。通常はselectを使う事が多いです。

h1 = soup.select_one("div#meigen > h1").string

li_list = soup.select("div#meigen > ul.items > li")
for li in li_list:
    print("li = ", li.string)

3. CSSセレクタについて

3.1. CSSセレクターの関係

ハマりそうなところだけ抜粋しています。

書式説明
セレクタ,セレクタ列挙された複数のセレクタ(例)h1,h2
セレクタ セレクタ下の階層の子孫要素(例)div h1
セレクタ>セレクタ直下の階層の要素(例)div h1
セレクタ+セレクタ同じ階層で直後に隣接している要素(例)h1+h2
セレクタ1~セレクタ2セレクタ1からセレクタ2までの要素(例)p~ul
要素[att]特定の属性名を持つ要素
要素[att=”val”]att属性にvalという値を持つ要素
要素[att~=”val”]att属性の値候補valに一致した要素
要素[att | =”val”]att属性の値がvalで始まる要素(ただしハイフン区切り)
要素[att^=”val”]att属性の値がvalで始まる要素
要素[att$=”val”]att属性の値がvalで終わる要素
要素[att*=”val”]att属性の値にvalを含む要素

3.2. 正規表現での抽出

正規表現で必要なものだけを抽出する方法です。
reライブラリを使います。

import re

# httpsのものだけを抽出
li = soup.find_all(href=re.compile(r"https://"))
for e in li
    print(e.attrs['href'])

4. リンク先をダウンロードする

4.1. 相対パスの展開方法

urllib.parse.urlhoin()を利用して相対パスを絶対パスに変換する方法です。

from urllib.parse import urljoin

base = "http://exsample.com/html/a.html"

print(urljoin(base, "b.html")) # http://exsample.com/html/b.html
print(urljoin(base, "sub/c.html")) # http://exsample.com/html/sub/c.html
print(urljoin(base, "../index.html")) # http://exsample.com/index.html
print(urljoin(base, "../img/hoge.png")) # http://exsample.com/img/hoge.png

ダウンロード方法

os.path.existsとmkdirsを使ってディレクトリを作成する方法は結構使います。
ファイルのダウンロードにはurlretrieveを使ってます。

def download_file(url):
    o = urlparse(url)
    savepath = "./" + o.netloc + o.path
    if re.search(r"/$", savepath): # ディレクトリならindex.html
        savepath += "index.html"
    savedir = os.path.dirname(savepath)

    # すでにダウンロード済み?
    if os.path.exists(savepath):
        return savepath
    
    # なければダウンロードのディレクトリを作成
    if not os.path.exists(savedir):
        print("mkdir=", savedir)
        makedirs(savedir)

    # ファイルをダウンロード
    try:
        print("download=", url)
        urlretrieve(url, savepath)
        time.sleep(1)
        return savepath
    exept:
        print("ダウンロード失敗:". url)
        retu

Pythonのオススメ勉強方法

私がオススメするPython初心者向けの最初に購入すべき書籍は「シリコンバレー一流プログラマーが教える Pythonプロフェッショナル大全です。

シリコンバレー一流プログラマーが教える Pythonプロフェッショナル大全

この書籍は実際にシリコンバレーの一流エンジニアとして活躍している酒井潤さんが書いた本です。

内容も初心者から上級者までまとめられており、各Lessonも長すぎずに分かりやすくまとめられているので、初心者の方にもおすすめです。

シリコンバレー一流プログラマーが教える Pythonプロフェッショナル大全

今回は以上となります。

コメント