helium

WEBスクレイピングを行うモジュール。

WEBスクレイピングモジュールにはseleniumがあるが、それをWrapperにして簡単なコードで使えるようにしたのがheliumということである。

heliumドキュメント

インストール

py -m pip install helium

インポート

from helium import *

Firefoxのバックグラウンドでの実行

driver = start_firefox(‘https://palmtrotter.kudos.jp/’, headerless=True)
  • “headerless=True”を指定すると、FirefoxがBackgroundで実行されて画面が開かないようになる。

クリック

click(‘ログイン’)    # 画面上のリンク名をクリックする。
press(ENTER)    # ENTERをクリックする。
  • ページを移動するには、クリックするボタンの名前をclick関数に指定すればよい。
  • ENTERキーは”press(ENTER)”を実行する。

ログイン情報の入力

write(‘member’, into=’ユーザー名またはメールアドレス’)
  • ログイン情報を入力するには、ページソースの入力フィールドのLabelの内容を入れてwriteする。(ブラウザーのフィールドに表示されている名前)

要素の抽出

joukyou = find_all(S('ul > li'))
  • “ul”の中にある”li”だけを抽出する。HTMLタグが使える。
  • HTMLタグのネストを”>”でつないでいけば、特定のエレメントだけを抽出することができる。
    • “find_all(S…)”はリストを生成し、リストの各要素のデータタイプはhelium特有の”helium.S”である。

抽出した要素のリスト化

items = [item.web_element.text for item in lists]
  • listsから順番にitemを選択して、Seleniumの関数でテキストだけを抽出してリスト化する。

collections.deque

deque型のデータを扱うことができる。dequeは、”double-ended queue”の略語で「デック」と呼ぶ。

Deque はどちらの側からも 効率よくappend と pop が可能であるが、両端以外の要素へのアクセスが遅いというデメリットもある。

リストでも同様の操作ができるが、固定長のデータを高速に操作することに特化しており、内部のデータ表現形式のサイズと位置を両方変えるようなpop(0) やinsert(0,v) などの操作ではメモリ移動のために効率が悪い。

標準ライブラリー

コンテナデータ型

インポート

from collections import deque

dequeの生成

input_deque = deque(file1.readlines())

pop

リストのpop()と異なり、引数に位置を指定することはできない。

pop()

末尾(右側)から1つ要素を削除して、その値を返す。

input_line = input_deque.pop() 

popleft()

先頭(左側)から1つ要素を削除して、その値を返す。

input_line = input_deque.popleft() 

PyCryptodome

暗号化モジュールPyCryptodomeを使った暗号化である。

ドキュメント

PyCryptodome

Crypto.Cipher

AES暗号化を行なう。

インストール

pip install pycryptodome

インポート

from Crypto.Cipher import AES

暗号化

平文ファイル全体を読み込んで、一括で暗号化して、nonce, tagと一緒に暗号化ファイルに書き出す。

# Read Input File
with open(filename, 'rb') as file1:
    input_data = file1.read()    # Read Original File as Binary

# Encryption
cipher = AES.new(key, AES.MODE_EAX)
ciphertext, tag = cipher.encrypt_and_digest(input_data)

# Write New File from Encrypted Data 
with open(filename+suffix, 'wb') as file2:
    # nonce and tar are 16 bytes
    [ file2.write(data) for data in (cipher.nonce, tag, ciphertext) ]
  • ファイルに書き出すところはリスト内包表記を使った。
  • nonce, tag, encrypted_dataの順番を読み出す時に間違わないようにすること。

復号化

暗号化ファイル全体を読み込んで、nonce, tag, 暗号化データを抜き出して一括で復号化して、平文ファイルに書き出す。

with open(filename, 'rb') as file1:
    input_data = file1.read()    # Read Original File as Binary
        
# nonce and tar are 16 bytes.
nonce = input_data[0:16]
tag = input_data[16:32]
ciphertext = input_data[32:]

cipher = AES.new(key, AES.MODE_EAX, nonce)
output_data = cipher.decrypt_and_verify(ciphertext, tag)

with open(filename.replace(suffix,''), 'wb') as file2:
    file2.write(output_data)
  • 上記暗号化で作成した暗号化ファイルを読み込んでいる。
  • nonce, tag, encrypted_dataの順番を書き込んだときと一致させること。

Crypto.Random

ランダムなバイト型を生成する。

インポート

from Crypto.Random import get_random_bytes

乱数生成(バイト型)

key = get_random_bytes(16)

glob

ファイル・ディレクトリーのパスの一覧をリスト型で取得する。

標準ライブラリー

glob — Unix 形式のパス名のパターン展開

インポート

import glob

ワイルドカードとrecursiveによるファイルのリスト

“*”を使って、該当するすべてのファイルのリストを返す。(1つ下の階層の*.csvを出力する例。)

glob_out = glob.glob(work_directory+'/*.csv', recursive=True)
  • *;一階層のワイルドカード
  • **:あらゆる階層のワイルドカード(ファイルだけでなくDirectoryも出力される。)