【Python】特定サイトで条件指定してファイルをダウンロードするような処理を自動化してみる

カテゴリ:Python 投稿:2022年6月15日0:42、更新:2022年6月26日23:17

・記事の概要 

実務の中で特定のサイトにアクセスして、条件抽出をしてファイルをダウンロードするような定常作業があり得ると思いますが、今回はそれをPythonで自動化していきます。


・今回利用するサイト 

以下の気象庁の天気データをDLできるサイトで試してみます。

気象庁

画像のように検索条件がいくつかありますね。

URLにアクセスし、条件を指定し、CSVのダウンロードをするブラウザ操作をPythonで自動化します。

なおイタズラにリクエストを飛ばしまくるような攻撃はしないようにお願いします。



・前準備 

事前にインストールしておきます。

pip install selenium

pip install webdriver_manager


・実際のコード 

コメント記載内容で流れはわかるかもしれませんが、いくつか細く説明もしていきます。

from selenium import webdriver

from webdriver_manager.chrome import ChromeDriverManager

from selenium.webdriver.common.by import By

from selenium.webdriver.support.ui import WebDriverWait


#ブラウザの立ち上げ

driver = webdriver.Chrome(ChromeDriverManager().install())

#実際のURL指定

driver.get("https://www.data.jma.go.jp/gmd/risk/obsdl/index.php")



#csv出力の条件指定

##フロント側での要素描画の時間を待機,場所は東京都を選択

prefectures = WebDriverWait(driver, 5).until(lambda x: x.find_element(By.ID, "pr44"))

prefectures.click()

##地域も東京を選択

area = WebDriverWait(driver, 5).until(lambda x: x.find_element(By.XPATH, "/html/body/div[1]/div[2]/div[1]/div[2]/div[1]/div/div[2]/div[1]/div[2]/div[1]/div[2]/div[9]/div"))

area.click()


#項目の選択

##項目を選ぶへ

element_select = driver.find_element(By.ID, "elementButton")

element_select.click()

##日別値を選び

elemen_category = driver.find_element(By.XPATH, "/html/body/div[1]/div[2]/div[1]/div[2]/div[1]/div/div[2]/div[1]/div[2]/div[2]/div[2]/div[1]/div/div[1]/div[2]/label/span")

driver.execute_script("arguments[0].click();", elemen_category)

#日平均気温を選ぶ

elemen_item =  driver.find_element(By.XPATH,"/html/body/div[1]/div[2]/div[1]/div[2]/div[1]/div/div[2]/div[1]/div[2]/div[2]/div[3]/div[1]/div[1]/table/tbody/tr[1]/td[1]/span/label/span")

driver.execute_script("arguments[0].click();", elemen_item)


#期間の選択

##期間を選ぶへ

period_select = driver.find_element(By.ID, "periodButton")

period_select.click()

#直近1ヶ月(連続した期間)

period_category = driver.find_element(By.XPATH, "/html/body/div[1]/div[2]/div[1]/div[2]/div[1]/div/div[2]/div[1]/div[2]/div[3]/div/div/div[1]/div[2]/div[1]/input[2]")

driver.execute_script("arguments[0].click();", period_category)


#csvDLボタン

csv_btn = driver.find_element(By.XPATH, "/html/body/div[1]/div[2]/div[1]/div[2]/div[1]/div/div[2]/div[2]/div/div/div[1]/div[2]/span/img")

csv_btn.click()


#driver.close()

・「#実際のURL指定」まで

特に特殊な処理はなく、過去記事の「【Python】seleniumを使ったノーコードでのブラウザ自動操作をPythonでコーディングしてみる」とやっていることはおおよそ同じですね。

・「csv出力の条件指定」部分

ここは少し特殊ですかね。というのも「prefectures = WebDriverWait(driver, 5)...」部分ですが、これは対象サイトによっては必要な処理になります。気象庁のサイトを見てみると地域を選択していく時にマップが表示されていますがこれがAjaxなどのサーバサイドを含んだ動的処理によって描画されていたりするんですね。

そういった場合に「prefectures = driver.find_element(By.ID, "pr44")」とすると「NoSuchElementException」エラーが生じることがあります。これは何かというと上記のAjaxなどのサーバサイド処理で要素を確定する前に、「 driver.find_element(By.ID, "pr44")」で要素の要求をしてしまい、その要素は無いよと怒られるような形です。

それを避けるために「prefectures = WebDriverWait(driver, 5)...」で要素の確定を待ってから要求をしています。

・「csv出力の条件指定」の後

ここからはまたシンプルですね。「driver.find_element」と「.click()」を繰り返していますが、これは要素の対象が上記とは異なり静的であるためですね。

プログラムを実行してcsvがダウンロードできればOKです。


まとめ 

いかがだったでしょうか。

実務だとダウンロードしたファイルをまた別のExcelに転記してまとめていくようなこともあると思うので、今後はそういった処理も記事にしていければと思います。(今回の処置だけだとブラウザ拡張のselemiumでも賄えるので、そういった後続処理をプログラムでしてこそ意義があるかもですね。)

以下でこの記事の続きとして、自動転記についても書いてみました!

自動でダウンロードしたcsvを既存のexcelに自動転機させてみる



コメント一覧

コメント投稿ページへ


書いている人

のぎ
PG->SE->PMとして働き、現在はIT企業で新卒採用の担当をしています。長期育休取得明けで0歳娘の対応に毎日バタバタです。笑
採用業務をしつつ社内利用ツールなど作成しており、当ブログも勉強の一環でコーディングして作成しています。 エンジニア領域、人事・採用領域、育児関連など発信していきます。