프로그램/완료

[엑셀vba] 쿠팡에 있는 상품을 스크래핑 해보자(feat. 자동로그인)

도 박사 2020. 5. 20. 19:42
반응형

https://godofexcel.tistory.com/106

 

[엑셀vba] 쿠팡 상품을 스크래핑해보자 (업데이트 버전)

예전에 엑셀vba로 쿠팡에 있는 상품 목록을 스크래핑 하는 프로그램을 만들어봤었다. 기존에 몇가지 기능을 추가로 넣는 업데이트를 감행하였다! (ㄷㄷ;; 별거 아닌데 별거 있는거 처럼하기) 추

godofexcel.tistory.com

 

 

쿠팡 상품 스크래핑 업데이트 버전.

 


2021.04.21 추가내용

용어 정리

 

1) 웹 크롤링(Web Crawling)

- 웹 크롤러(자동화 봇)가 일정 규칙으로 웹 페이지를 브라우징하는 기술

 

2) 웹 스크래핑(Web Scarping)

- 웹 사이트 상에서 원하는 정보를 추출하는 기술

- 일반적으로 말하는 웹 크롤링을 웹 스크래핑을 의미

 

3) 파싱(Parsing)

- 특정 웹 페이지에 원하는 데이터를 패턴이나 순서에 따라 추출해 정보를 가공하는 것

- 더 일반적인 개념으로는 일련의 데이터를 분석하고 가공하는 것

 

[출처. dheldh77.tistory.com/entry/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%9B%B9-%ED%81%AC%EB%A1%A4%EB%A7%81%EA%B3%BC-%EC%9B%B9-%EC%8A%A4%ED%81%AC%EB%9E%98%ED%95%91]


 

 

 

쿠팡에 있는 상품을 긁어서 엑셀시트에 표시해보았다.

 

그리고 자동로그인까지 추가로 해보았다.

 

----------------------------------------------------------------------------------------------------------

 

매크로 진행 순서.

 

1. 엑셀파일에 찾을 검색조건 입력하고 매크로 실행

* 검색조건: 검색어(필수), 최저금액(선택), 최대금액(선택)

 

2. 쿠팡 로그인 페이지 열기

* 인터넷 익스플로러 사용

 

* 익스플로러 표시할지 말지 선택가능 하고, 표시안하면 속도가 더 빠른느낌

 

3. 로그인 ID, 패스워드 입력 후 로그인

* 생략가능

 

4. 상품명으로 검색

* 페이지당 상품 정렬 갯수는 72개로 설정

 

5. 검색 결과를 첫페이지부터 마지막페이지까지의 모든 상품을 엑셀 시트에 정렬하기.

* 정렬 데이터: 가격, 상품명, 상품번호, 배송비(무료배송, 로켓으로 구분)

* 로켓은 로켓와우, 로켓프레시, 로켓배송 포함

* 상품번호는 매크로 종료 후 클릭했을 때 상품페이지로 넘어가도록 만듦

* 품절 및 광고 상품은 수집하지 않음

* 중고 및 재포장, 훼손 등 최저가 상품이 존재하면 최저가로 수집

* 데이터 삭제하면 검색 결과 셀이 지워짐

* 데이터 삭제하지 않고 재검색하면 마지막 데이터 다음 셀에 입력됨

 

6. 매크로 종료

 

----------------------------------------------------------------------------------------------------------

 

깨달은 점.

 

1) 쿠팡 검색결과가 수십만개더라도 마지막 페이지는 매번 13까지 나옴. (72개 정렬기준)

2) 보통 900개 정도의 상품이 수집됨

3) 중복 상품도 상당히 많음

4) 1원 단위로 끝나는 상품은 못 봤음(최저가격은 10원)

5) 1로 검색했을 때 어마무시하게 많은 데이터가 나옴 몇천만개

 

 

<

----------------------------------------------------------------------------------------------------------

매크로 실행 영상

 

[매크로 실행 영상]

 

쿠팡 상품 크롤링.xlsm
0.06MB

----------------------------------------------------------------------------------------------------------

 

5개의 모듈로 구성되어있음.

 

1. Main

2. Wait_Browser / 로딩대기 하는 모듈

