【Python】Beautiful Soup を使ってスクレイピングする方法。
公開日:
:
最終更新日:2020/04/19
Python Beautiful Soup, tree, wget, スクレイピング
Beautiful Soup は、シンプルでわかりやすい API でデータを抜き出せる Python のライブラリです。
Contents
Beautiful Soup のインストール
Beautiful Soup を pip でインストールします。
1 |
# pip install beautifulsoup4 |
インストールは正常に完了したのですが、以下のようなメッセージが表示されたので、pip を upgrade しました。
You are using pip version 8.1.1, however version 18.1 is available.
You should consider upgrading via the ‘pip install –upgrade pip‘ command.
1 |
# pip install --upgrade pip |
pip のバージョンが 18.1 になりました。
wget でファイルを取得
スクレイピングするためのファイルを wget コマンドで取得します。
1 2 3 4 5 6 7 8 9 |
# -r, --recursive:リンクをたどって再帰的にダウンロードする。 # --no-parent:親ディレクトリをクロールしない。 # -l, --level:リンクをたどる深さを制限する。 # --restrict-file-names=nocontrol:URLに日本語が含まれる場合に、日本語のファイル名で保存する。 # wget -r --no-parent -w 1 -l 1 --restrict-file-names=nocontrol https://gihyo.jp/ |
取得したファイル一覧を tree コマンドで確認します。
1 |
$ tree gihyo.jp |
Requests で HTMLを取得する
先ほどは、wget で HTML ファイルを取得しましたが、Python ライブラリの requests を用いてもデータを取得することができます。
以下のように URL を指定します。HTTP に関する情報も取得できるようなので、コードとコメントで出力結果を載せておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
url = 'https://en.wikipedia.org/wiki/index.php' + \ '?title=List_of_Game_of_Thrones_episodes&oldid=802553687' r = requests.get(url) # サーバーから返されたHTTP ステータスコード print(r.status_code) # 200 # テキストのステータスメッセージ print(r.reason) # OK # HTTPレスポンスヘッダー print(r.headers) # HTTPリクエストヘッダー print(r.request.headers) |
Beautiful Soup4 でスクレイピングする
先ほどダウンロードしたファイルの中から、index.html に含まれるリンクのURLとテキストを表示してみます。
以下のような python のコードを実行します。
1 2 3 4 5 6 7 8 9 10 11 |
# coding:utf-8 from bs4 import BeautifulSoup with open('./gihyo.jp/index.html') as f: soup = BeautifulSoup(f, 'html.parser') for a in soup.find_all('a'): # href 属性と、リンクのテキストを取得 print(a.get('href'), a.text) |
WikiPedia のページをスクレイピング
実際に、上の requests で取得した wikipedia のページに対して、どのような情報が取れるか確認しました。コメントで説明と出力結果を載せておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
html_contents = r.text html_soup = BeautifulSoup(html_contents, 'html.parser') # 最初の<h1>タグを検索する first_h1 = html_soup.find('h1')print(first_h1) # <h1 class="firstHeading" id="firstHeading" lang="ja">globe</h1> print(first_h1.name) # h1 # contents -> タグの子要素をリストで取得 print(first_h1.contents) # ['globe'] # text -> タグの子要素を単純なテキストとして取得 print(first_h1.text) print(first_h1.get_text()) # globe print(first_h1.attrs) # {'id': 'firstHeading', 'class': ['firstHeading'], 'lang': 'ja'} print(first_h1.attrs['id']) print(first_h1['id']) print(first_h1.get('id')) # firstHeading |
あと、find や find_all を入れ子で使う場合は、値が取れない箇所があるとエラーになってしまうので注意が必要かと思いました(実際にそこでハマってしまいました)。
関連記事
-
-
【matplotlib】 Python で折れ線グラフを描く方法。
今回は、Python の matplotlib というライブラリを使って簡単に折れ線グラフを描く方法
-
-
【Pandas】 DataFrame のインデックスを置き換える方法【Python】
今回は、Pandas の DataFrame型で、インデックス(index)を分かりやすいものに置き
-
-
【Python】pip3 で「cannot import name ‘main’」エラーが出たときの対処法。
Python でライブラリをインストールする際に、pipを使います。 Python2 と Py
-
-
【Python】Wikipedia のデータセットを取得し、文章を抽出する方法。
Wikipedia のデータセットを取得し、Python のライブラリを用いて文章を抽出する方法を紹
-
-
【Linux】 ローカルに Python をインストールする方法。
今回は、Linux サーバに、root 権限なしで、ローカルに Python をインストールした方法
-
-
【Python】Windows で ライブラリ(NumPy) をインストールする方法。
Windows の Python(2.X系)で NumPy をインストールしようと思ったら、そもそも
-
-
【Python】時系列データ(為替データ)をグラフ表示してみた。
今回は、pandas・matplotlib ライブラリを使って、時系列データ(為替データ)をグラフ表
-
-
【Python】 DataFrame の特定の列で出現回数をカウントして降順でソートする方法。
Python で DataFrame 型の特定の列を指定して、対象列の文字列の出現回数をカウントして
-
-
【matplotlib】 Python でヒストグラムの横軸と棒(ビン)の数を調整する方法。
Python の matplotlib を使ってヒストグラムを描画し、横軸の目盛りと棒(ビン)がそろ
-
-
【OpenCV】検出した顔画像部分を切り出す方法【Python】
OpenCV を使って、Python で画像の中から顔部分を切り出したときのメモです。 顔部分