App Engineerの開発ノート

AWS、Flutterや開発活動に役立つツール作りなど

【Python】Webページの情報抽出するためにスクレイピングする

f:id:Simoroid:20210508094731p:plain
スクレイピングとはWebページに対して、DOM形式の情報を取得し、
ある特定の文字列をのみを抜き出したり、画像だけをダウンロードしたり、
情報の解析を行うことです。
今回はPythonでの実装方法に関してご紹介します!

なお、スクレイピングの過剰利用はアクセス先のサイトに対しての迷惑となったり違法となるケースがあるので気を付けてください。
https://topcourt-law.com/internet_security/scraping-illegal#i-10
https://qiita.com/n_oshiumi/items/b4efd1f40ec0a1b77376

◇ドライバーのダウンロード
chromeを開いてurlに「chrome://version/」を入力し、ブラウザバージョンの確認。
f:id:Simoroid:20210510011948p:plain
ドライバーをダウンロード、確認したブラウザバージョンと照合してサポートされているものを選択します。
https://sites.google.com/a/chromium.org/chromedriver/downloads
f:id:Simoroid:20210510012019p:plain

ダウンロードしたドライバー(chromedriver.exe)はpyファイルと同じフォルダに格納、
もしくは環境変数のPATHにドライバーのパスを定義しておくのでも良い。

スクレイピングに向けてのライブラリをインストールしておく。

pip install selenium
pip install beautifulsoup4

anacondaを使用している場合は

conda install selenium
conda install beautifulsoup4

◇とりあえずスクレイピングしてみる。
googleの検索ページからgoogleロゴを取ってきてみる。
下記のような処理順で実装します。
①ローカルに保存ディレクトリを準備
②imgタグを検索し、該当したhtml形式の情報を取得
③imgタグのsrc属性にアクセスすることで画像へのパスを取得
④スライスでファイル名を取得
⑤ローカルへ転送

#!/usr/bin/env python3

import os

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import selenium
import urllib.request as req
from bs4 import BeautifulSoup

TARGET_URL = "https://www.google.com/"

# ローカルに保存ディレクトリを準備
result_dir = './save' 
if not os.path.exists(result_dir):
    os.mkdir(result_dir)

options = Options()
options.add_argument('--headless')
article_browser = webdriver.Chrome(chrome_options=options)
article_browser.get(TARGET_URL)

# imgタグを検索し、該当したhtml形式の情報を取得
html = article_browser.execute_script("return document.getElementsByTagName('img')[0].outerHTML")
soup = BeautifulSoup(html,"html.parser")

# imgタグのsrc属性にアクセスすることで画像へのパスを取得
img = soup.find("img")["src"]

# スライスでファイル名を取得
filename = img[img.rfind("/"):]

# ローカルへ転送
req.urlretrieve((TARGET_URL + soup.find("img")["src"]),result_dir + '/' +filename)

article_browser.quit()

下記のように撮れました!
f:id:Simoroid:20210508090123p:plain

よんで頂きありがとうございます。
良ければフォローお願いします!

Windowsのタスクスケジューラが起動しない

下記に良くまとめられていたがそれでも起動しない。。
https://aprico-media.com/posts/4649

私の場合、原因はトリガーでした。
こちらの仕様は書いたままですが、ある時間から○○の間隔で実行するというものなので、
そもそも起動していない状態だと繰り返し実行以前の問題となっていた。

f:id:Simoroid:20210427172641j:plain

ということで開始時刻を兎に角早く実行したかったので現在より未来の時刻に切り替えて保存することで、起動に成功しました。

◇切り替え手順
1.タスクをダブルクリック
⇒タスクのプロパティウィンドウが開く
2.トリガータブを開き対象のトリガーをダブルクリック
⇒トリガーの編集ウィンドウが開く
3.「開始」のテキストボックスに任意の現在より未来の時刻を設定
⇒OKボタンで設定完了🐣

f:id:Simoroid:20210427172637j:plain

 

【Flutter】チップを使って3パターンのアクションを実装する

f:id:Simoroid:20210419234809p:plain

Flutterアプリのチップはリストのフィルタリングやプロフィールの画面などで
ボタンとは違ったデザインでスペースを取らないUIとして便利かと思います。
更にチップに何かしらの処理を実行したい場合もあるかと思います。
今回は3パターンのアクションを実装しました。

 

◇動作イメージ

f:id:Simoroid:20210419013302g:plain


1.チップが押されたら画面遷移する

InputChipを使用して、チップがタップされたら画面遷移を行うようにします。

2.チップが押されたら画面内の処理を行う

InputChipを使用して、チップがタップされたときの処理を実装します。

3.チップのアイコン部分が押されたら画面内の処理を行う

ContainerにTextとIconを組み込み、チップの見た目を模倣します。
アイコン部分のイベントリスナーを実装します。

 

gist0399ce8a237145f1aff75ae931d66acf

この記事がお役に立てていたらうれしいです。

【Flutter】ボトムナビゲーションバーの選択を親のWidgetで検知する

f:id:Simoroid:20210414004927p:plain


画面下部に表示するナビゲーションバーとメインのコンテンツに当たるWidget
ソースを分けたい場合の実装方法となります。

ナビゲーションバーに対してアイコンをタップするなどの操作した結果を親となるWidgetが受け取る仕組みになっています。

◇親となるメインウィジェット

