Python スクレイピング
抜粋したデ-タをファイル保存
ここまでで、正規表現スクレイピングファイルを作成しました。
引き続き、抜粋したデ-タをファイルに保存します。
ファイル保存するとデ-タを活用しやすくなります。
まず手軽な方法として、テキストファイルの CSV 形式で保存します。
Python の標準ライブラリに csv モジュールがありますのでこれを利用します。
csv.writer を使うと簡単に CSV 形式で出力できます。
1行を出力する
writerow() メソッドを使用するときは
list 型や tuple 型のデ-タを( )内の引数として指定します。
改行コ-ド自動変換抑制
注意すべき点は、改行コ-ドです。
csv.writer は Excel 互換の形式で出力します。
Unix 系の OS においてもファイルの改行コ-ドとして CRLF を使用します。
異端児なのです。
一方、 Unix 系の OS において open() 関数で普通にファイルを開くと、出力時に
改行コ-ド LF に自動変換されてしまいます。
よって、改行コ-ドの自動変換を抑制する必要があります。
open() 関数でファイルを開く際に、newline='' とすると自動変換を抑制できます。
CSV/TSV ファイルのエンコ-ディング
Python の open()関数でファイルを開いて保存する際一般的な Unix 系 OS の
デフォルトエンコ-ディングは UTF-8 です。
UTF-8 でエンコ-ドされた CSV(カンマ区切り) TSV(タブ区切り)ファイルを Excel
で開くと文字化けする事があります。
文字化けしないようにする完璧な方法はないのですが、
エンコ-ディング値を cp-932 として使用可能な文字を限定して
Excel で文字化けしないようにします。
CP932 とは Shift_JIS に拡張文字を追加した文字コ-ドです。
具体的には
with open('file.csv', 'w', newline='', encocoding='cp932') as f:
とします。
抜粋デ-タ保存ファイル作成
それでは抜粋デ-タ保存ファイルを作成していきます。
正規表現スクレイピングファイル作成
のなかで sc_rape_re-3.py ファイルを作成し
books のなかに辞書型で url と title のデ-タをつくりました。
今回はこれを CSV ファイルとして保存します。
sc_rape_re-3.py の後半に CSV ファイル保存部分を追加します。
- ライブラリを取り込み
Python 標準関数 csv ライブラリを取り込みます。
import csv
- 書き込み予定 csv ファイルを開く
書き込み予定の sc_books.csv ファイル(名前は適当に)を開きます。
with open('sc_books.csv', 'w', newline='',encoding='cp932') as f: - 辞書型リストデ-タを CSV 形式で保存
デ-タ books は辞書型リストデ-タですので、この場合は
コンストラクタ csv.DictWriter()
の第二引数 fieldnames に書き込む辞書のキーのリストを指定します。
writer = csv.DictWriter(f,['url', 'title'])
次に、
writeheader() メソッドで fieldnames('url'と'title')
をヘッダーとして書き込みます。
writer.writeheader()
行の書き込みは writerow() を使用して引数に辞書型デ-タ名を指定します。
writer.writerows(books)
以上をまとめると以下のようになります。
import csv
with open('sc_books.csv', 'w', newline='',encoding='cp932') as f:
writer = csv.DictWriter(f,['url', 'title'])
writer.writeheader()
writer.writerows(books)
抜粋デ-タ JSON 形式で保存
次に、抜粋デ-タを JSON 形式で保存してみます。
JSON 形式なら複雑なデ-タ構造でも手軽に扱うことができます。
Python で JSON 形式を扱うには標準ライブラリの json モジュ-ルを使います。
まずは書き込み先の適当な JSON ファイル名を開きます。
次に直接ファイルに保存するために json.dump() 関数をつかいます。
この関数の第1引数には辞書型デ-タ(今回は books) を指定します。
with open('sc_books.json', 'w') as f: json.dump(books, f)
保存した JSON デ-タの確認
引き続き保存した JSON デ-タ sc_books.json の中身を確認します。
sc_books.json ファイルを開きます。
f = open("sc_books.json", "r")
"r" は read 読み出しの意味です。
data = json.load(f)
data のなかに json ファイルの内容が移されました。
JSON デ-タの表示
Python の標準ライブラリである pprint(pretty-print) モジュールを使うとリスト(list 型)や辞書(dict 型)
などのオブジェクトをきれいに整形して出力・表示することができます。
import pprint
print("json file 確認<br>")
pprint.pprint(data)
抜粋デ-タ JSON 形式で保存部分をまとめると以下のようになります。
import json
with open('sc_books.json', 'w') as f:
json.dump(books, f)
f = open("sc_books.json", "r")
data = json.load(f)
import pprint
print("json file 確認 <br>")
pprint.pprint(data)
正規表現スクレイピング抜粋デ-タファイル保存
それでは正規表現スクレイピングで抜粋したデ-タをファイル保存するまでを一つにまとめてみます。
出だしは
正規表現スクレイピングファイル作成
のなかの sc_rape_re-3.py ファイルです。
これに、抜粋デ-タ保存ファイルを継ぎ足します。
まとめると以下のようになります。
#!/usr/bin/python3
#coding: utf-8
print("Content-type: text/html; charset=UTF-8\n\n")
import re
from html import unescape
from urllib.parse import urljoin
# sc_re_hd_enc.py でダウンロードしたファイルを開き
# 中身を変数 html に格納
with open('sc_dp.html') as f:
html = f.read()
books = []
ref = r'<a itemprop="url".*?</ul>\s*</a></li>'
ref1 = r'<a itemprop="url" href="(.*?)">'
ref2 = r'<p itemprop="name".*?</p>'
par0 = re.findall(ref, html, re.DOTALL)
for par in par0:
url = re.search(ref1, par).group(1)
# URL を相対から絶対に変換
url = urljoin('https://gihyo.jp/', url)
# 書籍名は itemprop="name" 属性を持つ p 要素から取得
title = re.search(ref2, par).group(0)
# br タグをスペースに置換 str.replace() は文字列を置換
title = title.replace('<br/>', ' ')
# タグを取除く。
title = re.sub(r'<.*?>', '', title)
# © とか < のような表現が含まれている場合は元に戻す。
title = unescape(title)
books.append({'url': url, 'title': title})
#print(books)
#----ここまでが sc_rape_re-3.py ----
import csv
with open('sc_books.csv', 'w', newline='',encoding='cp932') as f:
writer = csv.DictWriter(f,['url', 'title'])
writer.writeheader()
writer.writerows(books)
#CSV ファイル作成完了
import json
with open('sc_books.json', 'w') as f:
json.dump(books, f)
f = open("sc_books.json", "r")
data = json.load(f)
import pprint
print("json file 確認 <br>")
pprint.pprint(data)
#JSON ファイル作成確認完了
本内容を TeraPad 等で作成したら、ファイル名を適当に
sc_rape_re-4.py
として保存します。
文字コ-ドは、UTF-8N
BOM なし
改行コ-ドは、LF
です。
保存先はホスト Wimdows OS の 共有フォルダ c:\vb_public_html にして、
ブラウザでアクセスできるようにします。
なお、
c:\vb_public_html
はゲスト OS Ubuntu のなかの
/home/yamada/public_html
とリンクしていて共有フォルダの関係にあります。
詳細は
ユ-ザ-ごとの公開ディレクトリを用意する
を読んでみてください。
ここまでで、正規表現スクレイピング抜粋デ-タファイル sc_rape_re-4.py を作成する事ができました。
引き続き、このファイルの動作確認をします。