furodrive

About

Archive

2014-02-05

BeautifulSoupを使ってスクレイピングをしてみる

そもそもスクレイピングとは?

わかりやすく説明すると特定のWebサイトをプログラミングによって必要な情報を取得したりする行為のことです。 スクレイピングが行えるようになるとムフフなサイトからムフフな画像の取得をプログラムを実行するだけで行えるようになります。

スクレイピングを始める

Pythonのことをあまり知らない人にPythonの基本文法のまとめという記事を書いたので これを読むと他の言語を触ったことがある方は雰囲気がわかると重います。

今回スクレイピングをするためにBeautifulSoupというライブラリを使ってみます。 BeautifulSoupを知らない方に説明するとBeautifulSoupはPythonで動作するHTMLとXMLのパーサーです。これを使用することでjQueryみたいにHTML/XMLの要素の取得を簡単に行えるようになります。pipを使ってインストールを行うのですが、pipが入っていない方は

python -m ensurepip

を入力するとpipがインストールされます。

次に

pip install BeautifulSoup

でBeautifulSoupをインストールしましょう。 またHTTP リクエスト操作を簡単にするrequestsもインストールしておきましょう。

pip install requests

これで準備OKです!

スクレイピングの基本

BeautifulSouphtml(html_body) のインスタンス変数をhtmlのソースを引数に作成しそのインスタンスに対して希望の要素をfindメソッドを使って抽出するのがおおまかな流れになります。

説明を長々とするよりコードを見たほうが直感的にわかりやすいので以下のコードを見てください。


import requests
from bs4 import BeautifulSoup

url = "http://furodrive.com/ja"
r = requests.get(url)
# エンコーディング情報を入れておかないと、Webサイトに寄っては日本語が文字化けする
soup = BeautifulSoup(r.text.encode(r.encoding))
#h1要素を抽出
title = soup.find("h1")
print(title)
 

このコードを実行してみましょう。

furodrive

という実行結果が画面に出力されるはずです。

上のコードは当該ブログのh1要素を取得するプログラムになっています。

また、find("h1")メソッドはh1要素を一つだけ取得しますが find_all("h1")はすべてのh1要素を取得します。 他にも

<img src="/hogehoge"></img>

のようにimg要素内のsrcを取得したいときは,

soup.find("img").get("src")

クラス名で絞り込みたい場合は,

soup.find("div",{"class":"tags"})

のように行います。

(実践) Yahoo翻訳を使って調べたい英単語を翻訳してくれるプログラムを書いてみよう!

最後に少しスクレイピングを使ったためになるコードを書いてみたいと思います。 以下のプログラムはYahoo翻訳を使って調べたい英単語の意味を教えてくれるスクリプトです。



import requests
from bs4 import BeautifulSoup
from flask import jsonify
def make_soup_from(url):
    r = requests.get(url)
    html = r.text
    soup = BeautifulSoup(html)
    return soup

def translate_from_yahoo(word):
    url = "http://kotobank.jp/ejword/{}?dic=pej4&oid=SPEJ00339000".format(word)
    soup =  make_soup_from(url)
    res = []
    explains = soup.find_all("div",{"class":"explain"})
    for explain in explains:
        res.append(explain.text.replace("\n",""))

    return  "\n".join(res)


if __name__ == "__main__":
    word = input("type your word?\n ")
    print("result is ")
    print(translate_from_yahoo(word))
 


 

上記のプログラムを走らせると以下の結果が出力します。

$type your word?
> apple

result is 
[名]                  
1 リンゴの実[木]. ▼リンゴの木はapple treeがふつう                  a red-cheeked [a green] apple真っ赤な[未熟な]リンゴthe keep-the-doctor-away apple医者いらずのリンゴ(▼An apple a day keeps the doctor away. 「1日にリンゴ1個で医者いらず」ということわざから).
2 リンゴと同属で種が違う果実;その木                  a crab apple野生リンゴ.
3 リンゴに似た果実(custard apple, oak apple, May appleなど).                  
4 (形・大きさ・色などが)リンゴ状のもの;((略式))(野球の)ボール.                  
5 ((ふつう形容詞を伴って))((米俗))やつ, 仲間                  a sad appleいやなやつBe a smart apple and drive carefully.((標語))利口者は安全運転.
6 ((俗))刺激のある街, 繁華街;大都会.                  
7 ((米俗))(精神安定剤がはいった)赤いカプセル.                  
apple of a person's eye
((the ~))                  
(1) 目に入れても痛くないもの.                  
(2) ひとみ.                  
apples (and pears)
((押韻俗))階段(stairs).                  
mix [compare] apples and oranges
いっしょにしてはいけないものを混ぜる, 比較にならないものを比較する.                  
she's apples
((豪・NZ略式))万事順調だ.                  
the apple of discord
(1) 《ギリシャ神話》不和のリンゴ:トロイ戦争の原因となった黄金のリンゴ.                  
(2) 争いの種.                  
[古英語æppel(リンゴ). △ドイツ語Apfel]

最後に

これで基本的なスクレイピングで困ることはないと思います。もっと色々と知りたい方は公式のドキュメントを読んでみましょう :) Happy Coding !

Sponsored Link