Information High

勉強に使ったり、仕事で詰まったIT技術の備忘録

PythonとSeleniumでスクレイピング:その① SeleniumIDEの追加

はじめに

PythonSeleniumをつかって、Webページから情報を取り出せるようにします。

まず今回はSelenium IDEChromeに追加し、簡単な動作を確認するところまでです。

Selenium IDEで操作を記録すると「excelマクロの記録」のようにどんな処理をしたのかが見れるようになります。

操作の記録を見るとPythonでプログラムを書くときに、何を指示すればいいのかがわかりやすくなります。

 

Selenium IDEって?

Selenium IDEはブラウザ操作を記録・再現できるChromeFirefoxで利用可能な拡張機能(アドオン)です。

ブラウザ上の操作を記録して、UIテストを自動化するのが主な使い方です。

・・・が、操作を記録できるし、タグの情報をPythonで簡単に読み込んだりできるので、スクレイピングにも使えます。

 

Selenium IDEをインストールする

インストール方法はとても簡単。

chromeウェブストアから"Selenium IDE"を検索し、「chromeに追加」をクリックするだけです。

https://chrome.google.com/webstore/search/selenium%20ide?hl=ja

f:id:ky_orihara:20190410234835p:plain

そうすると、アドレスバーの横にSelenium IDEのアイコンが追加されます。

f:id:ky_orihara:20190410235133p:plain

 

思ったよりも画面が増えたので、「その② Selenium IDEで操作を記録する」に続きたいと思います。

Pythonで画像ファイルをリサイズする

はじめに

Pythonで画像ファイルのリサイズとファイル形式を変換して保管する方法の紹介です。
OpenCVを使う勉強の第1歩にしようと思っていたのですが、PIL(Python Image Library)が便利、ということで自分の備忘録として残しておくことにしました。
PILはPython2で終わってしまい、Python3ではPillowという名前で利用可能です。

ソースコード

画像を開いて、thumbnail()でリサイズするだけ。
縦横幅の最大値を指定しておけば、縦横比を維持したままで、どちらかの制限値にうまくかかるようにリサイズしてくれます。

# 画像処理モジュール "Pillow" で画像をリサイズする。
from PIL import Image

class resizePicture:

    # jpg形式ファイルの画像サイズを変更する
    def resizeImage(self, inputImage, outputImage, height, width):

        # 元画像読み込み
        imagePil = Image.open(inputImage)
        # リサイズ
        imagePil.thumbnail((width, height),resample=Image.BICUBIC)
        # 画像の保存
        imagePil.save(outputImage, quality=85)
    
    # pngファイルの画像サイズを変更し、jpg形式で保存する。
    def resizeImageWithConvert(self, inputImage, outputImage, height, width):

        # 元画像読み込み
        imagePil = Image.open(inputImage)
        # リサイズ
        imagePil.thumbnail((width, height),resample=Image.BICUBIC)
        # jpgに変換して保存
        convertPil = imagePil.convert('RGB')
        convertPil.save(outputImage, quality=85)

Pillowを使う前に

いつもどおりのパッケージのインストールが必要です。以下のコマンドでインストールしてください。

pip install Pillow

補足

リサイズ方法の指定

thumbnail()では ”resample=" でリサイズ方式が指定できます(省略可能)。
デフォルトはImage.NEARESTです。下に行くほど、高品質だけど、リサイズに時間がかかります。

  • Image.NEAREST : ニアレストネイバー法を使って圧縮する。
  • Image.BOX : (少し調べたけど、不明)
  • Image.BILINEAR : バイリニア法を使ってリサイズする。
  • Image.HAMMING : (少し調べたけど、不明)
  • Image.BICUBIC : バイキュービック法を使ってリサイズする。
  • Image.LANCZOS : ランツォシュ関数を使ってリサイズする。

保存時の画質

save()時に "quality=" でJPEGの品質を指定できます(省略可能)。
1~100で指定でき、デフォルトは75です。

Pythonでファイルをzipに圧縮する

はじめに

Pythonでzipファイルに圧縮する方法の紹介です。
まあ、正直いろんなサイトで紹介されているので、いまさら感はありますが。
前の記事とあわせてrar圧縮をzip圧縮に変更したかったので。

ソースコード

今回もいきなりソースコード
createZip()のメソッドを呼んでもらえば動きます。
第1引数=圧縮対象のフォルダ名、第2引数=zipファイルを出力するフォルダ名、第3引数=zipファイル名です。

import zipfile
from zipfile import ZipFile, ZipInfo
import os
import shutil

