【初心者向け】PythonでWindowsの操作を自動化!毎日発表されるデータを日付ごとコピペして表(csvファイル)に保存する方法【PyAutoGui】【Pandas】

この記事は約6分で読めます。
広告

毎日どこかのサイトにいってデータを記録している場合、自動化できます。
具体例として神奈川県の感染者の累積件数を日付とともにコピペし
表(csvファイル)にまとめる方法です。
神奈川県の新型コロナウイルスに感染した患者の発生状況のデータを利用します。

Windows10、JupiterNotebookを使用
GoogleColaboratoryでは
pyperclipなどのライブラリが使えないためエラーになります。

広告

注意事項

アクセスするサーバーに負荷をかけないように
手動でアクセスするのと同じ回数、間隔で実行してください。
for文などを使った繰り返しによるアクセスはしないようにしてください。
コードを実行するときは自己責任でお願いします。
コードの内容を理解してから実行してください。
最前面のWindowが処理対象になるため処理中は他の操作はできません。
最前面にほかのWindowが出ていると、そのWindowに対して操作してしまいます。

動作画面

動作説明

神奈川県の 新型コロナウイルスに感染した患者の発生状況
中段にある居住地別累計ー県所管域発表分の横浜市 川崎市 相模原市のデータを表にします。

  1. ファイル(coro.csv)がある場合、読み込む。ファイルがない場合作成
  2. Edgeを起動し神奈川県患者発生状況のページへアクセス
  3. CTRL+a、CTRL+cで全部コピーして文字列変数に代入
  4. 日付、発生件数を抽出
  5. 表にしてcsvで保存(保存場所は作成しているプログラムと同じディレクトリになります)

目次へ

大まかに抽出する

一気に抽出しないで、まずは大まかに抽出する。
抽出する方法は欲しいワードの前後唯一のワードを
replaceでbunkatu(なんでもいい)という文字に置き換え
spilitでbunkatuのところで分割する。
その結果リストになるので必要な要素のみ使用する。

str2内の文字を探したり唯一かどうかを判定するのに
WindowsはF3キーを押すと文字検索できるので使ってください。

表などの場合見た目とコピペした文字列の位置関係は関連性がないので
コピペした文字列から具体的な数字を目印に検索する。
元の画面を見て必要な情報
今回は「日付」と「 横浜市 川崎市 相模原市 の件数」の前後の文字から
分割できそうな文字列を決める。
決める際、日によって変わらない不変なものを選ぶ。
例えば、1月20日を抽出するのに下の赤の部分を選ぶ。

地別累計\u30001月20日(木曜日)までの県所管域及び保健所設置市分の累計\r\n(1月21日17

「木曜日」は日ごとに変わる部分で使えないので、そこの後ろを使う。
発生件数についてはコードの説明を見てください。

目次へ

データを整える

大まかに抽出したあとは最終的な形にデータを整えます。
大まかに抽出したデータはhidukemoto=1月21日(金曜日)なので(で分割 hidukemoto1=hidukemoto.split(‘(’)
分割すると[‘1月21日’, ‘金曜日)’]というリストになるので
0番目の要素が最終的に欲しい日付 ‘1月21日’ hiduke=hidukemoto1[0]

発生件数についてはコードの説明を見てください。

コード

import pyautogui as pag
import time
import pyperclip
import pandas as pd
import subprocess
import os
#神奈川県患者発生累計の表を抽出する(CTRL+a、CTRL+c版)
#ファイルあるか
if os.path.exists('coro.csv'):
#ファイル読み込み
    df1=pd.read_csv("coro.csv",index_col=0)
else:
#新規ファイル(データフレーム)作成
    list1=[]
    columns1 =["横浜市", "川崎市", "相模原市"]
    df1=pd.DataFrame(data=list1, columns=columns1)
    list1=['0','0','0']
    df1.loc['dummy']=list1

#Edgeの起動
subprocess.run(r'C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe')
time.sleep(1)

#神奈川県患者発生累計のアドレス
str1='https://www.pref.kanagawa.jp/docs/ga4/covid19/occurrence.html'
#クリップボードにコピー
pyperclip.copy(str1)

#アドレスバーにカーソルがなく入力する状態になっていない場合、画面を最大化し座標x,y確認して使ってください。
#マウスをアドレスバーへ移動
# pag.moveTo(x,y)
#クリック
# pag.click()

time.sleep(1)
#CTRL+Vで貼り付け
pag.hotkey("ctrl","v")
#Enter
pag.press('enter') 
time.sleep(5)

#************ ctrl+aとCTRL+cで全部コピーしてstr2にペースト************
pag.hotkey("ctrl","a")
time.sleep(1)
pag.hotkey("ctrl","c")
time.sleep(1)
str2=pyperclip.paste()

time.sleep(2)
#Edgeを閉じる
pag.hotkey("Ctrl","w")

************大まかに抽出する************
#日付を抽出するのに'時刻\t0時'~'\r\n風向'までが大まかな対象なので分割の目印としてbunkatuに変える
#"横浜市", "川崎市", "相模原市"び発生件数抽出するのに'鎌倉市\r\n'~'\r\n藤沢市'までが大まかな対象なので分割の目印としてbunkatuに変える
str3=str2.replace('※','bunkatu').replace('までの県所管域及び保健所設置市分の累計','bunkatu').replace('鎌倉市\r\n','bunkatu').replace('\r\n藤沢市','bunkatu')
#bunkatuで分割してリストへ
str4=str3.split('bunkatu')
#1番目の要素が日付の対象部分なのでstr4[1]使用
hidukemoto=str4[1]
#3番目の要素が発生件数の対象部分なのでstr4[3]使用
datamoto=str4[3]

************データを整える************
#hidukemoto=1月21日(金曜日)なので(で分割
#ここの(は全角なので注意
hidukemoto1=hidukemoto.split('(')
#0番目の要素が日付
hiduke=hidukemoto1[0]
#発生件数datamoto=987\t44\t477\t84\t3,400\t2,376なので\tで分割
list_nin0=datamoto.split('\t')
#最初の三つが"横浜市", "川崎市", "相模原市"の発生件数
list_nin=list_nin0[:3]

************表の作成************
#表に同じ日付がなければ行追加
if not hiduke in df1.index :
    df1.loc[hiduke]=list_nin
    df2=df1
#初めての時dummy行あるので削除
if df1.index[0] == 'dummy':
    df2=df1.drop('dummy')
#csvファイル保存
df2.to_csv("coro.csv")
df2

目次へ

この記事を書いたイチゲを応援する
Vプリカでのお支払いがおすすめです。

MENTAやってます(ichige)

コメント

タイトルとURLをコピーしました