山傘のプログラミング勉強日記

プログラミングに関する日記とどうでもよい雑記からなるブログです。

Pythonクローリング&スクレイピング[増補改訂版] ―データ収集・解析のための実践開発ガイドー その5

第3章 ライブラリによる高度なクローロング・スクレイピング

feedparser で RSS を解析

feedparser は RSS1.0 や RSS2.0 などに対応しているので、RSS のフォーマットの種類を気にせずにスクレイピングを行えます。

import feedparser

# はてなブログのテクノロジーカテゴリーの RSS
rss = feedparser.parse('https://b.hatena.ne.jp/hotentry/it.rss')

for entry in rss.entries:
  print(entry.link, entry.title)

SQLite3

スクレイピングで得たデータを保存するためにリレーショナルデータベースを使います。Python には標準ライブラリとして sqlite3 が組み込まれています。

import sqlite3

conn = sqlite3.connect('world_population.db')
cur = conn.cursor()

# excute()メソッドでSQL文を実行する
# country テーブルがあるとき削除する
cur.execute('DROP TABLE IF EXISTS countries')

# country テーブルを作成
cur.execute("""
  CREATE TABLE countries (
    rank integer,
    country text,
    population integer
  )
""")

cur.execute('INSERT INTO countries VALUES (?, ?, ?)', (1, '中国', 1411))

# パラメータを辞書で指定する
cur.executemany('INSERT INTO countries VALUES (:rank, :country, :population)', [
  {'rank': 2, 'country': 'インド', 'population': 1324},
  {'rank': 3, 'country': 'アメリカ', 'population': 322},
])

conn.commit()

cur.execute('SELECT * FROM countries')
for row in cur.fetchall():
  print(row)

conn.close()

MySQL

クライアント・サーバー型のリレーショナルデータベースの MySQL を使います。SQLite よりも大規模なデータに対して性能が発揮できることが特徴です。

データベースとユーザの登録

mysql を起動してデータベースとユーザを登録します。root ユーザで MySQL サーバに接続するときは、MySQL をインストールしたときに設定したパスワードが必要になります。

CREATE DATABASE scraping DEFAULT CHARACTER SET utf8mb4;
CREATE USER scraper@localhost IDENTIFIED BY 'password';
GRANT ALL ON scraping.* TO scraper@localhost;
PythonMySQL を利用
import MySQLdb

conn = MySQLdb.connect(db='scraping', user='scraper', passwd='password', charset='utf8mb4')

cur = conn.cursor()
cur.execute('DROP TABLE IF EXISTS countries')
cur.execute("""
  CREATE TABLE `countries` (
    rank integer,
    country text,
    population integer
  )
""")

cur.execute('INSERT INTO `countries` VALUES (%s, %s, %s)', (1, '中国', 1411))

# パラメータを辞書で指定する
cur.executemany('INSERT INTO `countries` VALUES (%(rank)s, %(country)s, %(population)s)', [
  {'rank': 2, 'country': 'インド', 'population': 1324},
  {'rank': 3, 'country': 'アメリカ', 'population': 322},
])

conn.commit()

cur.execute('SELECT * FROM `countries`')
for row in cur.fetchall():
  print(row)

conn.close()

感想

データベースは異なっても共通している文法なので、一つの SQL の使い方を覚えれば他のデータベースも使えるようになると思いました。