[엑셀vba] 인터넷 익스플로러 컨트롤하기 3(웹 크롤링)
엑셀VBA로 옥션에 자동로그인을 해보자.
- 준비물
옥션 계정 정보, 옥션 로그인 주소, 크롬, 인터넷 익스플로러
- 매크로 진행 계획
- 인터넷 익스플로러 실행
- 옥션 로그인 페이지로 이동
- 아이디, 비번 입력 후 로그인 버튼 클릭
- 끄읕
- 매크로 만들기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | Sub 옥션로그인하기() Dim IE_ctrl As InternetExplorer Dim HTMLDoc As IHTMLDocument Dim input_Data As IHTMLElement Dim URL As String URL = "https://memberssl.auction.co.kr/Authenticate/default.aspx?url=http%3A%2F%2Febay.auction.co.kr%2F%3Fgclid%3DEAIaIQobChMImrbTyN-D6gIVCFRgCh1v5gbtEAAYASAAEgLrvfD_BwE" Set IE_ctrl = New InternetExplorer IE_ctrl.Silent = True IE_ctrl.Visible = True IE_ctrl.navigate URL End Sub | cs |
*변수 역할
IE_ctrl: 인터넷 익스플로러 정보를 담음
HTMLDoc: 로딩된 인터넷 페이지의 소스를 담음
input_Data: 로그인 정보 넣을 때 쓸 변수
URL: 사이트 주소 담을 변수
위 코드를 실행하면 옥션로그인 페이지가 열리면서 매크로가 종료된다.
여기에 로그인 하는 코드를 추가할 예정이다.
자동 로그인 코드를 작성 할 때 로그인 페이지의 태그 분석이 필요하다.
생각보다 개쉬움
크롬에서 옥션 로그인 페이지로 들어간다.
옥션url: https://memberssl.auction.co.kr/Authenticate/?url=http%3a%2f%2fwww.auction.co.kr%2f&return_value=0
로그인 페이지가 나오면 키보드의 'F12' 키를 누른다
-> ①번 표시를 누르고
-> 아이디 입력칸을 마우스로 클릭하면 (②)
-> ③번 화면에서 옥션 아이디 입력하는 곳의 태그ID를 확인 할 수 있음(패스워드나, 로그인 버튼도 같은 방법으로 확인)
코드 작성 시에 필요한 정보니 인터넷 창을 계속 켜두자.
HTML 태그에 ID가 있는 경우
1 2 3 4 5 6 7 8 9 10 | Set HTMLDoc = IE_ctrl.document Set input_Data = HTMLDoc.getElementById("id") input_Data.Value = "옥션ID" Set input_Data = HTMLDoc.getElementById("password") input_Data.Value = "옥션PW" Set input_Data = HTMLDoc.getElementById("Image1") input_Data.Click | cs |
Set HTMLDoc = IE_ctrl.document :로딩된 페이지의 소스를 불러옴
Set input_Data = HTMLDoc.getElementByID("id") : 아이디 입력하는 태그ID
input_Data.value = "옥션ID" :아이디 입력하는 곳에 '옥션ID'를 입력함
Set input_Data = HTMLDoc.getElementByID("password") : 패스워드 입력하는 태그 ID
input_Data.value = "옥션PW" :패스워드 입력하는 곳에 '옥션PW'를 입력함
Set input_Data = HTMLDoc.getElementById("Image1") : 로그인 버튼의 태그를 찾아냄
input_Data.Click : 로그인 버튼을 누름
태그 ID가 있으면 웹 컨트롤에 상당히 편리하다.
하지만 ID가 없다면 어떻게 할텐가
그럴땐 다른 데이터로 하면 된다.
HTML 태그 ID가 없을 때 Class 이용
1 2 3 4 5 6 7 8 9 10 | Set HTMLDoc = IE_ctrl.document Set input_Data = HTMLDoc.getElementsByClassName("txt").Item input_Data.Value = "옥션ID" Set input_Data = HTMLDoc.getElementsByClassName("txt").Item input_Data.Value = "옥션PW" Set input_Data = HTMLDoc.getElementsByClassName("btn_login").Item input_Data.Click | cs |
Set HTMLDoc = IE_ctrl.document :로딩된 페이지의 소스를 불러옴
Set input_Data = HTMLDoc.getElementsByClassName("txt").item : 아이디 입력하는 Class
input_Data.value = "옥션ID" :아이디 입력하는 곳에 '옥션ID'를 입력함
Set input_Data = HTMLDoc.getElementsByClassName("txt").item : 패스워드 입력하는 Class
input_Data.value = "옥션PW" :패스워드 입력하는 곳에 '옥션PW'를 입력함
Set input_Data = HTMLDoc.getElementsByClassName("btn_login").Item : 로그인 버튼의 Class
input_Data.Click : 로그인 버튼을 누름
옥션의 경우 아이디와 패스워드 입력하는 곳의 Class가 동일하다.
위 코드를 실행하면 아이디 입력하는 곳에 아이디, 패스워드가 입력되면서 로그인 오류가 난다.
Class는 중복으로 쓰이는 경우가 많으므로 짜증난다.
그래서 내가 원하는 Class가 나올때 데이터를 입력하도록 만들어 줘야 한다.
어떻게?
For Each를 이용하자
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Set HTMLDoc = IE_ctrl.document Set input_Data = HTMLDoc.getElementsByClassName("txt").Item input_Data.Value = "옥션ID" For Each input_Data In HTMLDoc.getElementsByClassName("txt") If input_Data.Type = "password" Then input_Data.Value = "옥션pw" Exit For End If Next Set input_Data = HTMLDoc.getElementsByClassName("btn_login").Item input_Data.Click | cs |
For Each input_Data In HTMLDoc.ElementsByClassName("txt")
if input_Data.Type = "password" then
input_Data.Value = "옥션pw"
Exit For
end if
Next
패스워드 입력하는 부분만 바꿨다.
for each 함수는 태그 클래스가 'txt'것들을 html 소스의 위에서 아래로 가져온다.(html 소스는 HTMLDoc 변수에 저장되어있음)
그리고 if문으로 태그 타입이 'password' 인 녀석이 나타나면 '옥션pw'를 입력하고 for문을 탈출 한다.
옥션로그인하기 코드 전문
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | Sub 옥션로그인하기() Dim IE_ctrl As InternetExplorer Dim HTMLDoc As IHTMLDocument Dim input_Data As IHTMLElement Dim URL As String URL = "https://memberssl.auction.co.kr/Authenticate/?url=http%3a%2f%2fwww.auction.co.kr%2f&return_value=0" Set IE_ctrl = New InternetExplorer IE_ctrl.Silent = True IE_ctrl.Visible = True IE_ctrl.navigate URL Wait_Browser IE_ctrl Set HTMLDoc = IE_ctrl.document Set input_Data = HTMLDoc.getElementsByClassName("txt").Item input_Data.Value = "옥션ID" For Each input_Data In HTMLDoc.getElementsByClassName("txt") If input_Data.Type = "password" Then input_Data.Value = "옥션PW" Exit For End If Next Set input_Data = HTMLDoc.getElementsByClassName("btn_login").Item input_Data.Click End Sub | cs |
* 중간에 있는 Wait_Browser IE_ctrl 역할
Wait_Browser : 사용자 정의 함수
IE_ctrl이 페이지 로딩이 끝날때까지 대기하도록 해줌
Wait_Browser 코드
1 2 3 4 5 6 7 8 9 | Sub Wait_Browser(Browser As InternetExplorer, Optional t As Integer = 1) While Browser.Busy Or Browser.readyState <> 4 DoEvents Wend Application.Wait DateAdd("s", t, Now) End Sub | cs |
매크로 실행영상
'컴퓨터 공부 > 엑셀 & VBA' 카테고리의 다른 글
[엑셀vba] 파워포인트 제어하기 (0) | 2020.08.27 |
---|---|
[엑셀vba] 내가 만든 매크로 추가 기능에 추가하기 (0) | 2020.07.23 |
[엑셀vba] 인터넷 익스플로러 컨트롤하기 4(이미지 다운로드) (0) | 2020.07.04 |
[엑셀vba] 인터넷 익스플로러 컨트롤하기 3(웹 크롤링) (1) | 2020.06.24 |
[엑셀vba] 인터넷 익스플로러 컨트롤하기 1(시작) (1) | 2020.06.10 |