프날 오토핫키 강좌
누르면 강좌 리스트가 나와요
프날 오토핫키 강좌

⚠ 이 강좌는 오토핫키 v1을 다룹니다

지금 보시는 강좌는 구버전 오토핫키(v1.1)를 다루고 있습니다. 따라서 본 강좌의 내용은 현재 최신 오토핫키 버전 (v2.0)과 호환되지 않습니다. 구버전의 정보가 필요한 것이 아니라면, 가능한 한 새로운 사이트에 작성한 v2 강좌(https://ahkv2.pnal.dev)를 봐주시길 바랍니다.

[프날 오토핫키] WinHTTP #3: 정적 크롤링 (GET)

이전에 정적 크롤링과 동적 크롤링의 차이를 설명드렸습니다. 이번 강에서는 정적 크롤링을 한번 해보도록 하겠습니다.


 정적 크롤링 해보기 

1. COM객체 만들기

드디어 오토핫키 코드를 작성합니다. 크롤링을 위해 처음으로 작성할 코드는 아래와 같습니다.

WinHTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")

괄호 안은 표현식(Expressions)이기 때문에 문자열에 따옴표 표시를 해주었구요, ComObjCreate()함수의 반환값을 WinHTTP 변수에 담아준 모습을 볼 수 있습니다.

대입해주는 변수는 어디까지나 "변수"이기 때문에 이름이 바뀌어도 상관없습니다.

wh := ComObjCreate("WinHTTP.WinHTTPRequest.5.1"

저는 wh라는 변수를 사용하겠습니다. 자유롭게 써주세요.

 

ComObjCreate라는 함수를 이해하려면 먼저 COM이라는 개념을 알아야합니다. COM은 마이크로소프트에서 만든 하나의 컴포넌트 규격입니다. 이러한 COM은 함수의 묶음을 많이 가지고 있습니다. 그 묶음 중에서도 WinHTTP 분류에 있는 WinHTTPRequest.5.1 이라는 "함수 묶음"을 가져와, wh라는 변수에 담아주는 구문입니다.

 

객체 지향 프로그래밍에 대한 지식이 필요한 개념인데, 여러분께 단번에 설명드리진 못하겠네요. 다만, 우리가 사용할 땐 이것만 알면 될 것 같습니다.

WinHTTP를 이용하기 위해, 함수 묶음을 특정 변수에 담는다!

우리는 이 변수를 이용하여 함수를 이용할 수 있습니다. 이렇게 함수가 담긴 변수를 "객체"라고 하도록 하겠습니다. 객체에서 함수를 꺼내 쓰는 방법은 아래에서 소개할게요.

 

즉, 이 과정은 COM객체(여기서는 wh)를 만드는 과정입니다. 우리는 이 COM 객체를 이용하여 웹과 통신하게 됩니다.

 

2. 통신 준비하기

이제 웹사이트와 통신을 할 방식과, 대상 웹 주소를 지정해주어야합니다. 이는 아까 만든 COM객체를 이용합니다.

wh.Open("GET", "https://pnal.kr")

위와 같이, 객체 뒤에 점(.)을 찍고 함수명을 적으면 객체가 가지고 있는 함수를 호출할 수 있습니다.

여기서는 wh객체가 가지고 있는 Open()함수를 사용하네요.

 

Open()함수에는 두 가지 매개변수가 필요합니다.

  1. 통신 방식
  2. 대상 웹 주소

위 예제에서는 GET방식과, 프날 주소를 사용합니다.

 

* 통신 방식

통신 방식은 여러가지가 있지만 일단 여기선 GET 방식을 사용합니다. GET 방식은 인터넷에서 정보를 받는 경우를 뜻합니다. 우리는 웹에서 HTML 소스코드를 가져오는 것이 목적이기 때문에, GET 방식을 이용해야겠지요.

 

* 웹 주소

URL을 써줄 땐 프로토콜(http나 https)까지 써주어야합니다. 위 예제에선 https://를 붙여준 것을 알 수 있습니다. 보통 웹브라우저 주소창에 프로토콜 또한 표시되어있습니다.

 

이번 단계를 통해, 우리는 "https://pnal.kr"에서, "GET"방식을 이용하라! 를 지정해 준 것입니다. 이제 소스를 받아오기 위한 모든 준비를 마쳤습니다.

현재까지의 스크립트

 

3. 소스코드 가져오기

아까 준비해 둔 "URL""통신 방식"을 이용하여 통신을 시도합니다. 통신을 요청하는 함수는 Send()입니다.

wh.Send()

만약 통신을 할 때, 우리쪽에서 보내는 값이 있다면 Send()함수의 매개변수가 필요합니다. 그렇지만 우리는 보내는 값이 없기 때문에 (받을 값만 있죠.) 비워주었습니다.

현재까지의 스크립트

 

4. 통신의 결과 값 가져오기

통신이 정상적으로 완료되면, 통신 결과를받게 됩니다. 이 결과값은 통신 방식에 따라 달라지는데, 우리가 사용한 GET에는 아래와 같은 값들을 받게 됩니다. (전부를 적기엔 많아서 일부만 적었습니다.)

  • Text
  • Stream
  • Binary
  • Header

그 중에서도 우리가 원하는 "페이지의 소스코드"는 Text입니다. 이는 ResponseText() 함수가 반환값의 형태로 가지고 있습니다.

wh.ResponseText()

이 함수의 반환값엔 우리가 원하는 웹페이지의 소스코드가 담겨있습니다. 한번 MsgBox로 출력해보겠습니다.

 

wh := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
wh.Open("GET", "https://pnal.kr")
wh.Send()
MsgBox, % wh.ResponseText()

정상적으로 웹페이지의 스크립트가 출력될 것입니다. 물론, 엄청 길기 때문에 아마 모니터 밖으로 MsgBox의 크기가 넘어갈 것입니다.

 

아무튼, 우리는 이렇게 웹페이지의 소스코드를 가져오는데 성공했습니다. 이제 이 소스코드를 가공(파싱)하면, 우리가 원하는 값만 가져올 수 있는 것이지요.

 

파싱에 대해서는 강좌 본편에서 소개를 드리기도 했고, 정규식과 같은 경우엔 따로 강좌를 쓰기도 했습니다.

정규식 강좌 바로가기>


 처음은 원래 어렵습니다. 

한번 복습해봅시다. 우리는 WinHTTP를 통해 웹페이지의 소스코드를 가져오기 위해서, 4단계를 거쳤습니다.

  1. COM객체 생성하기
  2. 생성한 객체를 이용하여, 대상 웹 페이지와 통신 방식 정하기
  3. 통신하기
  4. 통신의 결과 값 받아오기

그리고, 이에 대한 소스코드는 아래와 같습니다.

단 4줄!

이해를 바라지는 않습니다. 쉬운 개념은 아니니까요. 강좌에서도 정확한 설명을 드릴 수 없었습니다. 저는 어려운걸 쉽게 풀어내는 능력이 부족한가봐요.

몇 번 따라해보고, 강좌나 예제를 보지 않고 스크립트를 짜실 수 있을 정도로만 공부하시면 됩니다.

예제.ahk
0.00MB