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 ファイル保存部分を追加します。

  1. ライブラリを取り込み

    Python 標準関数 csv ライブラリを取り込みます。
    import csv

  2. 書き込み予定 csv ファイルを開く

    書き込み予定の sc_books.csv ファイル(名前は適当に)を開きます。
    with open('sc_books.csv', 'w', newline='',encoding='cp932') as f:

  3. 辞書型リストデ-タを 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)
    # &copy とか &lt のような表現が含まれている場合は元に戻す。
    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 を作成する事ができました。
引き続き、このファイルの動作確認をします。


  • 正規表現スクレイピング抜粋デ-タファイル動作確認 に進む
  • 正規表現スクレイピングファイル作成 に戻る
  • Web ペ-ジから必要デ-タを抜粋 に戻る
  • Python スクレイピング概要 に戻る
  • 70VPS に戻る