質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

解決済

1回答

2126閲覧

selenium、chromedriverを用いた情報抽出プログラムの不具合を直したい

kenken0023

総合スコア15

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2019/01/29 18:38

今回のプログラムと起こっている不具合について

現在、selenium、chromedriverで情報抽出をするプログラムを書いています。具体的な機能は、GISフリーサービス(http://www.gis-tool.com/mapview/maptocoordinates.html)にアクセスし、地名を入力し、検索ボタンを押し、その後そのページから経度と緯度をスクレイピングする内容のプログラムを書いています。

プログラム自体はエラーは無く、実行するとchromedriverがきちんと動き地名を入力し、検索をかけてページを移動することも確認済みです。

しかし、実際に座標を返す時に、座標の値に不具合があってどうにも直し方がわからないので相談させていただきました。

発生している問題・エラーメッセージ

. >>> === RESTART: map_adress改.py === 大阪駅 : 139.691706 / 35.689487 京都駅 : 135.758766 / 34.985849 大阪天満宮 : 135.758766 / 34.985849 ['大阪駅', '京都駅', '大阪天満宮'] ['139.691706', '135.758766', '135.758766'] ['35.689487', '34.985849', '34.985849'] >>> === RESTART: map_adress改.py === 大阪駅 : / 京都駅 : 139.691706 / 35.689487 大阪天満宮 : 139.691706 / 35.689487 ['大阪駅', '京都駅', '大阪天満宮'] ['', '139.691706', '139.691706'] ['', '35.689487', '35.689487'] >>>

このようにプログラムのエラー自体は無いのですが実行したときによって出力結果が異なります。座標を実際に照らし合わせてみると、すべてスクレイピングしている時でも取得している座標がずれてしまっています。

ちなみに、座標の正解値は以下のようになります。
座標例 正解値
大阪駅:135.495950 / 34.702485
京都駅:135.758766 / 34.985849
大阪天満宮:135.512616 / 34.696060

今回の出力では、最初の実行結果はすべてスクレイピング出来ているように見えますが座標は、
大阪駅:デフォルトの東京駅の座標
京都駅:京都駅の座標
大阪天満宮:京都駅の座標
という風にずれたり、前の座標をスクレイピングしてしまっています。

該当のソースコード

python

1from selenium import webdriver 2from selenium.webdriver.chrome.options import Options 3 4def map_adress(place_list): 5 6 lon_list = [] 7 lat_list = [] 8 9 browser = webdriver.Chrome(executable_path='C:\chromedriver.exe') 10 browser.implicitly_wait(3) 11 #座標変換ページにアクセス 12 url_login = "http://www.gis-tool.com/mapview/maptocoordinates.html" 13 browser.get(url_login) 14 15 for item in place_list: 16 #print(item,"の情報を取得します") 17 18 #テキストボックスに地名を入力 19 e = browser.find_element_by_id("address") 20 e.clear() 21 e.send_keys(item) 22 23 #フォームを送信 24 frm = browser.find_element_by_id("search") 25 frm.submit() 26 #print("情報を入力して検索ボタンを押しました") 27 28 lon = browser.find_element_by_id("longitude") 29 lat = browser.find_element_by_id("latitude") 30 31 lon_v = lon.get_attribute("value") 32 lat_v = lat.get_attribute("value") 33 34 print(item,":",lon_v,"/",lat_v) 35 36 lon_list.append(lon_v) 37 lat_list.append(lat_v) 38 39 40 #browser.close() 41 #print("経度:",lon,"緯度:",lat) 42 43 return lon_list,lat_list 44 45 46station = ["大阪駅","京都駅","大阪天満宮"] 47 48result = map_adress(station) 49print(station) 50print(result[0]) 51print(result[1]) 52

試したこと

エラーが出なかったためエラーメッセージの項目の出力のようにprintでその都度スクレイピングした内容を出力して確かめるようにしました。

また、chromedriverによって動くchromeの挙動を見ていると、ページを読み込んでいる間にスクレイピングしているように見えたため、ソースコードの「#print("情報を入力して検索ボタンを押しました")」の次の行に browser.implicitly_wait("秒数")を追加して待ち時間を設けてみました。最大60秒まで変えてみましたが結果に変化はありませんでした。

補足情報(FW/ツールのバージョンなど)

chromedriverはPCのCドライバ直下においており、PATHに追加済み

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。

ボタンを押した直後に値を取りに行っているのが原因、というのはお考えの通りです。
ただbrowser.implicitly_wait()は対象の要素が見つかるまで何秒まで待つかを設定するメソッドで
今回、常に座標が表示されているため値をいくつに設定しても0秒しか待ちません。

汎用的には読み込み完了の目印となるオブジェクトを監視するといいですが
簡単にはsleepで強制的に待機すればよいです。

Python

1import time 2time.sleep(0.5)

投稿2019/01/30 00:56

firedfly

総合スコア1131

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kenken0023

2019/01/30 06:04

回答ありがとうございます! 実際にキーワード検索の次の行にtime.sleep(0.5)を追加するときちんとスクレイピング出来ました。 本当に助かりました、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問