くらしのマーケット開発ブログ

猫のいる会社、みんなのマーケットの技術ブログ

PythonでMeCabとBeautifulSoupをおいしくいただきたくなったので簡単なクローラーを作ってみた

こんにちは、エンジニアのつづきです。

最近、社内でちょくちょくSEOが。。。
とか、
クローラーが。。。

とかいう話を耳にするようになりました。

クローラー」いい響きですね。

鍋も美味しいシーズンになってきましたから、Pythonを使ってMeCabとBeautifulSoupをおいしくいただくのもいいですね。(全く関係ない)

https://user-images.githubusercontent.com/40745943/50324643-79627280-0523-11e9-954e-6b49857291ee.JPG (オフィスにて会社の皆さんとやった火鍋)

ということで、今回は、Pythonで簡単なクローラーを作ります。

そもそもクローラーとは、

WEB上のファイル(HTML文書だけでなく、画像・PDFまで含む全般)を収集するためのプログラム[1]

らしいです。

では早速作っていきましょう。
用意するものは、以下の通りです。

Python 3.5.0
MeCab
Beautifulsoup4
urllib

まずは、どこかのWebサイトにアクセスするコード[2]を以下に記述します。

import urllib.request
def getHTML(url):
    return urllib.request.urlopen(url)

とっても簡単ですね。
次は、WebページからHTMLを取得するコード[3]を以下に記述します。

from bs4 import BeautifulSoup
def soup(html):
    return BeautifulSoup(html, "html.parser")

これもまた3行でできてしまいました。
取得できた結果は、以下のようになります。

<中略>
<!--
                                ....JgNNMMMMMMMN;
                           ..gNMMMMMMMH""""77TMM#
                      ..&MMMMMH""!            dMM[
                   .(NMMMB"!                  ,MM#
                ..MMMM"!                       dMM;
              .gMMMY`            .+g,    .gg,  (MMb
            .dMM#=               MMMM:  .MMMM~  MMN.
           (MM#^                  ?7` ` ` ?!    JMM]
         .MMMY                                  .MMN
        .MM#!             ..JJ-..............((+NMMM:
       .MM@              .MMMMMMMMMMMMMMMMMMMMMMMB"!
      .MM@             .dMMD
     .MM#             .dMMC
     jMM%             dMM%                                  < 仲間募集!
    .MM#             .MMF                                       http://www.minma.jp/recruit/
    .MMb             JMM\
    .MMb             (MML
    .MMN              dMMm.                   ..gMM]
     dMM]              ?MMMNgJ...      ...(JgMMMMMMb
      WMM,               _TMMMMMMMMMMMMMMMMMMB"!.MMb`
       TMMm.                  _??77"777?!`      .MMb
        (MMMm,                               `..(MMb
          ?WMMNa...                    ....&NMMMMMB!
             ?WMMMMMNNgggJJ(((JJ&gggNMMMMMMM#"=!
                 ?7TWHMMMMMMMMMMMMMHB""7!
-->
<中略>

次は、取得したHTMLから<p>を取得してくるコードを以下に記述します。

def getPTags(soup):
    return soup.find_all("p")

今度は2行でできてしまいました。
結果は以下のようになります。

<span class="tag">特集</span></p>
<p class="text-sub">年末大掃除</p>
<p class="ttl">がんばらない大掃除<br/>のススメ2018</p>
<span class="tag">特集</span><span class="new">NEW</span></p>
<p class="text-sub">かゆいところに手がとどく</p>
<p class="ttl">引越し関連サービス</p>
<span class="tag">マガジン</span></p>
<p class="text-sub">利用者の声</p>
<p class="ttl">くらしのマーケットとメルカリで引越しが完結した!</p>
<span class="tag">マガジン</span></p>
<p class="text-sub">利用者の声</p>
<p class="ttl">引越しの救世主!?直前予約でもスムーズに引越せた!</p>
<span class="tag">マガジン</span></p>
<p class="text-sub">利用者の声</p>
<p class="ttl">最初は友人の紹介で。僕も友人に紹介してます!</p>
<以下略>

次は、取得した<p>から、文章するコード[3]を以下に記述します。

def getStrings(tags):
    string = ""
    for p_tag in p_tags:
        string += re.sub(r'<.*?>','', str(p_tag)) + “\n”
    return string

上記のコードでは、<.*?>という正規表現でタグのみを空の文字列と入れ替えています。
結果は以下のようになります。

特集
年末大掃除
がんばらない大掃除のススメ2018
特集NEW
かゆいところに手がとどく
引越し関連サービス
マガジン
利用者の声
くらしのマーケットとメルカリで引越しが完結した!
以下略

次は、MeCabを使って、形態素解析をしてみましょう。
しかし、そもそも形態素解析とはなんでしょうか?

コンピューターの自然言語処理の一。与えられた文章を、辞書データなどを用いて形態素の単位に区切り、品詞を判別する処理。[4]

らしいです。
では早速上記で得られた結果を用いて形態素解析をしてみましょう。
MeCabを利用した形態素解析を行うプログラムを以下に記述します。

    mecab = MeCab.Tagger ("-Ochasen")
    mecab_string = mecab.parse (string)
    for ms in mecab_string.split("\n"):
        word = ms.split("\t")[0]

結果は以下のようになります。

特集
年末
大
掃除
がんばら
ない
大
掃除
の
ススメ
2018
特集
NEW
かゆい
ところ
に
手
が
とどく
引越し
関連
<以下略>

どうやら、Pythonを使ってMeCabとBeautifulSoupをおいしくいただくことができました。

今回ご紹介したようなクローラーを使えば、Webページ上のデータを取得して、様々な分野のトレンドなどの情報収拾に利用できたりするかもしれません。
同時に複数のページを解析するのはどうするの?とか、HTMLの解析で複数のタグに囲まれている要素はどうするの?とかはまた別のお話

最後に

私たちテックチームでは「くらしのマーケット」を一緒に作る仲間を募集しています。

Pythonを使って開発をしたいな」
「火鍋一緒に食べたいな」

ご興味のある方、ご応募お待ちしております。 http://www.minma.jp/careers/

「話だけ聞きたい!」ってことでオフィスに遊びにきていただくことも可能です。 話を聞いてみる / みんなのマーケット株式会社

お気軽にご連絡ください!

参考文献

[1] https://www.seohacks.net/basic/terms/crawler/
[2] https://docs.python.jp/3/howto/urllib2.html
[3] https://qiita.com/itkr/items/513318a9b5b92bd56185
[4] https://kotobank.jp/word/%E5%BD%A2%E6%85%8B%E7%B4%A0%E8%A7%A3%E6%9E%90-3115