강의목표
1. 웹의 개념을 이해하고 기술할 수 있다.
2. 웹 수집 연동을 구현할 수 있다.
============================================================================
데이터 분석순서
데이터 수집 -> 데이터 유형 및 속성 파악 -> 데이터 변환 -> 데이터 저장 -> 데이터 정제 -> 분석 단계
데이터 수집 기술 (웹 크롤링 기술)
html이란? Hyper Text Markup Language의 약자이고 여러개의 태그를 연결해서 모아놓은 문서
============================================================================
웹페이지
동적페이지 : 클라이언트가 입력한 값을 처리해주는 페이지(게시판, 방명록, 회원가입, 장바구니 등)
asp, aspx, php, jsp 등
정적페이지 : 클라이언트가 입력한 값을 처리할 수 없는 페이지
Web Application Server WAS = Tomcat ( +java) = jsp/servlet (\.jsp)
ex) Test\a.html
http://ip:port/Test/a.html
Test\a.jsp
http://ip:port/Test/a.jsp
프로젝트명이 application
이걸 context로 연결
연결해서 접속하면 session 생성 webpage 보여줌
application -> context -> session -> request -> webpage 포함관계
beautiful soup 모듈 :
파이썬의 코드를 복잡하게 작성하지 않아도 편하게 웹 크롤링을 할 수 있도록
여러 함수들을 제공하는 모듈
[형식]
from bs4 import BeautifulSoup
# 1. 웹에서 html 문서를 가져와서 BeautifulSoup로 파싱
from bs4 import BeautifulSoup
import urllib.request # 웹 상의 url을 파이썬이 인식할 수 있도록 해주는 모듈
def test01():
# 3. 게시판의 날짜와 본문을 담을 리스트 객체 생성
list_res01 = [] # 날짜를 담는다
list_res02 = [] # 내용을 담는다
for i in range(1, 23): # 게시판의 끝번호까지 반복
url_str = '크롤링할 주소입력'
url = urllib.request.Request(url_str) # str형식의 주소를 url로 인식하게 함
result = urllib.request.urlopen(url).read().decode('utf-8') # url로 접근한 소스코드를 모두 받아 decode해서 저장
soup = BeautifulSoup(result, "html.parser") # 모듈을 사용해 객체 생성
# 2. 게시판의 날짜와 본문의 내용을 가져온다.
result01 = soup.find_all('span', class_='date') # 모듈을 사용해 소스코드 내의 태그와 클래스로 접근
result02 = soup.find_all('p', class_='con')
# 3. 게시판의 날짜와 본문을 담을 리스트 객체에 append
for i in result01:
list_res01.append(i.get_text(" ", strip=True))
for i in result02:
list_res02.append(i.get_text(" ", strip=True))
# 4. 날짜와 본문을 같이 출력
for k, h in zip(list_res01, list_res02):
print(k + ' ' + h)
============================================================================
<이미지를 크롤링하는 방법>
1. 크롬 웹브라우저 설치 - https://https://chromedriver.chromium.org/downloads
2. c:\chromedriver\chromedriver.exe - ChromeDriver 90.0.4430.24 # 크롭 웹브라우저가 있는 경로
3. c:\image # 다운받을 경로
4. 다운받을 이미지를 키워드로 결정한다. ex) 사과, 햄버거, 자동차, 동전 등
5. selenium을 설치한다.
6. 검색엔진에서 4번 키워드로 검색했을 때 웹 크롤링 코드
from bs4 import BeautifulSoup
import urllib.request
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
import time # 중간중간에 sleep을 걸어야 함
def test01():
binary = '크롬 웹 브라우저.exe 경로'
# 브라우저를 객체로 인스턴스화 하자
browser = webdriver.Chrome(binary)
# input 검색창에 키워드를 입력해서 이미지를 받아오자
browser.get("검색할 검색엔진의 주소")
# 검색엔진에서 검색하는 input 상자의 id, class, xpath값을 받는다.
# elem = browser.find_element_by_class_name('gLFyf.gsfi') # 얘는 공백을 .으로 바꿔줘야 된다. 공백이 안됨.
elem = browser.find_element_by_xpath('//*[@id="sbtc"]/div/div[2]/input')
# 키워드 검색어 입력
elem.send_keys("사과") # 크롤링하고 싶은 검색어
# 검색어를 엔터 눌러서 검색
elem.submit()
# 스크롤을 내리려면 브라우저 이미지 검색결과 부분(<body></body>) 마우스를 한 번 클릭하고 End키를 눌러야 한다.
for i in range(1):
browser.find_element_by_xpath("//body").send_keys(Keys.END)
time.sleep(3) # END 키 누르고 내려가는데 시간이 걸려서 sleep 해줌, 키보드를 end키를 총 5번 누르는데 END 1번 누르고 10초 쉰다
time.sleep(3) # 네트워크 느릴까봐 안정성을 위해 sleep을 해줌
html = browser.page_source # 소스코드를 리턴받는다.
soup = BeautifulSoup(html, "lxml")
# 그림파일 저장
# print(soup.find_all("img", class_="rg_i Q4LuWd")) # 얘는 공백을 .으로 해도 안된다 공백은 공백
return soup
# 이미지의 상세 url을 가져오는 함수
def fetch_list_url():
params = []
soup = test01()
imgList = soup.find_all("img", class_="rg_i Q4LuWd")
for img in imgList:
try:
params.append(img["src"])
except KeyError:
params.append(img["data-src"])
return params
# 이미지의 상세 url을 파일로 저장하는 코드를 만들자
def fetch_detail_url():
params = fetch_list_url()
for idx, p in enumerate(params, 1):
# 다운받을 폴더 경로 입력
urllib.request.urlretrieve(p, "C:\\image\\" + str(idx) + "_google.jpg")
if __name__ == '__main__':
fetch_detail_url()
'데이터과학자 - 강의 > python' 카테고리의 다른 글
210514 python - Open API (0) | 2021.05.14 |
---|---|
210510 python - JSON (0) | 2021.05.10 |
210507 python - built in function, 모듈 활용 (0) | 2021.05.07 |
210506 python - exception, decimal (0) | 2021.05.06 |
210503 python day-12 : file i/o (0) | 2021.05.04 |