class createZip():

    # Zipファイルの作成
    def createZip(self, inputPath, outputPath, createFileName):
        zipTargets = []

        # 作成するzipファイルのフルパス
        zipfilepath = os.path.abspath(outputPath + createFileName)

        # walkでファイルを探し、圧縮対象のファイルリストに加えていく。
        for dirpath, dirnames, filenames in os.walk(inputPath):
            for filename in filenames:
                filepath = os.path.join(dirpath, filename)
                # 作成するzipファイルのパスと同じファイルは除外する
                if filepath == zipfilepath:
                    continue
                arc_name = os.path.relpath(filepath, os.path.dirname(inputPath))
                zipTargets.append((filepath, arc_name))
            for dirname in dirnames:
                filepath = os.path.join(dirpath, dirname)
                arc_name = os.path.relpath(filepath, os.path.dirname(inputPath)) + os.path.sep
                zipTargets.append((filepath, arc_name))

        # zipファイルの作成
        zip = zipfile.ZipFile(zipfilepath, 'w')
        for filepath, name in zipTargets:
                zip.write(filepath, name, zipfile.ZIP_DEFLATED)
        zip.close()

補足

といっても、だいたいコメントに書いてあるので自分の備忘としては圧縮方法の指定くらいかな。

圧縮方法の指定

zip.write()するときに圧縮方法の指定ができる。

  • zipfile.ZIP_STORED: 圧縮せず複数ファイルをまとめるだけ(デフォルト)
  • zipfile.ZIP_DEFLATED: 通常のZIP圧縮(要zlibモジュール)
  • zipfile.ZIP_BZIP2: BZIP2圧縮(要bz2モジュール)
  • zipfile.ZIP_LZMA: LZMA圧縮(要lzmaモジュール)

らしい。bz2, lzmaはなじみが無いので、通常のZIP圧縮(ZIP_DEFLATED)で圧縮することにした。
あと、圧縮なし(zipfile.ZIP_STORED)はtarみたいなイメージなのだと思うけど、ファイル単位で圧縮しないことができるって、どうやっているのか…
zipとかすでに圧縮済みのファイルをこれ以上圧縮しようとしても、時間がかかるだけで圧縮効率が悪いから圧縮なし(zipfile.ZIP_STORED)でまとめる。
と書いてあったので、使い道も「なるほど」といった感じ。

createZip()のメソッドを呼びかた

クラスにしているので、以下のようにインスタンスを作ってから呼んでください。

    czfClass = controlZipFile.createZip() #インスタンス生成
    czfClass.createZip(UNRAR_DIR_NAME, ZIP_OUTPUT_DIR, zipFileName)
 ||<

Pythonでrarファイルを解凍する

はじめに

rarfileのパッケージを使ってPythonでrarファイルを展開する方法の紹介です。
いろいろ嵌ったので、自分の備忘録も含んでいます。

ソースコード

とりあえず、結論としてはこんな感じで動きます。
extract(), extractall()は引数に展開先フォルダを指定できるので、必要に応じて設定してください。

import rarfile

# Set to full path of unrar.exe if it is not in PATH
# rarfile.pyでは unrar.exe があることを前提に動くので、
# パスを切っていなければパラメーターとして設定する。
rarfile.UNRAR_TOOL = r"D:\Unrar\Unrar.exe"

# Set to '\\' to be more compatible with old rarfile
rarfile.PATH_SEP = '/'

rf = rarfile.RarFile('D:\\Work\\TEST.rar')
# rarファイルを展開する
rf.extractall()

# ファイル情報を取得する場合
for f in rf.infolist():

    # rarファイルの内容を出力
    print(f.filename, f.file_size)

    # 1ファイルずつ展開
    # ただし、ディレクトリを展開すると、フォルダ構成がおかしくなるので、
    # 必要に応じて展開をスキップするようにすること。
    rf.extract(f.filename)

嵌ったこと(その他メモ)

その1. rarfileパッケージのインストール

rarfule.pyを使うためには、パッケージのインストールが必要です。以下のコマンドでインストールしてください。

pip install rarfile

そうすると、以下のようなメッセージが表示されてインストールが完了します。

Downloading https://files.pythonhosted.org/packages/de/a4/8b4abc72310da6fa53b6de8de1019e
100% |████████████████████████████████| 112kB 1.4MB/s
Building wheels for collected packages: rarfile
Running setup.py bdist_wheel for rarfile ... done
Stored in directory: C:\Users\XXXXX\AppData\Local\pip\Cache\wheels\dc\84\da\8aff50941f5
Successfully built rarfile
Installing collected packages: rarfile
Successfully installed rarfile-3.0

その2. unrar.exeのインストール