3. ENCODEURL(문자열) /검색어 url 인코딩하는 모듈

4. ExtractNumber(문자열) /문자+숫자 섞여있는 문자열에서 숫자만 뽑아내는 모듈

5. 데이터 삭제하는 모듈

 

 

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
Sub Main_Macro() '함수 이름 Main_Macro
 
    Application.ScreenUpdating = False '매크로 실행 중 엑셀 업데이트 중지 
 
    Dim Goods_Name1, Goods_Name, URL As String '상품명, url 주소담을 변수
    Dim Lastrow_F, Max_Price, Min_Price, LastPage As Long 'F열의 마지막 데이터 위치, 가격, 마지막 페이지 담을 변수
    Dim i, rpt, vbCrLf_Loca As Integer 'i, rpt = 반복 횟수 카운트 , vbCrLf_Loca는 엔터키 위치 넣을 변수
    Dim Browser As InternetExplorer ' Explorer 변수 
    Dim HTMLDoc As IHTMLDocument 'HTML 태그 불러오는 변수 
    Dim Button, Button2 As IHTMLElement '버튼 클릭할 때 쓸 변수 
    Dim Input_Data As IHTMLElement '데이터 입력할 때 쓸 변수 (ID, 패스워드)
 
     
    On Error GoTo Err_Check '에러 발생 시 무시하고 다음코드 진행
 
     
    Cells(1"A"= "구매할 상품명" &amp; vbCrLf &amp; "(필수사항)" 
    Cells(1"B"= "최소 금액" &amp; vbCrLf &amp; "(선택사항)" 
    Cells(1"C"= "최대 금액" &amp; vbCrLf &amp; "(선택사항)" 
    Cells(1"F"= "가격" 
    Cells(1"G"= "상품명" 
    Cells(1"H"= "상품 번호" &amp; vbCrLf &amp; "(클릭 시 상품 페이지로)" 
    Cells(1"I"= "배송비" 
     
     
    If Len(Cells(2"A")) &lt; 1 Then '검색어가 없을때 매크로 종료
     
        MsgBox "구매할 상품명을 입력하시오.", vbOKOnly, "검색어 없음" 
        Cells(2"A").Select 
        Exit Sub 
     
    End If 
     
    '--------------------------------------------- 변수 초기화 --------------------------------- 
 
    Goods_Name1 = ENCODEURL(Cells(2"A").Value) '검색어 url인코딩 
    Min_Price = Cells(2"B").Value '최소금액 설정
    Max_Price = Cells(2"C").Value '최대금액 설정 
     
    Lastrow_F = ActiveSheet.Cells(Rows.Count, "F").End(xlUp).Row + 1  
    'F열의 마지막 데이터 위치 알아냄
     
    URL = "https://login.coupang.com/login/login.pang?rtnUrl=https%3A%2F%2Fwww.coupang.com%2Fnp%2Fpost%2Flogin%3Fr%3Dhttps%253A%252F%252Fwww.coupang.com%252F"  '쿠팡 로그인 페이지 주소
     
     
    '-------------------------------------------- 웹 컨트롤 시작 --------------------------------------------------------- 
 
    Set Browser = New InternetExplorer 
    Browser.Silent = True 
    Browser.Visible = False 'True = 인터넷 창 보임, False = 인터넷 창 숨김 
    Browser.navigate URL 'URL 변수에 있는 주소로 이동 
     
    Wait_Browser Browser '페이지 로딩 끝나면 코드 진행 
      
    Set HTMLDoc = Browser.document 'HTML 소스 불러오기 
     
     
    '-------------------------------------------- 웹1. 로그인 ------------------------------------------------------------ 
 
'    Set Input_Data = HTMLDoc.getElementById("login-email-input") 
     '쿠팡id 입력 하는 곳의 태그 ID 가져오기 
'    Input_Data.Value = "쿠팡id 입력" '쿠팡ID 
'    Set Input_Data = HTMLDoc.getElementById("login-password-input") 
     '쿠팡 Password 입력 하는 곳의 태그 ID 가져오기 
'    Input_Data.Value = "쿠팡 비밀번호 입력" '쿠팡 비번 
'    Set Button = HTMLDoc.getElementsByClassName("login__button login__button--submit _loginSubmitButton").Item '로그인 버튼의 ClassName 가져오기 .item 안붙이면 오류남 
'    Button.Click '로그인 버튼 클릭 
     
    Wait_Browser Browser '페이지 로딩 대기 
     
 
    '-------------------------------------------- 웹2. 조건 검색(상품명, 금액대 설정) ------------------------------------ 
 
    Browser.navigate "https://www.coupang.com/np/search?component=&amp;q=" &amp; Goods_Name1 &amp; "&amp;brand=&amp;offerCondition=&amp;filter=&amp;availableDeliveryFilter=&amp;filterType=&amp;isPriceRange=true&amp;priceRange=" &amp; Min_Price &amp; "&amp;minPrice=" &amp; Min_Price &amp; "&amp;maxPrice=" &amp; Max_Price &amp; "&amp;page=1&amp;trcid=&amp;traid=&amp;filterSetByUser=true&amp;channel=user&amp;backgroundColor=&amp;component=&amp;rating=0&amp;sorter=scoreDesc&amp;listSize=72" 'Goods_Name1은 url 인코딩된 검색어, Min_Price, Max_Price는 가격조건있을 경우 들어감   
 
    Wait_Browser Browser '페이지 로딩 대기 
 
    Set HTMLDoc = Browser.document '로딩된 페이지 소스 가져오기 
     
    Set Button = HTMLDoc.getElementsByClassName("btn-page").Item 
    LastPage = Right(Button.innerText, 2
    '상품 마지막 페이지번호 추출, 페이지번호가 없으면 오류가 나고 LastPage는 0이 들어감.
     
     
    If LastPage &gt; 8 Then 
    '상품정렬 갯수 72개로 할 경우 13페이지까지 표시됨. 그리고 선택불가 상태로 나타남.
         
        Set Button = HTMLDoc.getElementsByClassName("btn-last disabled").Item 
        LastPage = Button.innerText 
 
    ElseIf LastPage = 0 Then Browser 
    '페이지번호가 없으면 error발생함 그리고 값은 0됨. 그래서 1의 값을 넣어줌. 1의 의미는 1페이지
     
        LastPage = 1 
     
    End If 
     
    Set Button = HTMLDoc.getElementById("productList"'상품리스트 정보가 담긴 html태그 id 찾기 
 
 
     
    For rpt = 1 To LastPage '마지막 페이지까지 반복 
     
        If rpt &gt; 1 Then 
         
            Browser.navigate "https://www.coupang.com/np/search?component=&amp;q=" &amp; Goods_Name1 &amp; "&amp;brand=&amp;offerCondition=&amp;filter=&amp;availableDeliveryFilter=&amp;filterType=&amp;isPriceRange=true&amp;priceRange=" &amp; Min_Price &amp; "&amp;minPrice=" &amp; Min_Price &amp; "&amp;maxPrice=" &amp; Max_Price &amp; "&amp;page=" &amp; rpt &amp; "&amp;trcid=&amp;traid=&amp;filterSetByUser=true&amp;channel=user&amp;backgroundColor=&amp;component=&amp;rating=0&amp;sorter=scoreDesc&amp;listSize=72" '상품 검색창 이동 
             
            Wait_Browser Browser 
             
            Set Button = HTMLDoc.getElementById("productList"'productList라는 id에 children 속성으로 상품정보가 들어 있음. 매크로 한 줄씩 진행하다가 지역창을 보면 button의 children 속성에서 item 1 ~ item 72까지 표시됨을 볼 수 있는데, 코드에서 사용하려면 0부터 숫자가 시작함. (배열느낌) 
 
            
        End If 
         
     
        Set Button2 = HTMLDoc.getElementsByClassName("descriptions-inner").Item 
         
        i = 0 
         
        For Each Button2 In HTMLDoc.getElementsByClassName("name"'상품 이름이 연관된 Class name은 'name' 
             
            Goods_Name = Button.Children(i).innerText '상품 정보가 담긴 텍스트를 goods_name에 저장. 무료배송, 이름, 가격 등 
             
            If InStr(1, Goods_Name, "품절"Or InStr(1, Goods_Name, "광고"Then '품절, 광고 문자가 들어가면 암것도 안함 
             
            ElseIf InStr(1, Goods_Name, Button2.innerText) Then 'button2 문자열이 Goods_Name 안에 포함될 경우 코드 진행 
             
                Cells(Lastrow_F, "G"= Button2.innerText '상품 이름 뽑아서 G열에 저장 
 
                Cells(Lastrow_F, "H"= Button.Children(i).ID '상품번호 클릭 시 상품 구매 페이지로 이동 
                Worksheets(1).Hyperlinks.Add Cells(Lastrow_F, "h"), "https://www.coupang.com/vp/products/" &amp; Button.Children(i).ID 
                '상품의 상세 페이지 접근을 위해 하이퍼링크 걸었음, 상세페이지 = 쿠팡url + 상품번호 
                                 
                If InStr(1, Goods_Name, "무료배송"Then '무료배송이면 I열에 표시 
             
                    Cells(Lastrow_F, "I"= "무료배송" 
                 
                End If 
                 
                If InStr(1, Goods_Name, "도착 보장"Then '로켓배송이면 I열에 표시 
             
                    Cells(Lastrow_F, "I"= Cells(Lastrow_F, "I"&amp; "로켓" 
                 
                End If 
                 
 
                 
                If InStr(1, Goods_Name, "최저"Then 
                 
                    Goods_Name = Mid(Goods_Name, 1, InStrRev(Goods_Name, "원"- 1
                    Goods_Name = Mid(Goods_Name, 1, InStrRev(Goods_Name, "0원"+ 1
                     
                    vbCrLf_Loca = InStrRev(Goods_Name, " "
                     
                    If vbCrLf_Loca Then 
                     
                        Cells(Lastrow_F, "F"= ExtractNumber(Mid(Goods_Name, vbCrLf_Loca + 1, Len(Goods_Name) - vbCrLf_Loca)) 
                                             
                    End If  
                Else 
                 
                    Goods_Name = Mid(Goods_Name, 1, InStrRev(Goods_Name, "원"- 1
                     
                    If InStr(Goods_Name, "0원"Then 
                 
                        Goods_Name = Mid(Goods_Name, 1, InStrRev(Goods_Name, "0원")) 
                        Goods_Name = Replace(Goods_Name, "원 캐"" 캐"
                         
                        If InStr(Goods_Name, "0원"Then 
                 
                            Goods_Name = Mid(Goods_Name, 1, InStrRev(Goods_Name, "0원"+ 1
                         
                        End If  
                                             
                    vbCrLf_Loca = InStrRev(Goods_Name, vbCrLf) 
                     
                    If vbCrLf_Loca Then 
                     
                        Goods_Name = Mid(Goods_Name, vbCrLf_Loca + 1, Len(Goods_Name) - vbCrLf_Loca) 
                         
                    End If 
                     
                    Cells(Lastrow_F, "F"= ExtractNumber(Goods_Name) '문자+숫자로 된 문자열에서 숫자만 뽑아내는 사용자 정의 함수 
                     
                    End If 
                 
                End If 
                 
 
                 
                Lastrow_F = Lastrow_F + 1 '다음 줄에 데이터 입력을 하기위해 1을 더해줌
                 
                i = i + 1 
                 
            End If  
             
             
             
            If i &gt; 71 Then 
            '상품갯수는 72개를 표시하지만, 0부터 시작하기때문에 
            '71보다 클 경우 for문을 빠져나가야함. 안그러면 오류발생 
             
                Exit For 
             
            End If 
        Next 
 
 
    Next rpt 
     
     
    Exit Sub 
     
Err_Check:     '코드 진행 중 error 발생하면 일로 오게댐
        If Err &lt;&gt; 0 Then 
            Err.Clear 
            Resume Next 
        End If 
 
End Sub
 
 
 
---------------------------------------------------------------------------------------------------------Main sub 끝
-----------------------------------------------------------------------------------------------------------------------</code></pre>
cs

 

 

 

COUPANG

쿠팡은 로켓배송

www.coupang.com

 

반응형