강의목표

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

+ Recent posts