@21.04.02
JAVA
@Do While
do{
실행식
} while(조건식1)
기본적인 Do-While문의 형태는 위와 같다.
"실행식"이 최초에 1회는 무조건 실행되고, 후에는 "조건식1"을 충족하면 (True이면) 다시 실행식을 반복하며,
조건식1을 충족하지 못하면(False이면) 반복을 종료한다.
%기본적으로 퍼포먼스 자체는 다른 반복문과 유사하나 유용할 때가 있지 않을까 싶다. 최초 1회 구동을 갖는 반복문..ㅋ
@FOR-반복문
기본적인 구조는 위와 같다. 코드로 보면
for ( int i = 0; i < 범위; ++i){
실행식
}
다음과 같은데, 14일차에 적은것 처럼 변수 i는 for문 안에서 값을 바꿔버리면 위로 가도 바뀐다.
즉, 반복횟수가 바뀐다는 소리. 무튼
- for문 밖에서 정의한 i가 있다면 다시 재선언할 수 없다. (1회용 변수가 아니란거)
- 증감연산자를 통해 증가시키는데 이는 후위든 선위든 위치는 상관 없다.
=> for문 안의 조건 ( ; ) 자체를 하나의 영역이라고 생각. 벗어나면 결국 1을 더함은 변하지 않는다.
이클립스스캔
================================================
웹크롤링
@SELENIUM - 크롬드라이버 설치
Selenium은 내가 파이썬코드로 인터넷 서칭을 가능케 도와준다.그를 위해 크롬 드라이버를 설치해야하는데 그 전에 크롬 설정란에서 크롬버전을 확인해주고 다운받는다.
그리고 해당 .exe 파일을 내가 작성한 파이썬 스크립트의 경로에 저장하면 된당.
@Selenium 활용
#1번 =======================================================================
from selenium import webdriver as wb
from selenium.webdriver.common.keys import Keys
#2번 =======================================================================
driver = wb.Chrome()
url = "https://www.naver.com/"
driver.get(url)
#3번 =======================================================================
input_search = driver.find_element_by_id('query')
input_search.send_keys('아이유')
%주석 1번
Selenium 모듈에서 WebDriver와 common keys라는 기능을 각각 불러들여 온다.
%주석 2번
가져온 WebDriver는 내가 url이란 변수에 담은 주소를위에서 다운 받은 크롬드라이버를 통해 크롬창으로 열어준다.
%주석 3번
input_search라 명명한 변수안에 find_element_by_id 라는 명령어로 query라는 ID륿 불러온다.
네이버 창에서 확인해 보면
보면 내가 검색해야하는 부분의 id를 보면 query인걸 볼 수 있다.
@Selenium - Click / Enter
%CLICK
btn_search = driver.find_element_by_id('search_btn')
btn_search.click()
위에서 네이버 실습의 연장선이다. 이제 '아이유'라는 값을 집어 넣었다면 이에 대한 검색이 이뤄져야 하는데
위의 코드는 해당 방법 중 하나인 클릭하는 법에 대한 방법이다.
- 첫째줄의 btn_search라는 변수는 url 주소를 통해 긁어온 해당 페이지에서 내가 Button에 대한 정보를 가져온다.
- find_element_by_id 라는 명령어는 선택자가 id인것을 불러올 때 쓰이는 명령어다.
- 내가 네이버에서 검색 버튼을 원하기 때문에 해당 ID 이름을 가져왔다.
- btn_search 변수에 .click() 이란 명령어를 통해 클릭 작업을 수행한다.
%ENTER
from selenium import webdriver as wb
from selenium.webdriver.common.keys import Keys
input_search = driver.find_element_by_id('query')
input_search.send_keys('아이유')
input_search.send_keys(Keys.ENTER)
ENTER는 말 그대로 내가 저 send_keys() 를 통해 Data를 보냈다면 그 상태 그대로 ENTER를 누르도록 해준다.
특별히 뭐 가져올 Class 나 ID 같은 선택자도 없고 명령어만 치면 된다.
@Selenium - 스크롤 내리기
from selenium import webdriver as wb
from selenium.webdriver.common.keys import Keys
url = 'https://www.youtube.com/results?search_query=%EC%9D%B4%EC%A0%95%EC%9E%AC'
driver = wb.Chrome()
driver.get(url)
body = driver.find_element_by_tag_name('body')
for i in range(500):
body.send_keys(Keys.PAGE_DOWN)
Selenium 모듈을 활용해 선택한 페이지의 스크롤을 내리는 방법이다.
실습 의도는 동영상 같은 경우 스크롤을 내려 데이터를 불러들이지 않는다면 내가 볼 수 있는 데이터가 한정됨
때문에 자동으로 페이지를 다운해주는 코드를 짠것. 그에 대한것.
- 불러들인 url주소는 유투브에서 이정재를 검색한 페이지다.
- driver 변수에 똑같이 url을 집어 넣고 get 명령어를 통해 페이지를 불러온다. (창을 킨다.)
- find_element_tag_name 명령어는 내가 지정한 Tag의 정보를 가져온다.
- 굳이 body라는 Tag를 가져온건 내가 원하는 정보(동영상)이 포함되어있는 Tag가 body이기 때문이라고 함.
- 위에서 클릭이나 엔터를 치게 해줬던 send_keys 명령어를 통해 정보를 보낸다.
- 이번에는 Keys 라는 기능을 불러들여 PAGE_DOWN 이란 명령어를 실행
- 사용하면 딱 한번만 내리고, 실행되는 속도를 인터넷이 따라 잡히지 못하니 그냥 횟수는 500번정도 줘봤다.
@Selenium - 스벅 메뉴 정보 DF로 만들기
#=====================================================1번 모듈 호출
import numpy as np
import pandas as pd
from selenium import webdriver as wb
from bs4 import BeautifulSoup as bs
#=====================================================2번 페이지 영양정보들가기
url = 'https://www.starbucks.co.kr/menu/drink_list.do'
driver = wb.Chrome()
driver.get(url)
sta_bt = driver.find_element_by_class_name('a2')
sta_bt.click()
#=====================================================3번 bs로 정보 가공
soup = bs(driver.page_source, 'html.parser')
th = soup.select('th', limit = 7)
td = soup.select('td')
#=====================================================4번 리스트에 정보 담기
th_list = []
for i in th:th_list.append(i.text)
td_list = []
for i in td:td_list.append(i.text)
td_array = np.array(td_list).reshape(-1,7)
df = pd.DataFrame(td_array, columns = th_list)
df.set_index('메뉴', inplace=True)
스타벅스 홈페이지에서 모든 메뉴들의 영양정보를 불러들이는 코드그리고 DF로 만들거다.
%주석1번
1번에선 필요한 모듈을 호출했다.- DF 만들거니까 Pandas 호출 (DataFrame)- 주석 4번에서 필요에 따라 array를 사용할거기 때문에 numpy 호출- 평소하던것 처럼 크롤링을 진행할거기 때문에 BeautifulSoup 호출(BS)
%주석2번
스벅 메뉴 페이지에서 영양정보를 보려면 별도로 메뉴 페이지에서 클릭이 한번 이뤄져야한다. 때문에
< a2 >라는 Class(선택자) 이름을 갖고있는 녀석을 불러들여 클릭해줬다.
%주석3번
주석 3번의 경우는 내가 표의 정보를 가져오기 때문에 BS를 사용하는 구간이다.
- th와 td는 각각 Table Head / Table Data를 의미한다.
- 내가 필요한건 표의 모든 정보이기 때문에 굳이 선택자를 호출하지 않았다. (모든 표를 불러올거니까)
- th를 가져오는 부분에서 limit 은 내가 가져올 데이터의 갯수를 한정시킨다.
=> (7개만 갖고온단거)(각 Column의 이름이 총 7개)
%HTML - TD와 TH에 대해서
TD와 TH는 각각 HTML의 TAG 명인데 이에 대한 간단한 예이다.
위는 이클립스를 통해서 Td와 Th를 사용하여 간단한 페이지를 만들어 보았다.
보면 TR(Table Row)이란걸로 각 행을 구분지으며, 그 안의 TD라는 Tag를 통해 안의 값을 넣어주었다.
그러면 보는것과 같이 하나의 Table을 HTML 코드를 통해 페이지에 나타낼 수 있다.
%주석4번
4번에서는 내가 DF로 만들 정보들을 for문을 통해 list에 담아주었다.
- 위에서 td_list(각 메뉴별 영양정보)는 numpy를 통해 배열로 만들어주었다.
- numpy 모듈의 reshape 명령어에 -1이란 값을 넣는건 행or열을 남은 차원에 맞추어 변환한다는 뜻이다.
이에 대한 예.
%만일 칼럼에 주었을 경우 ==> reshape(row,-1)
%만일 칼럼에 주었을 경우 ==> reshape(-1,column)
- Pandas 모듈의 DF를 통해 값은 TD로, 칼럼 명은 TH로 주었다.
- set.index (DF 값 중 하나를 인덱스로 만듬)로 메뉴를 인덱스로, inplace 옵션에 True를 주어 바로 저장함
그러면 아래와 같은 결과를 볼 수 있다.
'국비교육기관 > 수업' 카테고리의 다른 글
17일차_자바기초_이중for문 / 웹크롤링 Test (0) | 2021.04.06 |
---|---|
16일차_자바기초_배열이란 / 웹크롤링_Gmarket_이미지크롤링 (0) | 2021.04.05 |
14일차_자바_WHILE / 웹크롤링_영화랭킹_TOMCAT (0) | 2021.04.01 |
13일차_자바기초 / 웹크롤링_네이버,멜론 긁어오기 (0) | 2021.03.31 |
12일차_자바_기초 / 웹크롤링 (0) | 2021.03.30 |
댓글