아는 지인이 당근 마켓 조회하는 프로그램을 만들어 달라고 해서 잠깐 시간내서 만들어 주려고 했더니 의도치 않게 월급 루팡이 되어버렸다.
당근마켓의 페이지는 단순하고 군더더기가 없다.
조회를 하면 이렇게 페이지가 나오고 [ 더보기 ] 버튼을 눌러가면 비동기 방식으로 데이터를 보내주는 방식이다.
그럼 우린 셀레니움을 하고 있으니까 저 더보기 버튼을 눌러가면서 크롤링을 하면 되는것인가?
정답은 아니다. 그럼 너무 느려지게 된다.
원래 이러한 페이지의 크롤링을 하기 위해서는 눈에 보이는 URL말고 개발자도구의 네트워크 탭에서
검색을 해서 나오는 URL을 가져와야 한다.
또한 팁을 하나 더 드리면 처음페이지보단 2페이지나 어느정도 다음페이지로 넘긴 후 조회하는 것이 좋다.
윗 그림은 첫페이지이고 아래 그림은 두번째 페이지이다. Request Url을 보면 맨뒤에가 1페이지에는 없는것이 2페이지부터는 보이기 시작한다. 물론 1페이지에 /more/flea_marker?page=1을 하면 첫페이지를 가져올 수 있다.
그렇기 때문에 2페이지 이후로 비동기식 페이지를 조회하라고 말하는 것이다.
이 URL가져오는 것을 이해하고 가져올 수 있다면 오늘 이 당근 크롤링도 문제없이 진행할 수 있을 것이다.
사진을 가져오는 코드나 하이퍼링크를 가져오는 것을 빼고 위의 태그들의 각각의 의미를 이해할 수 있다면 크게 어려움이 없이 구현해볼 수 있을 것이다.
더보기
Sub dangkun_Market()
Dim strUrl$
Dim nodes As Object
Dim node As Object
Dim Pic As Object
Dim link$
Dim rngX As Range: Set rngX = [c6]
Dim r&, N&: N = 1
Dim bln As Boolean
Haja_Format bln '= 초기화(처음 : 기존데이터 삭제)
[b5].CurrentRegion.Offset(1).ClearContents
bln = Not bln '= 다음에는 서식을 주기위해 Bln 값을 변경
If [e2] = "물품이나 동네를 검색해보세요" And [F2] = "10페이지 이하" And [F2] > 10 Then Exit Sub
'= 검색어나 페이지 설정이 없을 경우 종료
Application.ScreenUpdating = False
Sel.AddArgument "--headless" '= 헤드리스모드
Sel.Start "chrome" '= 크롬으로 진행
Do
Sel.Get "https://www.daangn.com/search/" & ENCODEURL([e2]) & "/more/flea_market?page=" & N
'= 당근 마켓 1페이지부터 검색시작
If N > [F2] Then Exit Do '= 페이지가 설정한 페이지보다 크면 Loop 탈출
Set nodes = Sel.FindElementsByCss(".flea-market-article") '= 당근 아이템들을 Nodes로 설정
For Each node In nodes
On Error Resume Next '= 예기치 않은 문제가 생기면 무시해라
r = r + 1 '= 순번 출력
rngX(1, 0) = r
link = node.FindElementByCss("img").Attribute("src") '= 아이템 그림을 가져오기 위해 링크 추출
Set Pic = ActiveSheet.Pictures.Insert(link) '= 링크의 그림을 삽입하고
rngX(1, 1) = insert_pic(rngX, Pic) '= 그림의 위치와 크기를 위해 insert_pic 호출
rngX(1, 2) = node.FindElementByCss("img").Attribute("alt") '= 제품명
rngX(1, 2) = Haja_href(rngX(1, 2), node.FindElementByCss("a").Attribute("href")) '= 제품명에 하이퍼링크 걸기
rngX(1, 3) = node.FindElementByCss(".article-region-name").Text '= 주소
rngX(1, 4) = node.FindElementByCss(".article-price ").Text '= 가격
Application.StatusBar = "당근 검색중.. " & Int((r / ([F2] * 12)) * 100) & "% 완료"
'= 상태바로 진행사항을 표시
Set rngX = rngX.Offset(1)
On Error GoTo 0
Next node
N = N + 1
Loop
Haja_Format bln
[e2] = "물품이나 동네를 검색해보세요"
[F2] = "10페이지 이하"
Application.ScreenUpdating = True
MsgBox "검색이 완료되었습니다"
Application.StatusBar = False
End Sub
Function Haja_href(rng As Range, url$)
Dim Ws As Worksheet: Set Ws = ActiveSheet
Ws.Hyperlinks.Add anchor:=rng, Address:=url, ScreenTip:="[웹브라우저 연결]"
rng.Font.Underline = xlUnderlineStyleNone
rng.Font.Color = rgbDarkBlue
rng.Font.Bold = True
rng.Font.Size = 10
Haja_href = rng
End Function
Function insert_pic(rngX As Range, Pic As Variant)
rngX.RowHeight = 70 '= 행높이
With Pic
.ShapeRange.LockAspectRatio = msoFalse '= 사진의 가로세로 고정비율 해제
.Top = rngX(1, 1).Top + 1
.Left = rngX(1, 1).Left + 1
.Width = rngX(1, 1).Width - 2
.Height = rngX(1, 1).Height - 2
End With
End Function
Function Haja_Format(bln As Boolean)
Dim Obj As Object
If bln = False Then
[b5].CurrentRegion.Borders.LineStyle = xlNone
For Each Obj In ActiveSheet.Pictures
If Obj.Name <> "Picture 4" And Obj.Name <> "Button 1" Then Obj.Delete
Next Obj
Else
[b5].CurrentRegion.Borders.LineStyle = 1
End If
End Function
'VBA > 엑사남_심화방' 카테고리의 다른 글
[심화방] VBA_심화_100제 #19 [ 유튜브목록 가져오기] (0) | 2023.06.13 |
---|---|
[심화방] VBA_심화_100제 #18 [ 유튜브댓글 조회하기] (0) | 2023.06.12 |
[심화방] VBA_심화_100제 #16 [ 소득세계산기] (0) | 2023.04.04 |
[심화방] VBA_심화_100제 #14-1 [ 셀레니움 네이버항공 조회] (0) | 2023.04.02 |
[심화방] VBA_심화_100제 #15 [ 4대보험계산기] (0) | 2023.04.01 |
댓글