본문 바로가기
국비교육기관/수업

16일차_자바기초_배열이란 / 웹크롤링_Gmarket_이미지크롤링

by 밀키스 2021. 4. 5.

@21.04.05

JAVA 

@Array (배열) 

 배열이란? 

=> 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것.

%배열 생성 

 

- 기본적으로 초기에 크기를 설정하면 변경할 수 없다.

- Reference 변수에는 주소값이 들어있다.

Stack: Heap영역에 생성된 데이터의 Reference 값이 할당된다.

Heap: 데이터 크기가 큰 값들이 선언되는 공간.

       => Garbage Collector: 데이터값이 할당되었을 때 필요한 Data만 Mark하고 그 외는 지우는데, 그러한 Data를                찾는 녀석

 

이클립스스캔

================================================

웹크롤링

 

G-Market 베스트 가져오기

@find_element_by_css_selector 

from selenium import webdriver as wb # 브라우저를 제어하기 위한 라이브러리
import time as t # 중간중간 컴퓨터에게 쉬는시간을 부여하는 라이브러리
from tqdm import tqdm_notebook as tq
from bs4 import BeautifulSoup as bs
#==============================================================================
driver = wb.Chrome()
url = "http://corners.gmarket.co.kr/Bestsellers"
driver.get(url)
#==============================================================================
# 첫번째 상품 이미지 접근
# 인접형제선택자 기호는 +. 나를 기준으로 바로 내 옆에있는 형제를 가지고 올 때.
first = driver.find_element_by_css_selector("p#no1+div")
first.click()

G-Market페이지 호출: G-Market 사이트의 "베스트 페이지"를 호출하였다.

 find_element_by_css_selector : 입력한 CSS 선택자 조건을 만족하는 모든 요소 중 첫 번째 요소를 반환

 p#no1+div  => p Tag 중 ID가 no1인것에 인접한 형제 Tag div를 가져온다.

           ( + ) --> 자신을 기준으로 바로 내 옆에있는 형제 Tag를 가져올 때.

 

@nth-child - 자식 Tag 중 순서에 따른 선택 

# 상품의 카테고리 가져오기
driver.find_element_by_css_selector("div.location-navi>ul>li:nth-child(2)>a").text

 div.location-navi>ul>li:nth-child(2)>a 

div 라는 Tag 중 " location-navi "라는 class를 갖고 있는 것에 들어가, 그 자식 Tag인

ul tag로 들어가서 2번째 자식 태그인 " li "로 들어가 그 안의 " a " Tag를 불러온다.

 

%뒤로가기 기능 

 => webdriver.Chrome(). back() 

@G-Market_Best 10개 상품 가져오기 

# 총 10번 반복시키기
for i in tq(range(1,11)):
    number = "no" + str(i)
    try:
        # 만약에 True이면
        first = driver.find_element_by_css_selector("p#"+number+"+div")
        first.click()
    except:
        # 아니고 False이면
        first = driver.find_element_by_css_selector("p#"+number+"+span+div")
        first.click()
    # 상품의 이름, 가격, 카테고리 가져오기
    name = driver.find_element_by_css_selector("h1.itemtit").text
    price = driver.find_element_by_css_selector("strong.price_real").text
    category = driver.find_element_by_css_selector("div.location-navi>ul>li:nth-child(2)>a").text
    print("상품명 >> " + name)
    print("가격 >> " + price)
    print("카테고리 >> " + category)
    # 상품의 뒤로가기
    driver.back()

Best 페이지에서 10개의 상품(1-10순위 상품)을 가져오는 코드

 

 

- 우선 크롬창을 미리 열어서 실행하였다.

- tq는 위에서 작성했든 tqdm_notebook 모듈이다.

- 예외처리 구문으로 구별한것의 경우는 위 사진에서 big이란 스티커가 붙은 상품의 경우 p Tag 바로 근접한 곳에 div     Tag가 아닌 span Tag가 존재한다. 때문에 span 옆에 존재하는 div Tag를 불러오도록 코드를 수정하였다.

 

 결과 

@가져온 결과 CSV파일 저장 

- CSV 파일은 저장해봤을것, 값을 불러오는 중간에 List를 만들어 각각의 값을 추가한다.

