@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, 파일경로(파일명당연히포함) )라는 값을 기입했다.
'국비교육기관 > 수업' 카테고리의 다른 글
18일차_자바_2차원 배열 (0) | 2021.04.07 |
---|---|
17일차_자바기초_이중for문 / 웹크롤링 Test (0) | 2021.04.06 |
15일차_자바기초_for_dowhile / 웹크롤링_Selenium (0) | 2021.04.02 |
14일차_자바_WHILE / 웹크롤링_영화랭킹_TOMCAT (0) | 2021.04.01 |
13일차_자바기초 / 웹크롤링_네이버,멜론 긁어오기 (0) | 2021.03.31 |
댓글