Python
初心者
BeautifulSoup
CSSセレクタ

Pythonによるスクレイピング&機械学習のお勉強その1-3 - CSSセレクタについて

今回の目標

このシリーズでは教科書(文献1)に沿ってPythonによるスクレイピングと機械学習を学びます。今回は第1章「クローリングとスクレイピング」から1-3「CSSセレクタについて」を学びます。

原則、教科書のサンプルプログラムを作成してゆきますが、著作権に配慮し、できるだけそのままではなく類題を作成して勉強してゆく方針です。

方法と結果

  • 準備

その0で作成した学習用docker環境でpythonの実行を行います。
BeautifulSoup4はdocker環境にインストール済です。

$ docker run -t -i -v $HOME/src:$HOME/src pylearn2 /bin/bash

類題1-3

この節ではいくつかサンプルプログラムがありましたが、Pythonプログラムの練習と言うよりはすべてCSSセレクタの書き方だったので、類題コードは一つにまとめました。題材としてはもっともデータ量が豊富な、青空文庫を使った最初のサンプルプログラムを改変して類題とします。
前回記事から使い始めた自作のpylearnライブラリを使用してコードを短縮します。今回、pylearn内で使用しているrequestsライブラリのエンコーディングがおかしい問題を修正したので改めて掲載します。

pylearn.py
# -*- coding: utf-8 -*-

# pylearn.py Python学習のための頻出機能ライブラリ

# 変更履歴
# v1 ファイル読み込みを追加
# v2 ダウンロードを追加
# v2.1 requestsライブラリのエンコーディングが間違っていることがある問題に対処

import requests

#ファイルを読み込み、内容を返す
def readFile(filename):
    try:
        with open(filename, 'r') as fp:
            return fp.read()
    except:
        print('readFileでファイル読み込みに失敗しました: ', filename)

#URLを指定し、データのダウンロードを行う requestsライブラリを使用
def download(URL, getparam={}, text=True):
    try:
        response = requests.get(URL, getparam)
        if response.status_code == 200:
            if text == True:
                if response.apparent_encoding != '':
                    response.encoding = response.apparent_encoding
                return response.text
            else:
                return response.content
    except:
        print('ダウンロード失敗。ステータスコード=', response.status_code)
        raise IOError

if __name__ == '__main__':
        print('''Do NOT use this file as main program.
 Usage: 
 import pylearn''')

sel-souseki-cclef.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pylearn as pl
import random
from bs4 import BeautifulSoup as bs

#乱数の初期化
random.seed()

#青空文庫の夏目漱石ページ
url = 'http://www.aozora.gr.jp/index_pages/person148.html'

#HTMLのダウンロード
html = pl.download(url)

#保存
with open('person148.html', 'w') as fp:
    fp.write(html)

#soup
soup = bs(html, 'html.parser')

#ランダムなタイトルの抽出
list = soup.select('ol > li')
r = random.randint(0, len(list))
print(list[r].a)

#イメージタグの抽出
imglist = soup.select('img')
print(imglist)
  • 実行結果
$ python ././sel-souseki-cclef.py
<a href="../cards/000148/card2313.html">『東洋美術図譜』</a>
[<img align="middle" alt="wikipediaアイコン" border="0" height="32" src="../images/wikipedia_logo_rounded.png" width="110"/>]

今回達成したこと

  • CSSセレクタを用いたスクレイピングの基本を学んだ。

高度なセレクタの記法については必要になった時点でまた学ぶ必要がありそうです。

参考文献

  1. クジラ飛行机, Pythonによるスクレイピング&機械学習[開発テクニック], ソシム株式会社, 2016