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の効果的な学習方法は「Udemy(ユーデミー)」によるビデオ学習です。

「Udemy」は、オンライン学習の提供サイトです。学びたい人は多くある講座の中から受講したいコースを選択することができ、動画で学べるのが特徴です。

多くあるPythonのコースの中でもオススメするPythonのコースは以下となります!!

現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル

このコースでは合計で28.5時間のビデオ講座があって、それらを受講するだけで、Pythonの基礎から応用まで学ぶことができます。

私も購入して受講していますが、内容としては初心者の方から上級者まで対応する幅広い内容になっています。

下手な書籍を何冊か購入するより、この動画コースを最初からじっくりと受けることで総合的なスキルを習得することができるできます。おそらくこれ以上の教材はないと思いますので、絶対おすすめです。

ちなみに、Udemyでは頻繁にセール(1か月に2,3回程度)が開催されているので、セールのタイミングで購入すれば90%OFFになる講座もあるため、セールが開催されてからの購入をオススメします!

今回は以上となります。

コメント

タイトルとURLをコピーしました