쿠팡 상세 페이지 크롤링 - kupang sangse peiji keulolling

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

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

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

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

매크로 진행 순서.

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

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

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

4. 상품명으로 검색

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

6. 매크로 종료

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

깨달은 점.

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

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

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

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"= "구매할 상품명" & vbCrLf & "(필수사항)" 

Cells(1"B"= "최소 금액" & vbCrLf & "(선택사항)" 

Cells(1"C"= "최대 금액" & vbCrLf & "(선택사항)" 

Cells(1"F"= "가격" 

Cells(1"G"= "상품명" 

Cells(1"H"= "상품 번호" & vbCrLf & "(클릭 시 상품 페이지로)" 

Cells(1"I"= "배송비" 

If Len(Cells(2"A")) < 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=&q=" & Goods_Name1 & "&brand=&offerCondition=&filter=&availableDeliveryFilter=&filterType=&isPriceRange=true&priceRange=" & Min_Price & "&minPrice=" & Min_Price & "&maxPrice=" & Max_Price & "&page=1&trcid=&traid=&filterSetByUser=true&channel=user&backgroundColor=&component=&rating=0&sorter=scoreDesc&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 > 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 > 1 Then 

Browser.navigate "https://www.coupang.com/np/search?component=&q=" & Goods_Name1 & "&brand=&offerCondition=&filter=&availableDeliveryFilter=&filterType=&isPriceRange=true&priceRange=" & Min_Price & "&minPrice=" & Min_Price & "&maxPrice=" & Max_Price & "&page=" & rpt & "&trcid=&traid=&filterSetByUser=true&channel=user&backgroundColor=&component=&rating=0&sorter=scoreDesc&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 

= 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/" & 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"& "로켓" 

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 + 1 

End If  

If i > 71 Then 

'상품갯수는 72개를 표시하지만, 0부터 시작하기때문에 

'71보다 클 경우 for문을 빠져나가야함. 안그러면 오류발생 

Exit For 

End If 

Next 

Next rpt 

Exit Sub 

Err_Check:     '코드 진행 중 error 발생하면 일로 오게댐

If Err <> 0 Then 

Err.Clear 

Resume Next 

End If 

End Sub

---------------------------------------------------------------------------------------------------------Main sub 끝

-----------------------------------------------------------------------------------------------------------------------</code></pre>

cs