◇参照するナビゲーションバーウィジェット
アイコンのタップを検知して親ウィジェットのイベントを走らせます。
イベントの引数にインデックスを渡すことで、どのアイコンがタップされたかを識別できるようにします。
bottom_navi_bar.dart

◇完成形イメージ
こんな感じになります。

f:id:Simoroid:20210401123914g:plain


この記事がお役に立てていたらうれしいです。

Android端末のキャプチャ撮ってgif変換を自動化する

モバイルアプリの開発ブログを書いているとキャプチャでイメージを伝えたいということが
良くあるのですが※例えば下記のように
f:id:Simoroid:20210401123914g:plain:w120
それらをわざわざ「端末でキャプチャを取って、それをダウンロードしてきて~」
という作業が面倒になったのでbatファイルで自動化しました。

◇前提条件(使用モジュール)
前提条件として下記2つが必要になってきます。

画像加工系の機能を色々と提供してくれるimagemagickというソフトをインストールします。
※インストール時の注意なのですが下記の赤線枠のチェックを入れなければ今回欲しい機能がインストールされません。。
http://www.imagemagick.org/script/download.php#windows
f:id:Simoroid:20210326163738p:plain:w360

  • adbコマンド

android端末にアクセスするためのコマンドになります。
インストールされていない方は下記のようなから取得できます。
https://tech.la-fra.com/2018/07/29/post-204/

◇batファイル
2つのバッチファイルを作ります。

screencap.bat
こちらは単純に今現在PCに接続されたAndroid端末に画面のキャプチャを
今回用の命名規則に従って撮影していきます。

@echo off

rem スペースを0に置換
set time_tmp=%time: =0%

rem スラッシュを置換で削除
set now=%date:/=%%time_tmp:~0,2%%time_tmp:~3,2%%time_tmp:~6,2%

adb shell screencap -p /sdcard/screen_%now%.png

pause

pullAndMakeGif.bat
命名規則に従って撮影されたキャプチャをPCに転送しgifに変換します。
最後にPCに転送した画像はAndroid端末側からは削除しておきます。

@echo off
set oput=

adb shell ls /sdcard/screen* >%CD%\usrlst.txt
FOR /F %%i in (usrlst.txt) DO adb pull %%i %CD%

:end
del %CD%\usrlst.txt
set oput=

REM 最後に全部消す
adb shell rm -rf /sdcard/screen* 

REM gif作成
convert -delay 30 -loop 0 screen_*.png movie.gif

pause

任意のフォルダにbatファイルに格納したらscreencap.bat⇒pullAndMakeGif.batの順番で実行するのみです。
f:id:Simoroid:20210401123025p:plain
この記事がお役に立てていたらうれしいです。

android studio 4.1.2が起動しない

 

android studio 4.1.2をインストール後、起動せずに下記のエラーが表示される
「Could not initialize class com.intellij.internal.statistic.service.fus.collectors.FUCounterUsageLogger」

■解決策
下記のフォルダに前のバージョンのごみが残っている為、IDEのライブラリが上手く参照できなかったようです。
フォルダを削除で起動できるようになりました。※削除前にバックアップを取ることは推奨ですが
※{ユーザー名}は適宜置き換え
C:\Users\{ユーザー名}\AppData\Roaming\Google\AndroidStudio4.1

f:id:Simoroid:20210128092811p:plain

 

Webページを軽量化して表示速度を上げる

Webページの表示速度をあげるためにページの軽量化を行います。

Htmlファイルの軽量化の図
Htmlファイルの軽量化
軽量化する対象としては下記が挙げられるが、今回はHTMLファイルに注目してみます。
・html
javascript
css

※htmlファイルの軽量化では明らかな速度改善は中々見られませんが、
パフォーマンスを重視している場合などは良いと思います。

1.使用ツール
今回はGoogleが提供している「HTMLMinifier」というものを使用します。

2.導入手順
ツールの利用にNode.jsが必要になってくるのでインストールします。

ツールをインストールします。
npm install html-minifier -g

3.実行
下記コマンドで実行します。

html-minifier --collapse-whitespace --remove-comments --remove-optional-tags --remove-redundant-attributes --remove-script-type-attributes --remove-tag-whitespace --use-short-doctype --minify-css true --minify-js true ECMAScript.html -o ECMAScript_minify.html

4.実験
ファイルサイズの大きい「ECMAScript」のページで実験してみます。
https://kangax.github.io/compat-table/es6/

表1. ファイルサイズ比較

ファイルサイズ(適用前) ファイルサイズ(適用後)
5.79 MB 6.43 MB



表2. DOMContentLoadedのパフォーマンス計測

1 2 3 4 5 平均
2.53 2.51 2.44 2.49 2.41 2.47
2.78 3.09 2.81 2.81 2.87 2.87

5.結果
あまり早くなったわけではありません、
コンテンツが多くなりファイルサイズが大きくなったものに
のみ適用とかでいいと思います。

6.おまけ
フォルダ内のすべてのhtmlファイルを軽量化するコマンドです。

@echo off

rem htmlファイルを一つずつ%%aに代入してループを回す
setlocal enabledelayedexpansion

for %%a in (*.html) do (
set fname=%%a
call html-minifier ^
--collapse-whitespace --remove-comments --remove-optional-tags ^
--remove-redundant-attributes --remove-script-type-attributes  ^
--remove-tag-whitespace --use-short-doctype --minify-css true --minify-js true ^
!fname! -o !fname:.=_minify.!
)