Python スクレイピング
正規表現スクレイピングファイル作成
ここまでで、正規表現スクレイピングファイルを作成する準備が整いました。
ここからは、このファイルを具体化していきます。
- お決まりの作法
Pyton がインスト-ルされている場所を示めします。
#!/usr/bin/python3
Pyton3 のインスト-ル場所がわからない場合は
$ which python3
で知ることができます。
ファイルで使用する文字コ-ドを設定します。
#coding: utf-8
HTTP ヘッダーを出力
print("Content-type: text/html; charset=UTF-8\n\n")
これで Python から出力された文字は Web で見ることができるようになります。 - ライブラリを取り込み
取り込む必要があるライブラリは3つあります。
import re
html のなかにある unescape ライブラリ
from html import unescape
& で始まり ; で終わる文字の処理に必要
urllib.parse のなかにある urljoin
from urllib.parse import urljoin
相対 URL → 絶対 URL 変換処理に必要
- ダウンロードファイルを開く
sc_re_hd_enc.py でダウンロードした sc_dp.html ファイルを開き その中身を変数 html に格納します。
with open('sc_dp.html') as f: html = f.read() - 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 フラグ指定をすることで改行にもマッチさせます。 - 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) - 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)
書名のて中には
© とか <
のような表現が含まれている場合があります。
これは元に戻して、
© とか <
の表示にする必要があります。
unescape ライブラリを使用して正しい表示にします。
title = unescape(title) - 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)
# © とか < のような表現が含まれている場合は元に戻す。
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 です。
ここまでで、正規表現スクレイピングファイルを作成する事ができました。
引き続き、抜粋したデ-タをファイル保存します。