본문 바로가기

Autohotkey강좌

Autohotkey#29, Selenium을 이용한 웹크롤링 2단계 : 사이트에서 자료 가져오기, Get the data from a site through Selenium

반응형

youtu.be/1_jkCxCSNMQ

 

다음은 실제적으로 특정 사이트에서 내용을 읽어 오는 것을 진행겠습니다.

사실 이 부분은 파이썬에서 Selenium으로 내용을 읽고 난 후 pandas를 이용하여 DataFrame으로 변환하는게 더 효율적이지 않을까 생각이 듭니다. 하지만 우리는 autohotkey에서 진행할 것이라서
RegExMatch를 활용해야 합니다.
예를 들어 요즘 관심이 큰 주식시장의 데이터를 읽어오기 위한 것을 진행하겠습니다.
특정 종목의 "발행주식수"를 읽어 오려면 어떻게 해야 할까요?
매일 변하는 데이터이므로 그런 정보를 제공하는 사이트에서 받아야 합니다.
우리는 comp.fnguide.com  에서 받아오겠습니다.
해당 사이트에 접속하면 우상단에 종목명이나 코드명을 넣어야 합니다.
임의로 "카카오"의 총 주식수를 받아오는 예제를 진행하겠습니다.
종목명을 넣어도 되고, 종목코드를 넣어도 되는데 우리는 코드로 진행하겠습니다.

1) 먼저 해당 사이트에서 종목명을 읽어 오는 항목이 이름이나 id, class를 찾아야 하므로 검사창을 띄우고 확인해 봅니다.
<input type="text" id="SearchText" title="정확한 종목명 또는 종목코드 입력(잘모를 경우 다음 종목찾기 링크 이용)" placeholder="종목명 또는 종목코드 입력" class="acInput">
id도 좋고 class도 좋습니다.
우리는 id로 진행하겠습니다. 해당 칸을 선택하거나 클릭해야 하는데 우리는 click하겠습니다.

 element := driver.findElementById("SearchText").click()
해당 칸에 종목명이나 코드를 넣어야 하는데 우리는 코드를 넣어 줍니다.

driver.Actions.SendKeys(jongmok).perform()

코드를 넣었다면 검색하도록 그 옆의 버튼을 누르거나 해당 칸에서 ENTER키를 눌러줘야 하는데 우리는 ENTER키를 누르겠습니다.

driver.Actions.SendKeys(driver.Keys.ENTER).perform()

그러면 해당 종목에 대한 내용을 가져옵니다. 그러므로 결과를 읽어와야 합니다.

html := driver.PageSource()

이제 읽어온 결과가 html에 모두 있으므로 원하는 데이터를 차근차근 찾으면 됩니다.
이제부터 인고의 시간이 될 수 있습니다. 
RegExMatch를 이용해서 원하는 항목이 항상 정확히 찾아 지도록 표준화를 해야 하기 때문입니다.
어떤 항목은 잘 가져 오는데 다른 항목은 못 가져온다면 제대로 만들지 못 한것입니다.
카카오의 발행 주식수는 다음과 같이 되어 있습니다.(날짜가 다르면 내용도 바뀝니다)
<th scope="row" class="clf"><div>발행주식수<span class="csize">(보통주/ 우선주)</span></div></th>
<td class="r">443,809,305/ 0</td>
그런데 숫자가 두개입니다. 게다가 매번 바뀔것입니다. 이런 경우를 위해 RegExMatch 에서는 다음과 같이 사용하면 편합니다.
먼저 바로 목적하는 숫자를 둘러싼 경우를 묶도록 다음처럼 정의하고 찾아 봅니다.
hay = )</span></div></th>`n<td class="r">(.*?)/(.*?)</td>`n<th scope="row">
Pos := RegExMatch(html, hay, Output) 
안타깝게도 이전 항목에서 유사한 패턴이 있습니다. 그렇다면 다른 방법을 써야 합니다.
hay = 발행주식수<span class
Pos := RegExMatch(html, hay, Output)
hay2 = <td class="r">(.*?)/(.*?)</td>`n<th scope="row">
Pos2 :=RegExMatch(html, hay2, Output, Pos+1)

이렇게 하면 최초에 찾은 hay의 결과가 Output에 담기고, 위치는 Pos에 기록됩니다. 따라서 Pos+1위치에서부터 다시 정말 원하는 값을 찾습니다. 이 방법이 맞다면 다른 종목들도 이상없이 찾아져야 합니다. 만약 문제가 생기면 다른 방법을 고민해야 합니다.
그 고민은 여러분의 몫으로 남기겠습니다.

예제에서는 발행주식수를 가져오는 것을 진행했는데, 실제로는 추가등을 주로 호출하는 상황이 많을것입니다.
그 경우에 맞게 수정해서 사용해 보시기 바랍니다.
여기서 RegExMatch의 결과로 저장되는 내용중에 Output에 결과가 나오고 최초의 (.*?)의 내용이 Output1에 , 두번째 (.*?)의 내용이 Output2에 저장되므로 참고하시기 바랍니다.
더 자세한 RegExpress 관련 내용은 아래 책을 참고하시기 바랍니다.

www.computoredgebooks.com/Regular-Expressions-in-AutoHotkey-EPUB-MOBI-and-PDF-Bundle-AUTOHOTKEY-5-BUNDLE.htm

$7정도로 비싸지 않으므로 참고하시기 바랍니다.

원하는 항목을 가져온 후에 필요한 작업은 추가적으로 고려해서 작성하시면 됩니다.

sele_chrome_read.ahk
0.00MB

반응형