Blog

フクロウメンバーによる日常をご紹介いたします。

2016-10-07  カテゴリ:Python

Posted by fukurou

Pythonでスクレイピングをしてみよう

こんにちは!

フクロウのブログがスタートして1か月ほど経過しました。

毎回のように”お役に立てるかはわかりませんが・・・”と言いつつも、
知識やメモの集約として振り返るツールという意味では
少しずつ役割を持たせられているのではないかと感じております。

さて、今回は「Pythonでクローラーを作ってみたい!」というときに使える
ライブラリとその方法をご紹介したいと思います。

BeautifulSoup

美しいスープ・・・まさに「何それ、おいしいの?」ですね。

BeautifulSoup は、スクレイピング(Webサイト上にある情報を収集すること)
のために必要な関数が使えるライブラリ(モジュール)です。

インストールされていない場合は

pip install beautifulsoup4

でインストールしておきましょう。

Jupyter Notebookでインストールするには
pipの前に「!」をつけます。

!pip install beautifulsoup4

こう。

スクレイピングしてみる

画像はJupyter Notebook(何これ?って人は前回の記事をご参照ください!!)で実行した際の画面です。

まずは必要なモジュールをimportしていきましょう。

  • time
  • sys
  • requests
  • BeautifulSoup

この4つを使用します。

BeautifulSoupのimportは、
モジュール名の大文字・小文字を間違えたり、BeautifulSoapに4をつけたりすると
「そんなモジュールありませんよ!」と怒られるので注意。

beautifulsoup1

 

うまくいきました。

次に変数urlに、スクレイピングしたいサイトのURLを代入。
今回は、フクロウのブログの記事一覧画面から記事タイトル(h4タグ)を遡って取得していきます。

beautifulsoup2

実行すると、記事のタイトルがずらりと表示されています!

beautifulsoup4

以下、ここまでの内容をまとめたサンプルコードです。

import time
import sys #システムのライブラリをインポート
import requests #HTMLを取得する
from bs4 import BeautifulSoup #モジュール名bs4 よりbeautifulsoupをインポート

url = 'http://2960.jp/blog/'

res = requests.get(url)
soup = BeautifulSoup(res.content,'html.parser')
    
records = soup.select('h4')
for record in records:
    print(record.get_text())

複数のページを遡っていって取得する場合は以下の通り。
変数next_pageを使って取得したリンク先(次の10件へ)の情報を返しています。

beautifulsoup3

弊社のブログは記事数がまだ少ないので大丈夫かと思いますが、
大量のデータがあるサイトで実行すると時間がかかりますし
何度も実行するとサーバーに負荷をかけてしまいますので、そのあたりは気を付けて下さい。

その点を配慮して、

  • 繰り返しの回数を3回に限定
  • 次のループに入る前に1秒待つ

という内容にしています。
数字を変えればもっとたくさんのページの読み込みが可能ですし、速度も変えられますよ。

以下サンプルコードです。

import time
import sys #システムのライブラリをインポート
import requests #HTMLを取得する
from bs4 import BeautifulSoup #モジュール名bs4 よりbeautifulsoupをインポート

url = 'http://2960.jp/blog/'

for n in range(3):
    res = requests.get(url)
    soup = BeautifulSoup(res.content,'html.parser')
    next_page = soup.find('span',class_ = "next")
    next_page = next_page.find('a',text = "次の10件へ >")

    records = soup.select('h4')
    for record in records:
        print(record.get_text())

    url = next_page.get('href')
    if not next_page:
        break

    time.sleep(1)

Leave a Comment

入力エリアすべてが必須項目です。メールアドレスが公開されることはありません。

内容をご確認の上、送信してください。

ページトップに戻る