rarfileパッケージはファイルの展開時にunrar.exeがあることを前提に動作します。
unrar.exeへのパスを切っていない場合はパスを切るか、"rarfile.UNRAR_TOOL"パラメータでunrar.exeへのフルパスを定義する必要があります。
そもそも 「unrar.exeをインストールしていないよ」という方は以下からダウンロードしてください。
www.rarlab.com
・左のメニュー [ RAR ] - [ extras ] から [ UnRAR for Windows ] をクリックするとダウンロードできます。
・unrarw32.exe は自己解凍形式の圧縮形式のファイルなので、ダブルクリックして展開してください。unrar.exeが展開されます。

その3. rarfile.pyが動かない

今回一番嵌ったことです。本記事を書いている2019/2/19時点では、unrar.exeへのパスを定義してもunrar.exeの実行でエラーが発生します。
rarfile.pyの中でunrar.exeのコマンドラインを生成しているのですが、そのロジックに誤りがありそうです。
具体的には、860行目あたりの_extract()メソッドが以下のようになっているのですが、

    # call unrar to extract a file
    def _extract(self, fnlist, path=None, psw=None):
        cmd = [UNRAR_TOOL] + list(EXTRACT_ARGS)
        # pasoword
        psw = psw or self._password
        add_password_arg(cmd, psw)
        cmd.append('--')

こうしないと動きません。

    # call unrar to extract a file
    def _extract(self, fnlist, path=None, psw=None):
        #EXTRACT_ARGS = ('x', '-y', '-idq')
        cmd = [UNRAR_TOOL]
        cmd.append('x')
        cmd.append('-y')
        cmd.append('-idq')
        # pasoword
        psw = psw or self._password
        add_password_arg(cmd, psw)
        cmd.append('--')

listでEXTRACT_ARGSを設定しますが、Popen()にわたるときにcmdのリストの中にEXTRACT_ARGSのリストが設定され、リストが二重になっている状態と思われます。
そのため、python側でunrar.exeに渡す引数を上手く設定できていないようです。
回避策として、cmdにひとつづつ引数を渡すように変更しています。もう少し良い方法があるかもしれませんが、個人利用なので暫定対応としています。

・・・本当に最後の問題には時間をとられました・・・

VSCodeからPythonを実行できるようにする

今日やったことのメモ

Anacondaをインストールして、VSCodeでprint()だけのプログラムを書いたけれど、VSCodeのメニュ「ターミナルでPythonファイルを実行」を選んでも、結果がコンソールに出力されなかった。

「ターミナルでPythonファイルを実行」を実行したときに、"pythonw.exe"が実行されているのが原因でした。"python.exe"を実行するように変更して解決した。

 

設定方法

(1) VSCodeを起動します。

(2) [ファイル] - [基本設定] - [設定]をクリックします。(もしくは「Ctrl + ,」)

f:id:ky_orihara:20190212023758p:plain

(3) 検索ウィンドウにPythonpathと入力すると、Python関連のPath設定のみが表示されます。

 下の方に「Python: Python Path」があるので、これに"python.exe"を指定します。

f:id:ky_orihara:20190212024652p:plain

以上です。設定が保存されると、次回からは"pythonw.exe"ではなく、"python.exe"を使って .py ファイルを実行してくれるようになります。

 

そもそも、"pythonw.exe"って・・・?

PythonwはRun Python without a terminal windowという意味です。

・・・え?パス設定をデフォルト設定に任せると、ターミナルなしなの・・・?

 

Anacondaをインストールする

はじめに

anacondaはPythonディストリビューションです。

anacondaをインストールすることで各種ライブラリや開発用のツールが同時にインストールされるため、簡単にPythonの開発環境を構築できます。

余談ですが、ディストリビューションGoogle検索してみると、コトバンクが一番上に出てきます。が、ASCII.jpデジタル用語辞典の結果が優先されて「Linuxの配布形態のこと」とLinuxに限定してくるので「なんだかなあ」といった感じです。

ここでは、Wikipediaの「ソフトウェアディストリビューション=コンパイル済みで設定済みのソフトウェアの集まり。」が正しい意味になります。

 

余談のほうが長かったですが、インストール方法の説明に行きたいと思います。…といっても、これまた画面指示に従うだけですが。

 

続きを読む

Pythonをインストールする

はじめに

Pythonはデータ分析や機械学習などのライブラリが豊富にそろっているため、最近使用率が増加しているようです。うちの周りでは何も聞かないのが寂しいですが。

 

2018年12月にGitHubの発表した人気プログラミング言語で3位、2018年11月に日経SYSTEMSのプログラミング言語利用調査で4位と、確かに使われていることが見受けられます。(ちなみに日経の調査ではCとC++がひとまとめになっていたので、CとC++を分けるとPythonが3位になるのかもしれません。)

 

というわけで、勉強のためにPythonをインストールします。

 

続きを読む