본문 바로가기
VBA/엑사남_심화방

[심화방] VBA_심화_100제 #17 [ 당근마켓 조회하기]

by 일등미노왕국 2023. 4. 17.

 

아는 지인이 당근 마켓 조회하는 프로그램을 만들어 달라고 해서 잠깐 시간내서 만들어 주려고 했더니 의도치 않게 월급 루팡이 되어버렸다.

 

 

당근마켓의 페이지는 단순하고 군더더기가 없다.

조회를 하면 이렇게 페이지가 나오고 [ 더보기 ] 버튼을 눌러가면 비동기 방식으로 데이터를 보내주는 방식이다.

그럼 우린 셀레니움을 하고 있으니까 저 더보기 버튼을 눌러가면서 크롤링을 하면 되는것인가?

정답은 아니다. 그럼 너무 느려지게 된다.

원래 이러한 페이지의 크롤링을 하기 위해서는 눈에 보이는 URL말고 개발자도구의 네트워크 탭에서

검색을 해서 나오는 URL을 가져와야 한다.

또한 팁을 하나 더 드리면 처음페이지보단 2페이지나 어느정도 다음페이지로 넘긴 후 조회하는 것이 좋다.

첫 페이지를 조회하였을 경우
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

당근마켓 조회.xlsm
0.05MB

댓글