DESIGNMAP

  1. TOP
  2. 公開講座
  3. ゼロから始めるPython入門
  4. スクレイピングをやってみよう ー ゼロから始めるPython入門【Vol.17】

スクレイピングをやってみよう ー ゼロから始めるPython入門【Vol.17】

今回は文法の学習ではなく、いままでの知識を活かして実用的なコードを書いていきます。
スクレイピングとはWebページの特定のデータを抽出することです。BeautifulSoupというモジュールを使うとシンプルなコードでスクレイピングが実装ができます。

まずBeautifulSoupをインストールします。

Windowsはコマンドプロンプト、 Macはターミナルを起動します。
下記のコードを入れて、[Enter]キーを押します。

Windowsの方は

pip install beautifulsoup4

Macの方は

pip3 install beautifulsoup4

pip自体をバージョンアップするメッセージが表示された場合は
下記のコマンドでpipコマンドのバージョンをあげることができます。

Windowsの方は

pip install -U pip

Macの方はsudoコマンドを頭につけて、実行します。

sudo pip3 install -U pip

sudoコマンドを打つと、ユーザーパスワードを聞かれますので、入力するとインストールが始まります。

次にサーバーにリクエストをするのに必要なRequestsライブラリをインストールします。
Windowsの方は

pip install requests

Macの方は

pip3 install requests

Pythonは有志により多くのパッケージやライブラリが公開されていて、「PyPI」というサイトに登録されています。パッケージは複数のモジュールを組み合わせたものです。pip3コマンドでインストールができます。

http://designmap.info/2016/12/04/python-16/ページの大見出し「例外処理 ー ゼロから始めるPython入門【Vol.16】」を抽出してみましょう。

コードを書く前にページのHTMLの構造を確認します。WebブラウザはChromeをつかっているとします。http://designmap.info/2016/12/04/python-16/のページにいき、大見出しの「例外処理 ー ゼロから始めるPython入門【Vol.16】」を右クリック→[検証]をクリックします。デベロッパーツールが起動します。
py17-1

py17-2
大見出しはh1タグでくるまれていることがわかります。

HTMLの解説は「ゼロからはじめるHTML、CSS講座」をご覧ください。

ではコードを書いていきます。
Atomを起動します。[ファイル]メニュー→[新規ファイル]をクリックします。[ファイル]メニュー→[保存]をクリックします。新規ファイルを生成以下のコード書いて、Vo.3でつくった「python-study」フォルダ内に、「scraping1.py」というファイル名で保存します。

import requests
from bs4 import BeautifulSoup

url = "http://designmap.info/2016/12/04/python-16/"
r = requests.get(url)

print(soup.find("h1"))

実行すると

<h1 class="Header__head"><a href="http://designmap.info">
<img alt="DESIGNMAP" src="http://designmap.info/designmap-wp/wp-content/themes/zen/logo.png"/>
</a></h1>

という結果になります。ヘッダー部分のh1タグの部分が抽出されたようです。

もう一度デベロッパーツールで大見出しを確認すると、
<article class=”Article”>でくるまれていることがわかります。
py17-2

下記のようにコードを書きます。

import requests
from bs4 import BeautifulSoup

url = "http://designmap.info/2016/12/04/python-16/"
r = requests.get(url)
soup = BeautifulSoup(r.text, "html.parser")

elm = soup.find("article", class_="Article")
print(elm.find("h1"))

実行すると

<h1>例外処理 ー ゼロから始めるPython入門【Vol.16】</h1>

ようやく大見出しのタグがとれました。

今回のページはh1タグがページに複数あるので、まずh1をつつんいるタグでclass属性やid属性がついている親のタグを探します。今回はh1タグの親の親に<article class=”Article”>がありましたので、これを利用しています。

elm = soup.find("article", class_="Article")

と書いて、

print(elm.find("h1"))

と2段階で取得するとうまくいきます。

さらに下記のように書くとh1タグにはさまれたテキストを抽出できます。

print(elm.find("h1").text)
例外処理 ー ゼロから始めるPython入門【Vol.16】

スポンサーリンク

別な例を試してみましょう。

http://designmap.info/にアクセスすると、記事の見出しがいくつか並んでいます。この記事の見出しだけを抽出します。
「python-study」内に、「scraping2.py」というファイル名で保存します。

import requests
from bs4 import BeautifulSoup

url = "http://designmap.info/"
r = requests.get(url)
soup = BeautifulSoup(r.text, "html.parser")

for elm in soup.find_all("h2"):
    print(elm.text)

実行すると、下記の結果が表示されます。

<h2>『マジックバタフライ』</h2>
<h2>『ダブル・ショック』</h2>
<h2>例外処理 ー ゼロから始めるPython入門【Vol.16】</h2>
<h2>ファイルの読み書き ー ゼロから始めるPython入門【Vol.15】</h2>
(省略)

問題ないようですが、サイドバーのh2も抽出されてしまっています。
修正したのが下記のコードです。

import requests
from bs4 import BeautifulSoup

url = "http://designmap.info/"
r = requests.get(url)
soup = BeautifulSoup(r.text, "html.parser")

elm = soup.find("div", class_="l-main")

for elm_child in elm.find_all("h2"):
    print(elm_child.text)

実行すると記事の見出しだけを取得できます。

『マジックバタフライ』
『ダブル・ショック』
例外処理 ー ゼロから始めるPython入門【Vol.16】
ファイルの読み書き ー ゼロから始めるPython入門【Vol.15】
(省略)

ページの内のaタグのリンク先のURLを抽出してみましょう。
「python-study」内に、「scraping3.py」というファイル名で保存します。

import requests
from bs4 import BeautifulSoup

url = "http://designmap.info/"
r = requests.get(url)
soup = BeautifulSoup(r.text, "html.parser")

for elm in soup.find_all("a"):
    print(elm.get("href"))

実行するとページ内のすべてのリンク先のURLを取得できます。

http://designmap.info
(省略)

スポンサーリンク

関連記事

プロフィール

DESIGNMAP
ディレクター
ON VISITINGを制作・運営。
お問い合わせ