Python スクレイピング

正規表現スクレイピングファイル作成

ここまでで、正規表現スクレイピングファイルを作成する準備が整いました。
ここからは、このファイルを具体化していきます。

  1. お決まりの作法

    Pyton がインスト-ルされている場所を示めします。
    #!/usr/bin/python3
    Pyton3 のインスト-ル場所がわからない場合は
    $ which python3
    で知ることができます。
    ファイルで使用する文字コ-ドを設定します。
    #coding: utf-8
    HTTP ヘッダーを出力
    print("Content-type: text/html; charset=UTF-8\n\n")
    これで Python から出力された文字は Web で見ることができるようになります。

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

    取り込む必要があるライブラリは3つあります。
    import re
    html のなかにある unescape ライブラリ
    from html import unescape
    & で始まり ; で終わる文字の処理に必要
    urllib.parse のなかにある urljoin
    from urllib.parse import urljoin
    相対 URL → 絶対 URL 変換処理に必要

  3. ダウンロードファイルを開く

    sc_re_hd_enc.py でダウンロードした sc_dp.html ファイルを開き その中身を変数 html に格納します。
    with open('sc_dp.html') as f: html = f.read()

  4. re.findall( )を使って必要部分を取得

    書籍の URL とタイトルを大きく抜粋するための正規表現 ref は
    ref = r'<a itemprop="url".*?</ul>\s*</a></li>'
    この正規表現を使用してre.findall()を利用して、 書籍1冊に相当する部分の HTML を取得します。
    par0 = re.findall(ref, html, re.DOTALL)
    re.DOTALL フラグ指定をすることで改行にもマッチさせます。

  5. re.search( )を使って URL を取得

    書籍の URL 抜粋するための正規表現 ref1 は
    ref1 = r'<a itemprop="url" href="(.*?)">'
    ここで、部分マッチを行なうために括弧付で、 (.*?) になっている点に注意してください。
    この正規表現を使用して re.search( )を利用して、
    書籍1冊に相当する部分の par の中から URL を取得します。
    url = re.search(ref1, par).group(1)
    group(1) とすると par においてマッチした( )内の .*? の内容が取得されるのでしたね。
    取得した url は、urllib.parse のなかにある urljoin 関数をつかって 相対 URL を絶対 URL に変換しておきましょう。
    url = urljoin('https://gihyo.jp/', url)

  6. re.search( )を使って書籍タイトルを取得

    書籍のタイトルを抜粋するための正規表現 ref2 は
    ref2 = r'<p itemprop="name".*?</p>'
    この正規表現を使用して re.search( )を利用して、
    書籍1冊に相当する部分の par の中から書籍名 title を取得します。
    title = re.search(ref2, par).group(0)
    group(0) とすると par においてマッチした全部の内容が取得されるのでしたね。
    title の中には br タグが含まれていますので、これをスペースに置換ます。
    str.replace() を使うと文字列を置換えてくれます。
    title = title.replace('<br/>', ' ')
    次に、title 内の不要となるタグを取除きます。
    title = re.sub(r'<.*?>', '', title)
    書名のて中には
    &copy とか &lt
    のような表現が含まれている場合があります。
    これは元に戻して、
    © とか <
    の表示にする必要があります。
    unescape ライブラリを使用して正しい表示にします。
    title = unescape(title)

  7. for 分で複数の書籍 URL と書名を抜粋

    ここまで、1冊分の書籍 URL と書名を抜粋することができますが まだ複数の書籍には対応できていません。
    for 文を使ってこれに対応していきます。
    なお books はこのあと抜粋したデ-タをファイルに保存するために必要となります。


以上をまとめると以下のようになります。


  #!/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)

本内容を TeraPad 等で作成したら、ファイル名を適当に
sc_rape_re-3.py
として保存します。
文字コ-ドは、UTF-8N
BOM なし
改行コ-ドは、LF
です。
保存先はホスト Wimdows OS の 共有フォルダ c:\vb_public_html にして、 ブラウザでアクセスできるようにします。
なお、
c:\vb_public_html
はゲスト OS Ubuntu のなかの
/home/yamada/public_html
とリンクしていて共有フォルダの関係にあります。
詳細は ユ-ザ-ごとの公開ディレクトリを用意する を読んでみてください。

sc_rape_re-3.py ファイル動作確認

それでは sc_rape_re-3.py ファイルを実行してみましょう。
Ubuntu ディスクトップにある □>_ アイコンから端末画面を開き、 public_html ディレクトリに移動します。
yamada@ubuntu-20:~$ cd public_html
私の Virtual Ubuntu も 20.04LTS にアップグレ-ドしてしまいました。
yamada@ubuntu-20:~/public_html$ python3 sc_rape_re-3.py
として確認します。

   
  [{'url':
  'https://gihyo.jp/dp/ebook/2020/978-4-297-11683-5',
  'title': 'ITエンジニアのやさしい法律・・・・'},
   {'url':
  'https://gihyo.jp/dp/ebook/2020/978-4-297-11679-8',
  'title': '情報処理技術者試験 要点確認・・・'}, 
   ~~~~~]

のように表示されれば OK です。
WEB で表示する前にエラ-がないことを確認してください。
エラ-がなければ、WEB でも表示してみましょう。
ブラウザのアドレスバーに
http://v-host.jp/sc_rape_re-3.py
または
http://localhost:8080/~yamada/sc_rape_re-3.py
と入力して、画面に同じように表示されれば OK です。

ここまでで、正規表現スクレイピングファイルを作成する事ができました。
引き続き、抜粋したデ-タをファイル保存します。


  • 抜粋したデ-タをファイル保存 に進む
  • Web ペ-ジから必要デ-タを抜粋 に戻る
  • Python スクレイピング概要 に戻る
  • 70VPS に戻る