- CSV 파일로 저장하는 명령어는 to_csv 라는 명령어를 통해 이뤄질 수 있다.

         ==> 인코딩은 euc-kr / utf-8 / utf-8-sig / ''(공백) 이렇게 4가지가 있다.

         ==> 나의 경우는 euc-kr이랑 sig가 먹혔다.

@크롬창 안보이게 실행

options = wb.ChromeOptions()
options.add_argument('headless')
options.add_argument('window-size=1920x1080')
options.add_argument("disable-gpu")
driver= wb.Chrome("C:/Users/smhrd/Desktop/크롤링/chromedriver.exe",chrome_options = options)
url = "http://corners.gmarket.co.kr/Bestsellers"
driver.get(url)

headless -> 크롬창 안보이게 해주는 속성

window-size --> 화면크기

disable-gpu --> GPU 환경이 아님을 알리는 옵션

 

위의 3가지 코드는 굳이 외워서 쓰지 않는다고 합니다. 충분히 기능적으로 카페해두 무관..

 

그리고 chrome_options 라는 값에 " options " 라는 값을 기입해주었는데, 이렇게 옵션을 실행한 경우에는 

ChromeDriver의 위치를 명시해줘야 한다.

평소에 Webdriver.Chrome()이란 명령어를 공백으로 두고 실행하였는데, 이는 크롬드라이버가파이썬 스크립트 파일이 있는 폴더와 같은 폴더에 존재하기 때문.

@COPY SELECTOR 

지금까지는 눈으로 직접 부모 / 자식 / 형제 TAG를 확인하여 기재하였지만

저렇게 해당 부분을 마우스 우클릭 만으로 해당 부분과 관계된 모든 Tag를 얻을 수 있다.

@이미지 크롤링 

from urllib.request import urlretrieve # 이미지의 경로를 파일로 저장해주는 라이브러리
from selenium import webdriver as wb # 브라우저를 제어하기 위한 라이브러리
import time as t # 중간중간 컴퓨터에게 쉬는시간을 부여하는 라이브러리
from bs4 import BeautifulSoup as bs
#1======================================================================================
driver = wb.Chrome()
url = "https://search.naver.com/search.naver?sm=tab_hty.top&where=image&query
=%EC%95%84%EC%9D%B4%EC%9C%A0&oquery=%EC%86%90%ED%9D%A5%EB%AF%BC&tqi=hbr6Uwp0J
y0ssfvC5yNssssstLG-378649"
driver.get(url)
#2======================================================================================
from selenium.webdriver.common.keys import Keys
body = driver.find_element_by_tag_name('body')
for i in range(400):
    body.send_keys(Keys.PAGE_DOWN)
#3======================================================================================
soup = bs(driver.page_source, 'lxml')
img = soup.select("img._image._listImage")
imgList = []
for i in img:
    imgList.append(i['src'])
#4======================================================================================
for i in range(len(imgList)):
    urlretrieve(imgList[i],"C:/Users/smhrd/Desktop/이미지/"+str(i)+".jpg")

% 2번 주석 

응 아이유 다운 받을ㄱ....

창의 우측에 스크롤을 보면 스크롤바가 짧은걸로 굉장히 많은 양의 Data가 있음을 유추할 수 있다.

때문에 15일차에 진행했던 페이지 스크롤내리기 기능을 참조하여 ( selenium.webdriver.common.keys )

페이지를 대충 400번 정도 내려주었다. 그러니 다 내려가더라..

 

%3번 주석 

-  page_source : 브라우저에 보이는 그대로의 HTML, 크롬 개발자 도구의 Element 탭 내용과 동일.

-  lxml  html.parser  : 15일차의 경우 lxml이 안먹혔는데 영... 이유를 모르겠네.... 무튼 WD를 통해 불러온                                               데이터를 BS를 이용해 가공한다.

- img라는 변수에 BS를 통해 긁어온 Data에서 img Tag 중 < _image _listImage >라는 class명을 갖고있는 Tag를        불러들인다. (CLASS 명의 공백부분은 코드에선 온점( . )으로 표기해준다. - Class명이 2개라는 뜻)

- 그리고 빈 리스트에 긁어온 각 이미지 데이터를 모두 담는다.

 

%4번 주석 

- . urlretrieve 라는 모듈을 통해 이미지 파일을 저장한다.

- 순서대로 (저장할 Data, 파일경로(파일명당연히포함) )라는 값을 기입했다.

반응형

댓글