/moz-screenshot

Primary LanguagePythonMIT LicenseMIT

moz-screenshot

mozkzki codecov Maintainability

指定したサイトのスクリーンショットやテキスト要素を取得するライブラリ。

Function

  • screenshot
  • get_text

Requirements

  • Chrome (headless-chromiumでもよい)
    • Lambdaでserverless-chromeを使う場合はバージョンの組合せに注意
    • MacにGoogle Chrome Canaryhomebrewでインストール
# install
brew install Caskroom/versions/google-chrome-canary
# install 確認
/Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary --version
# install 確認
/usr/local/bin/chromedriver -v

scripts/install.shも参照

Usage

Environmental variables

.envファイルに書いてproject rootに配置。.env_sampleをコピーすると楽。

CHROME_BINARY_LOCATION='/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary'
CHROME_DRIVER_LOCATION='/usr/local/bin/chromedriver'

Install

pip install git+https://github.com/mozkzki/moz-screenshot
# upgrade
pip install --upgrade git+https://github.com/mozkzki/moz-screenshot
# uninstall
pip uninstall moz-screenshot

Coding

スクリーンショット取得

Yahoo天気予報がscreenshot.pngに保存される。

from moz_screenshot import screenshot
screenshot(
    "https://weather.yahoo.co.jp/weather/jp/13/4410.html",
    "//div[@class='forecastCity']/table/tbody/tr/td/div",
    out_file="./screenshot.png",
)

テキスト要素取得

from moz_screenshot import get_text
text = get_text(
    "https://weather.yahoo.co.jp/weather/jp/13/4410.html",
    "//div[@class='forecastCity']/table/tbody/tr/td/div/table/tbody/tr[2]/td[3]",
)
print(text)

Develop

base project: mozkzki/moz-sample

Prepare

poetry install
poetry shell

Run (Example)

python ./examples/example.py
# or
make start

Unit Test

test all.

pytest
pytest -v # verbose
pytest -s # show standard output (same --capture=no)
pytest -ra # show summary (exclude passed test)
pytest -rA # show summary (include passed test)

with filter.

pytest -k app
pytest -k test_app.py
pytest -k my

specified marker.

pytest -m 'slow'
pytest -m 'not slow'

make coverage report.

pytest -v --capture=no --cov-config .coveragerc --cov=src --cov-report=xml --cov-report=term-missing .
# or
make ut

Lint

flake8 --max-line-length=100 --ignore=E203,W503 ./src
# or
make lint

Create API Document (Sphinx)

make doc

Update dependency modules

dependabot (GitHub公式) がプルリクを挙げてくるので確認してマージする。

  • 最低でもCircleCIが通っているかは確認
  • CircleCIでは、最新の依存モジュールでtestするためpoetry updateしてからtestしている
  • dependabotはpyproject.tomlpoetry.lockを更新してくれる

AWS Lambda で使う場合

注意点

  • serverless-chromechromedriverをLambda Layerに上げる必要あり(参照)
  • フォントがないと文字化けする
    • デプロイパッケージのルートに.fontsディレクトリを作成してフォントを格納する(参照)
    • なお、CircleCI等でも同様だが、同じく~/.fontsに置くかインストールすれば良い

serverless-chromeについて

Chrome を AWS Lambda で動作させる場合に利用できる。

環境変数

Lambda Layerではchrome等が/opt/に配置される。 .envは下記のようにする。

CHROME_BINARY_LOCATION='/opt/headless/python/bin/headless-chromium'
CHROME_DRIVER_LOCATION='/opt/headless/python/bin/chromedriver'