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/ぃね/

좋은 웹페이지 즐겨찾기