Selenium에서 마우스를 자동 조종하여 Google에서 주가 데이터를 얻습니다.
개요
Selenium의 ActionChains를 사용하면 브라우저에서 마우스 조작을 자동화할 수 있습니다.
이를 응용하여 Google 검색 결과의 주가 차트에서 주가 데이터를 얻었다.
동기
주가 추이 데이터 얻기
여러가지로 주가의 추이 데이터를 얻을 필요가 있었으므로, 그러한 할 수 있는 API를 찾고 있었습니다만, 간편하게 사용할 수 있는 좋은 것이 별로 발견되지 않았습니다.
음, 무슨 일이야?
와 Google 검색 결과의 주가 데이터를 바라보고 있었습니다만…
htps //w w. 오, ぇ. 이 m/세아 rch? q = 나 S이다 Q : 오 G & tbm = 후안
응?
이것이다! !
어느 것?
Google 검색 결과의 주가 차트, 마우스 온하면 그 부분의 값을 표시해 주는 것 같습니다.
즉 자동으로 마우스를 움직여, 이 부분의 수치를 취득하면 주가를 얻을 수 있을 것 같네요! !
방법
설정
Python 패키지, Selenium을 사용하여 브라우저를 제어하여 실현하려고합니다.
파이썬 설정에 대해서는 세상에 양질의 기사가 많이 있기 때문에 할애합니다.
Selenium 설정에 대해서는 다음 페이지가 도움이 될 수 있습니다.
htps : // 타누는 ck. 코 m/세에니 m/
구현
로직
주가의 검색 결과 화면에서 「F12」키를 눌러 각각의 요소에 어떤 클래스명이 붙어 있는지 칠라 보면, 이하와 같이 되어 있었습니다.
그래서 구현은
1. "uch-path"의 왼쪽 끝으로 마우스를 이동
2. 「knowledge-~」의 2개의 요소의 텍스트를 취득
3. 마우스를 오른쪽으로 1픽셀 이동
4. uch-path의 오른쪽 끝에 도달하지 않은 경우 2.
같아요.
ActionChains에 의한 마우스 조작
그리고 마우스를 이동시키는 처리는 Selenium의 ActionChains에 의해 구현할 수 있습니다.
사용하는 경우
가져오기
from selenium.webdriver.common.action_chains import ActionChains
에 의해 ActionChains를 가져오고 마우스를 조작하려는 장면에서 호출합니다.
다음은 앞에서 설명한 로직 1.의 "uch-path"의 좌단으로 마우스를 이동시키는 처리를 구현한 것입니다.
마우스 이동
# uch-path要素の取得
graph = driver.find_element_by_class_name("uch-path")
# uch-path要素の左端にマウスを移動
actions = ActionChains(driver)
actions.move_to_element(graph)
actions.move_by_offset(-(graph.rect['width'] // 2),0)
actions.perform()
ActionChains 클래스를 호출해, 다양한 움직임을 기술해, perform()로 실행한다고 하는 형태입니다.
move_to_element(요소명)로 요소의 중앙으로 마우스를 이동
move_by_offset(X, Y)로 현재 마우스 위치에서 X, Y만 마우스를 이동시킵니다.
( -(graph.rect['width'] // 2)
에서는 그래프의 가로폭 width의 절반만 왼쪽으로 (음의 값으로) 이동시키고 있습니다.)
그리고는 1 픽셀씩 오른쪽으로 이동시키면 좋기 때문에,
오른쪽으로 1픽셀만 이동actions = ActionChains(driver)
actions.move_by_offset(1,0)
actions.perform()
를 차트의 가로폭분 반복하여, 그 때마다 데이터를 취득하면 좋네요.
ActionChains에 대한 자세한 내용은 아래에 나와 있습니다.
그 외에도 키 누르기, 키를 누르면서 마우스 클릭 등 다양한 움직임을 정의할 수 있는 것 같습니다.
htps : // 흔들림. 기주 b. 이오/세이니우 mpy 큭/아피. HTML # 모즈 에세 m.ぇbd ゔぇr. 안녕하세요. 아 c 치오 _ 짱 s
소스 코드
소스 코드는 다음과 같습니다.
Scraping.py# セッティング
## WebDriverの場所(以下は同じフォルダに配置した場合、適宜変更する)
WEBDRIVER_PATH = r'chromedriver.exe'
## 検索したい銘柄のコード。このワードでGoogle検索する
STACK_SYMBOL = r'NASDAQ:GOOG'
# seleniumのインポート
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
# ドライバーの起動とアクセス
driver = webdriver.Chrome(WEBDRIVER_PATH)
driver.get(r'https://www.google.com/finance?q=' + STACK_SYMBOL)
# 要素の選択(描画中で要素を選択できない場合、例外を飛ばすのでもう一回やる)
while True:
try:
# クラス名「PVZpFf」はチャート上の「1日」、「5日」、「1か月」…などのタブ。
# 左から6番目の「5年」を選択している。
driver.find_elements_by_class_name('PVZpFf')[6].click()
# チャートの要素「uch-path」を取得
graph = driver.find_element_by_class_name("uch-path")
# マウスの動きを記述
actions = ActionChains(driver)
## チャートの中心にマウスを移動
actions.move_to_element(graph)
## チャートの横幅(width)の半分だけ左に移動させて、チャートの左端にマウスを持ってくる
actions.move_by_offset(-(graph.rect['width'] // 2),0)
## 記述した動作の実行
actions.perform()
# グラフの横幅を取得
graph_width = graph.rect['width']
# 失敗した場合
except:
# 描画中の場合など、graph要素を選択しようとしても失敗する場合がある。
# 描画が終われば正常に取得できるため、失敗したらまた繰り返すようにする
print("continue!")
continue
# graph要素をうまく取得できればループから脱出(break)する。
break
# データを格納する辞書の初期化
record = {}
# データの取得
for i in range(graph_width):
# 浮かんでいるカードから日付・株価を取得する。
time_info = driver.find_element_by_class_name("knowledge-finance-wholepage-chart__hover-card-time").text
info = driver.find_element_by_class_name("knowledge-finance-wholepage-chart__hover-card-value").text
# データをとれていなかった場合にはレコードに追加しない
if not info:
continue
# 日付をキーにして辞書に格納
record[time_info] = info
# 経過が見られるように出力している
print(i, time_info, info)
# マウスを右に移動させる処理
actions = ActionChains(driver)
actions.move_by_offset(1,0)
actions.perform()
위의 코드를 실행한 결과, record 변수에
{'2014年10月31日': '557.55 USD',
'2014年11月14日': '542.91 USD',
'2014年11月21日': '536.03 USD',
'2014年11月28日': '540.35 USD',
'2014年11月7日': '539.53 USD',
'2014年12月12日': '517.24 USD',
'2014年12月19日': '514.94 USD',
'2014年12月26日': '532.57 USD',
'2014年12月5日': '523.82 USD',
'2015年10月16日': '662.20 USD',
'2015年10月23日': '702.00 USD',
'2015年10月2日': '626.91 USD',
'2015年10月30日': '710.81 USD',
'2015年10月9日': '643.61 USD',
'2015年11月13日': '717.00 USD',
...
같은 데이터가 남았습니다. 성공입니다!
그리고는 이 데이터를 datetime형이나 수치형에 퍼스 하면 취급하기 쉬운 데이터가 된다고 생각합니다.
요약
많이 조사하면 API로 주가를 취득할 수 있는 서비스는 얼마든지 있을 것 같기 때문에, 실제로 사용한다면 그쪽을 사용하는 편이 좋다고 생각합니다. (/_;)
고마워요.
참고
이미지에 만화 같은 집중선을 넣을 수 있는 즐거운 도구
h tp : // 네 t 등 lx0. 네 t/와 l/ぃね/
Reference
이 문제에 관하여(Selenium에서 마우스를 자동 조종하여 Google에서 주가 데이터를 얻습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/i_shot1997/items/f2d1e6a0e9f665412faa
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
주가 추이 데이터 얻기
여러가지로 주가의 추이 데이터를 얻을 필요가 있었으므로, 그러한 할 수 있는 API를 찾고 있었습니다만, 간편하게 사용할 수 있는 좋은 것이 별로 발견되지 않았습니다.
음, 무슨 일이야?
와 Google 검색 결과의 주가 데이터를 바라보고 있었습니다만…
htps //w w. 오, ぇ. 이 m/세아 rch? q = 나 S이다 Q : 오 G & tbm = 후안
응?
이것이다! !
어느 것?
Google 검색 결과의 주가 차트, 마우스 온하면 그 부분의 값을 표시해 주는 것 같습니다.
즉 자동으로 마우스를 움직여, 이 부분의 수치를 취득하면 주가를 얻을 수 있을 것 같네요! !
방법
설정
Python 패키지, Selenium을 사용하여 브라우저를 제어하여 실현하려고합니다.
파이썬 설정에 대해서는 세상에 양질의 기사가 많이 있기 때문에 할애합니다.
Selenium 설정에 대해서는 다음 페이지가 도움이 될 수 있습니다.
htps : // 타누는 ck. 코 m/세에니 m/
구현
로직
주가의 검색 결과 화면에서 「F12」키를 눌러 각각의 요소에 어떤 클래스명이 붙어 있는지 칠라 보면, 이하와 같이 되어 있었습니다.
그래서 구현은
1. "uch-path"의 왼쪽 끝으로 마우스를 이동
2. 「knowledge-~」의 2개의 요소의 텍스트를 취득
3. 마우스를 오른쪽으로 1픽셀 이동
4. uch-path의 오른쪽 끝에 도달하지 않은 경우 2.
같아요.
ActionChains에 의한 마우스 조작
그리고 마우스를 이동시키는 처리는 Selenium의 ActionChains에 의해 구현할 수 있습니다.
사용하는 경우
가져오기
from selenium.webdriver.common.action_chains import ActionChains
에 의해 ActionChains를 가져오고 마우스를 조작하려는 장면에서 호출합니다.
다음은 앞에서 설명한 로직 1.의 "uch-path"의 좌단으로 마우스를 이동시키는 처리를 구현한 것입니다.
마우스 이동
# uch-path要素の取得
graph = driver.find_element_by_class_name("uch-path")
# uch-path要素の左端にマウスを移動
actions = ActionChains(driver)
actions.move_to_element(graph)
actions.move_by_offset(-(graph.rect['width'] // 2),0)
actions.perform()
ActionChains 클래스를 호출해, 다양한 움직임을 기술해, perform()로 실행한다고 하는 형태입니다.
move_to_element(요소명)로 요소의 중앙으로 마우스를 이동
move_by_offset(X, Y)로 현재 마우스 위치에서 X, Y만 마우스를 이동시킵니다.
( -(graph.rect['width'] // 2)
에서는 그래프의 가로폭 width의 절반만 왼쪽으로 (음의 값으로) 이동시키고 있습니다.)
그리고는 1 픽셀씩 오른쪽으로 이동시키면 좋기 때문에,
오른쪽으로 1픽셀만 이동actions = ActionChains(driver)
actions.move_by_offset(1,0)
actions.perform()
를 차트의 가로폭분 반복하여, 그 때마다 데이터를 취득하면 좋네요.
ActionChains에 대한 자세한 내용은 아래에 나와 있습니다.
그 외에도 키 누르기, 키를 누르면서 마우스 클릭 등 다양한 움직임을 정의할 수 있는 것 같습니다.
htps : // 흔들림. 기주 b. 이오/세이니우 mpy 큭/아피. HTML # 모즈 에세 m.ぇbd ゔぇr. 안녕하세요. 아 c 치오 _ 짱 s
소스 코드
소스 코드는 다음과 같습니다.
Scraping.py# セッティング
## WebDriverの場所(以下は同じフォルダに配置した場合、適宜変更する)
WEBDRIVER_PATH = r'chromedriver.exe'
## 検索したい銘柄のコード。このワードでGoogle検索する
STACK_SYMBOL = r'NASDAQ:GOOG'
# seleniumのインポート
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
# ドライバーの起動とアクセス
driver = webdriver.Chrome(WEBDRIVER_PATH)
driver.get(r'https://www.google.com/finance?q=' + STACK_SYMBOL)
# 要素の選択(描画中で要素を選択できない場合、例外を飛ばすのでもう一回やる)
while True:
try:
# クラス名「PVZpFf」はチャート上の「1日」、「5日」、「1か月」…などのタブ。
# 左から6番目の「5年」を選択している。
driver.find_elements_by_class_name('PVZpFf')[6].click()
# チャートの要素「uch-path」を取得
graph = driver.find_element_by_class_name("uch-path")
# マウスの動きを記述
actions = ActionChains(driver)
## チャートの中心にマウスを移動
actions.move_to_element(graph)
## チャートの横幅(width)の半分だけ左に移動させて、チャートの左端にマウスを持ってくる
actions.move_by_offset(-(graph.rect['width'] // 2),0)
## 記述した動作の実行
actions.perform()
# グラフの横幅を取得
graph_width = graph.rect['width']
# 失敗した場合
except:
# 描画中の場合など、graph要素を選択しようとしても失敗する場合がある。
# 描画が終われば正常に取得できるため、失敗したらまた繰り返すようにする
print("continue!")
continue
# graph要素をうまく取得できればループから脱出(break)する。
break
# データを格納する辞書の初期化
record = {}
# データの取得
for i in range(graph_width):
# 浮かんでいるカードから日付・株価を取得する。
time_info = driver.find_element_by_class_name("knowledge-finance-wholepage-chart__hover-card-time").text
info = driver.find_element_by_class_name("knowledge-finance-wholepage-chart__hover-card-value").text
# データをとれていなかった場合にはレコードに追加しない
if not info:
continue
# 日付をキーにして辞書に格納
record[time_info] = info
# 経過が見られるように出力している
print(i, time_info, info)
# マウスを右に移動させる処理
actions = ActionChains(driver)
actions.move_by_offset(1,0)
actions.perform()
위의 코드를 실행한 결과, record 변수에
{'2014年10月31日': '557.55 USD',
'2014年11月14日': '542.91 USD',
'2014年11月21日': '536.03 USD',
'2014年11月28日': '540.35 USD',
'2014年11月7日': '539.53 USD',
'2014年12月12日': '517.24 USD',
'2014年12月19日': '514.94 USD',
'2014年12月26日': '532.57 USD',
'2014年12月5日': '523.82 USD',
'2015年10月16日': '662.20 USD',
'2015年10月23日': '702.00 USD',
'2015年10月2日': '626.91 USD',
'2015年10月30日': '710.81 USD',
'2015年10月9日': '643.61 USD',
'2015年11月13日': '717.00 USD',
...
같은 데이터가 남았습니다. 성공입니다!
그리고는 이 데이터를 datetime형이나 수치형에 퍼스 하면 취급하기 쉬운 데이터가 된다고 생각합니다.
요약
많이 조사하면 API로 주가를 취득할 수 있는 서비스는 얼마든지 있을 것 같기 때문에, 실제로 사용한다면 그쪽을 사용하는 편이 좋다고 생각합니다. (/_;)
고마워요.
참고
이미지에 만화 같은 집중선을 넣을 수 있는 즐거운 도구
h tp : // 네 t 등 lx0. 네 t/와 l/ぃね/
Reference
이 문제에 관하여(Selenium에서 마우스를 자동 조종하여 Google에서 주가 데이터를 얻습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/i_shot1997/items/f2d1e6a0e9f665412faa
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
from selenium.webdriver.common.action_chains import ActionChains
# uch-path要素の取得
graph = driver.find_element_by_class_name("uch-path")
# uch-path要素の左端にマウスを移動
actions = ActionChains(driver)
actions.move_to_element(graph)
actions.move_by_offset(-(graph.rect['width'] // 2),0)
actions.perform()
actions = ActionChains(driver)
actions.move_by_offset(1,0)
actions.perform()
# セッティング
## WebDriverの場所(以下は同じフォルダに配置した場合、適宜変更する)
WEBDRIVER_PATH = r'chromedriver.exe'
## 検索したい銘柄のコード。このワードでGoogle検索する
STACK_SYMBOL = r'NASDAQ:GOOG'
# seleniumのインポート
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
# ドライバーの起動とアクセス
driver = webdriver.Chrome(WEBDRIVER_PATH)
driver.get(r'https://www.google.com/finance?q=' + STACK_SYMBOL)
# 要素の選択(描画中で要素を選択できない場合、例外を飛ばすのでもう一回やる)
while True:
try:
# クラス名「PVZpFf」はチャート上の「1日」、「5日」、「1か月」…などのタブ。
# 左から6番目の「5年」を選択している。
driver.find_elements_by_class_name('PVZpFf')[6].click()
# チャートの要素「uch-path」を取得
graph = driver.find_element_by_class_name("uch-path")
# マウスの動きを記述
actions = ActionChains(driver)
## チャートの中心にマウスを移動
actions.move_to_element(graph)
## チャートの横幅(width)の半分だけ左に移動させて、チャートの左端にマウスを持ってくる
actions.move_by_offset(-(graph.rect['width'] // 2),0)
## 記述した動作の実行
actions.perform()
# グラフの横幅を取得
graph_width = graph.rect['width']
# 失敗した場合
except:
# 描画中の場合など、graph要素を選択しようとしても失敗する場合がある。
# 描画が終われば正常に取得できるため、失敗したらまた繰り返すようにする
print("continue!")
continue
# graph要素をうまく取得できればループから脱出(break)する。
break
# データを格納する辞書の初期化
record = {}
# データの取得
for i in range(graph_width):
# 浮かんでいるカードから日付・株価を取得する。
time_info = driver.find_element_by_class_name("knowledge-finance-wholepage-chart__hover-card-time").text
info = driver.find_element_by_class_name("knowledge-finance-wholepage-chart__hover-card-value").text
# データをとれていなかった場合にはレコードに追加しない
if not info:
continue
# 日付をキーにして辞書に格納
record[time_info] = info
# 経過が見られるように出力している
print(i, time_info, info)
# マウスを右に移動させる処理
actions = ActionChains(driver)
actions.move_by_offset(1,0)
actions.perform()
{'2014年10月31日': '557.55 USD',
'2014年11月14日': '542.91 USD',
'2014年11月21日': '536.03 USD',
'2014年11月28日': '540.35 USD',
'2014年11月7日': '539.53 USD',
'2014年12月12日': '517.24 USD',
'2014年12月19日': '514.94 USD',
'2014年12月26日': '532.57 USD',
'2014年12月5日': '523.82 USD',
'2015年10月16日': '662.20 USD',
'2015年10月23日': '702.00 USD',
'2015年10月2日': '626.91 USD',
'2015年10月30日': '710.81 USD',
'2015年10月9日': '643.61 USD',
'2015年11月13日': '717.00 USD',
...
많이 조사하면 API로 주가를 취득할 수 있는 서비스는 얼마든지 있을 것 같기 때문에, 실제로 사용한다면 그쪽을 사용하는 편이 좋다고 생각합니다. (/_;)
고마워요.
참고
이미지에 만화 같은 집중선을 넣을 수 있는 즐거운 도구
h tp : // 네 t 등 lx0. 네 t/와 l/ぃね/
Reference
이 문제에 관하여(Selenium에서 마우스를 자동 조종하여 Google에서 주가 데이터를 얻습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/i_shot1997/items/f2d1e6a0e9f665412faa
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Selenium에서 마우스를 자동 조종하여 Google에서 주가 데이터를 얻습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/i_shot1997/items/f2d1e6a0e9f665412faa텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)