반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

2022.03.11 - [파이썬 패키지/라이브러리&패키지 소개] - 파이썬 주요 라이브러리 정리


업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

오늘은 코딩유치원에 방문하신 손님께서 문의하셨던 '홈쇼핑모아'라는 사이트의 정보를 크롤링하는 프로젝트를 공유드리겠습니다.

 


1. 프로젝트 목표

 

1) 목표 사이트

https://hsmoa.com/

 

홈쇼핑모아 - 모든 홈쇼핑을 한눈에!

| 5시 14분 ~ 5시 19분 사계절 착용 가능, 클래식 스타일, 트윌 솔리드 셔츠 예작 22FW 최신상 컴포트 셔츠 3종 백화점 매장 동일 정상 제품 109,000원

hsmoa.com

 

2) 목표 데이터

오늘 이후 5일간 편성표의 날짜, 상품명, 방송시간, 가격 (사진도 요청하셨지만 난이도가 확 달라지므로 보류) 

 

 

2. 프로젝트 코드

# step1.필요한 패키지와 모듈 불러오기
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
import time
import pandas as pd

# step2.오늘 이후의 5일만 선택하기 위한 오늘 날짜 파악
info_time = time.localtime()
today = str(info_time.tm_year) + '0' +str(info_time.tm_mon) + str(info_time.tm_mday) #중간에 0은 태그의 속성값과 포맷 일치를 위함
print(today)

# step3.크롬 웹드라이버 실행 & 홈쇼핑 사이트 접속
driver = webdriver.Chrome(r"C:\Users\SANGWOO\Desktop\chromedriver.exe")
url = "https://hsmoa.com/?date="+today+"&site=&cate=식품·건강" #식품건강 카테고리
driver.get(url)
time.sleep(1)

# step4.오늘 이후 날짜 정보 획득 함수 정의
def get_target_date(driver, today):
    
    list_temp = []

    # 날짜 선택
    btn_date = driver.find_elements_by_class_name("date")

    for i in btn_date:
        if int(i.get_attribute("data-date")) > int(today):
            list_temp.append(i.get_attribute("data-date"))

    return(list_temp)


# step5.총 5일동안의 쇼핑몰 편성표 크롤링

# 날짜, 상품명, 방송시간, 가격을 담을 리스트 선언
list_date = []
list_title = []
list_airtime = []
list_price = []

# 날짜 5일이 입력된 리스트
list_five_days = get_target_date(driver, today)
print(list_five_days)

for day in list_five_days:

    url = "https://hsmoa.com/?date="+day+"&site=&cate=식품·건강"
    driver.get(url)
    time.sleep(2)

    #날짜 & 제목
    title = driver.find_elements_by_class_name("font-15")
    for i in title:
        if i.text != "": #공백 제거
            list_date.append(day)
            list_title.append(i.text)
    
    #방송시간
    airtime = driver.find_elements_by_class_name("font-12.c-midgray")
    for i in airtime:
        if i.text != "": #공백 제거
            list_airtime.append(i.text)
    
    # 가격
    price = driver.find_elements_by_class_name("strong.font-17.c-black")
    for i in price:
        if i.text != "": #공백 제거
            list_price.append(i.text)

# step6.zip 모듈을 이용해서 list를 묶어주기        
list_sum = list(zip(list_date, list_title, list_airtime, list_price))

# step7.데이터프레임의 첫행에 들어갈 컬럼명
col = ['날짜','제품명','방송시간','가격']

# step8.pandas 데이터 프레임 형태로 가공
df = pd.DataFrame(list_sum, columns=col)

# step9.엑셀에 저장
df.to_excel('쇼핑몰 편성표_5일.xlsx')

driver.quit()

 

<코드 실행 결과>

 

3. 프로젝트 후기

 

1) 아무 생각없이 동적 웹크롤링 방식을 사용해서 코드 실행 시간이 2분 50초나 걸렸음. (어제는 1분 10초 정도)

    --> 다음엔 requests와 bs4 패키지를 쓰는 정적 웹크롤링 방식을 사용해서 시간을 줄여야겠음.

 

2) 사진을 함께 크롤링해서 엑셀에 차례대로 삽입하는 것은 아직 효율적인 방법을 모르겠음.

    --> 추후에 도전해봐야겠음. 


끝.

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

2022.03.11 - [파이썬 패키지/라이브러리&패키지 소개] - 파이썬 주요 라이브러리 정리


업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

오늘은 인스타그램으로 특정 태그의 게시물을 캡처하거나 좋아요를 누르는 등의 자동화를 위한 가장 첫 단계로 인스타그램을  selenium으로 자동 로그인하는 방법에 대해서 알아보겠습니다.

 

해당 강의를 따라하기 위해서는 인스타그램 아이디와 비밀번호가 필요하답니다.

(facebook 계정으로도 로그인 하는 방법이 있지만 그 방법은 다루지 않았습니다.)

 

그리고 크롬 드라이버가 설치되어 있어야 합니다. 혹시 안되어 있으신분들은 아래의 강의를 참고해주세요.

 

2021.03.23 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 크롬드라이버 크롬 버전에 맞춰서 설치하는법

 

[Python/웹 크롤링] 크롬드라이버 크롬 버전에 맞춰서 설치하는법

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다. 코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도

coding-kindergarten.tistory.com

 


1. 패키지 import

 

가장 먼저 할 일은 당연히 웹 자동화를 위한 필수 패키지를 불러오는 일입니다.

# step1. 필요한 패키지와 모듈 불러오기
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

 

2. 크롬 드라이버 실행 및 인스타그램 로그인 화면 출력

 

그 다음은 크롬 드라이버를 실행하고, 인스타그램 로그인 url로 이동해보겠습니다. 아래의 코드의 경로 대신에 여러분들의 크롬 드라이버(chromedriver.exe)가 있는 경로를 입력해주어야 한다는 것 주의해주세요.

 

driver = webdriver.Chrome(r"C:\Users\SANGWOO\Desktop\chromedriver.exe")

driver.get("https://www.instagram.com/accounts/login/")

time.sleep(1)

 

3. 아이디 & 비밀번호 입력 후 엔터

 

다음으로 해줄 일은 아이디와 비밀번호를 입력하고 엔터를 눌러주는 것입니다.

 

 

# 인스타 아이디
id = "여러분의 아이디를 입력해주세요"
# 비밀번호
pw = "여러분의 비밀번호를 입력해주세요"

# id와 pw를 입력하는 창의 요소 정보 획득
input = driver.find_elements_by_tag_name("input")

# 아이디를 입력
input[0].send_keys(id)

# 비밀번호 입력
input[1].send_keys(pw)

# 엔터
input[1].send_keys(Keys.RETURN)
time.sleep(5)

 

4. 옵션 설정 단계 통과하기

 

위에서 로그인을 하고나면 아래와 같은 화면이 출력됩니다. 그것도 2개나 말이죠.

둘 모두 '나중에 하기' 버튼을 찾아서 클릭해서 장애물을 극복해줍시다!

 

첫번째 장애물. 로그인 정보 저장 여부

 

두번째 장애물. 알림 설정 여부

 

# 로그인 정보 저장 여부 ("나중에 하기 버튼 클릭")
btn_later1 = driver.find_element_by_class_name('_acan._acao._acas')
btn_later1.click()
time.sleep(5)

# 알림 설정 ("나중에 하기 버튼 클릭")
btn_later2 = driver.find_element_by_class_name('_a9--._a9_1')
btn_later2.click()

 

참고로 저는 보통 xpath로 element를 찾는 방식을 선호하는데, 하루만에 xpath가 변경되거나 알림 설정의 '나중에 하기' 버튼을 클릭할 때는 잘 작동하지 않아서 class_name을 이용했습니다.

 

여기까지 하면 로그인이 완료되고 여러분들의 인스타그램 홈화면이 나올거예요.

 

5. 전체코드 (좀 더 세련된 코드)

 

전체 코드를 함수 개념을 이용해서 좀 더 깔끔하게 정리했습니다. 위에서 코드가 실행되는 흐름을 이해하셨다면 아래의 코드를 사용하시면 됩니다.

# step1.필요한 패키지와 모듈 불러오기
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

# step2.아이디, 비밀번호 설정
id = "여러분의 아이디를 입력해주세요"
pw = "여러분의 비밀번호를 입력해주세요"

# step3.크롬 웹드라이버 실행
driver = webdriver.Chrome(r"C:\Users\SANGWOO\Desktop\chromedriver.exe")

# step4.인스타그램 로그인 함수 정의
def login(id, pw):
    # 로그인 페이지로 이동
    driver.get("https://www.instagram.com/accounts/login/")
    time.sleep(1)
    
    # id와 pw를 입력하는 창의 요소 정보 획득
    input = driver.find_elements_by_tag_name("input")

    # 아이디를 입력
    input[0].send_keys(id)

    # 비밀번호 입력
    input[1].send_keys(pw)

    # 엔터
    input[1].send_keys(Keys.RETURN)
    time.sleep(5)

    # 로그인 정보 저장 여부 팝업창 제거 ("나중에 하기 버튼 클릭")
    btn_later1 = driver.find_element_by_class_name('_acan._acao._acas')
    btn_later1.click()
    time.sleep(5)

    # 알림 설정 팝업창 제거 ("나중에 하기 버튼 클릭")
    btn_later2 = driver.find_element_by_class_name('_a9--._a9_1')
    btn_later2.click()

# step5.로그인 함수 실행
login(id,pw)

 


오늘 준비한 내용은 여기까지입니다.

 

감사합니다. 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

오늘은 예전에 다루었던 글에 달린 댓글에 대한 답변을 위해 간단히 글을 작성해보려 합니다.

 

 

저는 아래의 글에서 네이버 뉴스 검색 첫페이지의 기사 10개를 주기적으로 확인하고, 새롭게 추가된 기사만을 텔레그램으로 보내주는 프로젝트를 해보았습니다.

 

2021.04.05 - [파이썬 패키지/텔레그램(Telegram)] - [Python/Telegram] 원하는 주제의 네이버 뉴스 텔레그램으로 5분마다 전송 받기

 

해당 프로젝트의 크롤링 방식은 Request와 beautifulsoup을 이용한 정적 크롤링이었죠. 저는 주로 페이지가 변경되는 경우는 selenium 패키지를 이용해서 페이지 번호를 직접 클릭하면서 페이지를 변경했었답니다.

 

댓글을 달아주신 분께서는 정적 크롤링 방식으로 페이지를 변경하면서 원하는 정보를 얻길 원하셨던 것이죠.

 

이번 시간에는 네이버 스마트스토어 한 곳의 상품 정보를 여러 페이지 크롤링하고 그 정보들을 엑셀로 저장해보겠습니다.

 

1. 컨셉

 

코딩을 들어가기 전에 대략적인 컨셉을 잡아봐야겠죠?

 

1) 원하는 스마트스토어 페이지의 url을 이용해 html을 받아온다

2) 제품명과 가격정보를 크롤링한다

3) 다음 페이지에서 같은 일을 반복한다

4) 원하는만큼 반복하며, 리스트에 계속 정보를 누적한다

5) 누적된 리스트를 엑셀에 저장한다.

 

2. 페이지 변경에 따른 url 변경 규칙 파악

 

이제 컨셉을 잡았으니 코딩에 필요한 재료를 구하러 가보겠습니다.

 

저는 컴퓨존에서 운영하는 스마트스토어 페이지에서 전체상품 탭을 클릭한 후, 누적판매순으로 출력되는 것을 최신등록순으로 바꾼 후의 페이지를 목표 url로 하였습니다.

 

여기서 페이지 번호를 1, 2, 3 바꿔가며 클릭하면 아래에 표시한 url에서 page=숫자 부분만 변경되는 것을 확인하실 수 있을거예요. 나중에 코딩에 들어가면 이 부분을 '문자열 포매팅''for 반복문' 개념을 이용해주면 될 것 같네요.

 

3. 제품명 & 가격정보 html 정보 파악

 

크롬에서 F12를 눌러서 목표로 하는 제품명과 가격정보의 html 정보, 정확히는 CSS Selector 정보를 파악합니다.

이 부분을 잘 모르시는 분들은 아래의 글을 참고해주세요.

 

2021.03.27 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 파이썬 웹 크롤링을 위한 속성 HTML, CSS 요약 정리

 

제품명의 선택자
제품가격의 선택자

 

4. 전체 코드

# step1.라이브러리 불러오기
import requests
from bs4 import BeautifulSoup as bs
import telegram
import time
import pandas as pd

# step2.제품명과 제품가격정보를 담을 빈 리스트 선언
product_name = []
product_price = []

# step3.for문을 이용해서 원하는 페이지에 접근, 정보 추출 후 리스트에 담기
for page_num in range(3):
    # range를 이용하면 0부터 인덱스가 시작되므로 page_num에 1을 더해준 url을 이용
    url = f'https://smartstore.naver.com/compuzone/category/ALL?st=RECENT&free=false&dt=IMAGE&page={page_num+1}&size=40'
    
    # html 정보 받아와서 파싱
    response = requests.get(url)
    soup = bs(response.text , 'html.parser')

    # css selector로 페이지 내의 원하는 정보 가져오기
    html_product = soup.select('strong.QNNliuiAk3')
    html_price = soup.select('span.nIAdxeTzhx')

    # 텍스트만 추출
    for i in html_product:
        product_name.append(i.get_text())
        
    for i in html_price:
        product_price.append(i.get_text())

# step4.zip 모듈을 이용해서 list를 묶어주기        
list_sum = list(zip(product_name, product_price))


# step5.데이터프레임의 첫행에 들어갈 컬럼명
col = ['제품명','가격']

# step6.pandas 데이터 프레임 형태로 가공
df = pd.DataFrame(list_sum, columns=col)

# step7.엑셀에 저장
df.to_excel('컴퓨존 제품 목록.xlsx')

 

5. 실행 결과

 

한 페이지에 40개의 품목이 있으니, 정확히 3개의 페이지에서 모든 제품명과 가격 정보를 크롤링해서 엑셀로 저장한 것을 확인할 수 있습니다.

 

 


오늘 준비한 내용은 여기까지입니다.

 

감사합니다.

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

 

[웹 크롤링 기초]

2021.03.22 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 파이썬 웹 크롤링 기초 of 기초

2021.03.23 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 크롬드라이버 크롬 버전에 맞춰서 설치하는법

2021.03.24 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 파이썬 웹 크롤링 관련 패키지 3종 총정리

2021.03.27 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 파이썬 웹 크롤링을 위한 속성 HTML, CSS 요약 정리

2021.03.28 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 동적/정적 페이지 차이와 그에 따른 크롤링 방법 간단정리

 

[정적 웹크롤링]

2021.03.30 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 파이썬 웹 크롤링 정적 수집 방법 개념 정리_find, find_all, select, select_one

2021.04.02 - [파이썬 패키지/웹 크롤링] - [Python/Requests/Beautifulsoup] 네이버 뉴스 기사 제목 크롤링을 통한 정적 수집 기초 정리

2021.04.06 - [파이썬 패키지/웹 크롤링] - [Python/Reuqests/Beautifulsoup] 파이썬 정적 웹크롤링 텍스트, 이미지, 하이퍼링크, 속성 가져오는 법

 

[동적 웹크롤링]

2021.04.03 - [분류 전체보기] - [코딩유치원] 네이버 뉴스 기사 제목 크롤링을 통한 동적 수집 기초 정리(selenium, beautifulsoup)

2021.06.21 - [파이썬 패키지/웹 크롤링] - [Python/Selenium] 파이썬 동적 웹크롤링 텍스트, 하이퍼링크, 이미지, 속성 가져오는 법

2021.05.22 - [파이썬 패키지/GUI 프로그램] - [파이썬 GUI 프로그래밍] 잡플래닛 리뷰 정보 크롤링 GUI 프로그램

 


 

 

오늘은 아주 짧게, 웹크롤링 할 때 원하는 정보의 형태에 따라서 어떻게 가져올 수 있는지 알아보겠습니다.

 

<이 글을 읽기 전에 읽으면 좋은 글>

2021.03.30 - [파이썬 패키지/웹크롤링] - [코딩유치원] 파이썬 웹 크롤링 정적 수집 방법 개념 정리_find, find_all, select, select_one

2021.04.02 - [파이썬 패키지/웹크롤링] - [코딩유치원] 네이버 뉴스 기사 제목 크롤링을 통한 정적 수집 기초 정리(beautifulsoup, requests)

 

선택자와 select(), select_one() 함수에 대해서 아시고, Reuqests, beautifulsoup를 이용한 정적수집에 대해서 아신다면 가져온 html에서 원하는 정보를 추출하는 함수가 필요합니다.

 

<참고> select 함수 사용법

# 선택자를 사용하는 방법 (copy selector)
soup.select('태그명')
soup.select('.클래스명')
soup.select('#아이디명')
 
soup.select('상위태그명 > 하위태그명 > 하위태그명')
soup.select('상위태그명.클래스명 > 하위태그명.클래스명')
 
# 태그와 속성값으로 찾는 방법
soup.select('태그명[속성="값"]')
 
# 한 개만 가져오고 싶은 경우
soup.select_one('태그명[속성="값"]')

 

텍스트 추출  get_text( )

 

우리는 예전에 select( ) 함수를 이용해 추출한 html 문장(?)들이 titles라는 리스트에 담겨있다고 했을 때, 그 각 html 문장 안에 들어있는 텍스트를 아래와 같은 방식으로 추출했었죠. 이건 이미 다루었던 내용이라서 넘어가겠습니다.

for i in titles:
    title = i.get_text()
    print(title)

 

이미지 추출  get('src' ) or ['src']

크롬의 개발자 도구(단축키 F12)를 통해 이미지를 찍어보면 보통 아래와 같은 html 구조를 가지고 있습니다. 

 

위의 사진과 같은 img 태그는 어떻게 원하는 사진을 가져올 수 있을까요?

 

1) 우선 select('img._image._listImage')로 여러개의 html을 가져옵니다. 만약 한 페이지 내에서 <img> 태그가 한 종류만 존재한다면 그냥 select('img')로 해도 되겠죠?

 

2) 그 다음 for문을 이용해서 아래와 같이 src를 가져옵니다. 둘 중 하나만 골라서 사용하세요.

for i in imgs:
    src = i['src']
    src = i.get('src')

 

3) src는 한마디로 '이미지 주소를 담은 링크'입니다. 이것을 다운로드 받아서 내 PC에 저장하기 위해서는 추가적인 작업이 필요합니다. 이 부분은 일단 링크로 대신하고 추후 정리하도록 하겠습니다.

 

m.blog.naver.com/PostView.nhn?blogId=kiddwannabe&logNo=221358581642&proxyReferer=https:%2F%2Fwww.google.co.kr%2F

 

웹크롤링)이미지/동영상 자료 다운받기

크롤링 진행시, 이미지나 동영상을 저장하고 싶을때가 있죠. 예를들면.. .인스타그램 크롤링을 진행할때, ...

blog.naver.com

 

href 추출  get('href' ) or ['href']

링크를 가져오고 싶을 때, href를 추출합니다. 생각해보니 아래의 프로젝트를 할 때 사용한 적이 있네요.

 

2021.04.05 - [파이썬 프로젝트] - [파이썬 프로젝트] 원하는 주제의 네이버 뉴스 텔레그램으로 5분마다 전송 받기

for i in hrefs:
    i.['href']
    i.get('href')

 

 

<2021.06.22 정정>

 

아래의 내용은 selenium 패키지를 이용한 함수입니다. 

 

2021.06.21 - [파이썬 패키지/웹 크롤링] - [Python/Selenium] 파이썬 동적 웹크롤링 텍스트, 하이퍼링크, 이미지, 속성 가져오는 법

 

속성(attribute) 추출 get_attribute('속성 종류')

이건 자주 사용하진 않는데 가끔 속성을 가져와야할 때가 있습니다. 예를 들면 제가 잡플래닛 평점을 크롤링 할 때, 별점을 아래와 같이 style 속성으로 정의하더군요. 여기에 width: 68%를 속성 추출을 이용해서 받아와서 5점 만점의 별점으로 재가공 했던 적이 있습니다.

i.get_attribute('style')

 


 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

 

[웹 크롤링 기초]

2021.03.22 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 파이썬 웹 크롤링 기초 of 기초

2021.03.23 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 크롬드라이버 크롬 버전에 맞춰서 설치하는법

2021.03.24 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 파이썬 웹 크롤링 관련 패키지 3종 총정리

2021.03.27 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 파이썬 웹 크롤링을 위한 속성 HTML, CSS 요약 정리

2021.03.28 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 동적/정적 페이지 차이와 그에 따른 크롤링 방법 간단정리

 

[정적 웹크롤링]

2021.03.30 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 파이썬 웹 크롤링 정적 수집 방법 개념 정리_find, find_all, select, select_one

2021.04.02 - [파이썬 패키지/웹 크롤링] - [Python/Requests/Beautifulsoup] 네이버 뉴스 기사 제목 크롤링을 통한 정적 수집 기초 정리

2021.04.06 - [파이썬 패키지/웹 크롤링] - [Python/Reuqests/Beautifulsoup] 파이썬 정적 웹크롤링 텍스트, 이미지, 하이퍼링크, 속성 가져오는 법

 

[동적 웹크롤링]

2021.04.03 - [분류 전체보기] - [코딩유치원] 네이버 뉴스 기사 제목 크롤링을 통한 동적 수집 기초 정리(selenium, beautifulsoup)

2021.06.21 - [파이썬 패키지/웹 크롤링] - [Python/Selenium] 파이썬 동적 웹크롤링 텍스트, 하이퍼링크, 이미지, 속성 가져오는 법

2021.05.22 - [파이썬 패키지/GUI 프로그램] - [파이썬 GUI 프로그래밍] 잡플래닛 리뷰 정보 크롤링 GUI 프로그램

 


 

웹 크롤링을 하면서 html과 css에 대한 개념이 전혀 없으면 새로운 웹사이트를 만날 때마다 어려움에 직면하게 됩니다. 제가 그래서 많이 고생을 했답니다. 이번 시간에 html과 css에 대해서 필요한 부분만 최소한으로 공부해서 보도록 하겠습니다.

 

HTML 구조

웹 크롤링을 위해서는 웹을 이루고 있는 html에 대해서 알아야 합니다. 하지만 모든 것을 하나하나 공부하기엔 너무 비효율적입니다. 아래에 공부하실 수 있는 링크를 남겨두었으니, 더 깊게 공부하실 분들은 참고해주세요.

 

<TCP School HTML 강의>

tcpschool.com/html/html_intro_elementStructure

 

html은 기본적으로 아래와 같은 구조를 가집니다. 정말 쉽게 말하자면 html은 태그로 감싸진 내용들의 모음입니다. 

 

출처. TCP School

1. 태그 이름

태그는 그 종류가 다양하며, 각 태그마다 의미하는 바가 다릅니다. 우리가 웹크롤링을 하면서 자주 볼 수 있는 태그는 아래와 같습니다.

 

태그 설명 사용 예
h1~h6 제목을 입력할 때 사용
(h1이 가장 큰 제목, h6이 가장 작은 제목)
<h1> 제일 큰 제목 </h1>
p 하나의 문장을 입력할 때 사용 <p> 문장 </p>
div 박스형태의 구역 설정 (block 요소)
(다른 태그들이 div 안에 모여있게 됨)
<div>

<h3> 제목 </h3>
<p> 문장 </p>

</div>
span 줄 형태의 구역 설정 (inline 요소)
(독립적으로 사용하지 않고 p태그 안에 span 태그가 들어감)
<p> 이렇게 <span style="border: 3px solid red"> span요소로 텍스트의 일부분 </span> 만 스타일을 적용할 수 있음</p>
img 이미지와 관련된 태그
(속성명은 src, 속성값은 "이미지의 url 주소")

종료 태그(/img)가 없는 빈 태그(empty tag)
<img src="/img 주소.png" alt="이미지가 없을 때 이미지 대신 출력할 문장 입력">
a 하이퍼링크를 추가할 때 사용 <a href="링크 주소">HTML 링크</a>
ul unordered list : 기호로 된 리스트

li 태그가 하위 태그로 사용되어 내용을 채움
<ul>
    <li>기호</li>
    <li>기호</li>
    <li>기호</li>
</ul>
ol
ordered list : 순서가 있는 리스트

li 태그가 하위 태그로 사용되어 내용을 채움


<ol>
    <li>1번</li>
    <li>2번</li>
    <li>3번</li>
</ol>

 

2. 속성명

html은 수 많은 태그로 이루어져있어서, 각 태그에 속성을 부여하여 구분 가능하도록 만들어줍니다. 각 태그별로 속성이 다양하지만 꼭 기억해야할 속성명 2가지는 id와 class입니다.

 

1) ID

하나의 웹페이지에 하나만 쓸 수 있는 고유한 이름으로 <태그이름 id="속성값">와 같이 쓰임

 

2) CLASS

비슷한 형태를 가진 요소에 여러번 사용할 수 있는 이름으로 <태그이름 class="속성값">와 같이 쓰임

 

3. 속성값과 내용

프로그래머가 정해주기 나름

 


CSS 구조

css는 html로 만들어진 밋밋한 화면을 예쁘게 꾸며주는 역할을 합니다. css는 html 특정 태그를 지목해서 속성값(글자색, 크기, 배경색 등등)을 넣어 주는 것이라 생각하면 될 것 같네요.

 

이때  css가 특정 태그를 지목하는 방식, 이 규칙을 알게되면 우리가 원하는 데이터를 감싸고 있는 태그를 지목해서 그 안의 데이터를 가져올 수 있는 것입니다.

 

출처. TCP School

CSS 코드는 위와 같이 생겼습니다. 크게 선택자(selector)와 선언부(declaratives)로 구성됩니다. CSS에 대해서 자세히 알고 싶으신 분들은 아래의 링크를 참고해서 공부하세요.

 

<TCP School CSS 강의>

www.tcpschool.com/css/intro

 

여기서, 선택자라는 것이 우리가 주목해야할 개념입니다. 간단히 정리하면 아래와 같습니다.

 

분류 설명
태그 선택 특정 태그를 선택 div --> <div> 태그를 선택
아이디 선택 id='속성값'인 태그를 선택 #query --> id의 속성값이 query인 태그 선택
클래스 선택 class='속성값'인 태그를 선택 .title --> class의 속성값이 title인 태그 선택 
태그+아이디 선택 특정 태그 중 id가 '속성값'인 태그를 선택 input#query --> input 태그 중, id의 속성값이 query인 태그 선택
태그+클래스 선택 특정 태그 중 class가 '속성값'인 태그를 선택 p.title --> p 태그 중, class의 속성값이 title인 태그 선택 

 

쉬운 이해를 위해서 CSS 선택자를 어떻게 활용하는지 예시를 보여드리겠습니다.

 

1) 크롬 브라우저로 네이버에 접속

2) 개발자 도구(단축키:F12)를 열어서, 검색창의 HTML을 확인

3) HTML을 우클릭해서, Copy - Copy selector를 클릭

4) 코딩창의 원하는 위치에 붙여넣기(Ctrl+V) 

 

 

이렇게 하면 #query라는 css selector가 불러와지고, 이 선택자를 아래 코드들의 괄호 안에 넣으시면 원하시는 동작을 수행하거나 데이터를 가져올 수 있습니다.

 

# selenium으로 id가 query인 html 1개 선택(여러개 일 때 가장 위의 요소 선택)
driver.find_element_by_css_selector('#query')

# selenium으로 id가 query인 html 모두 선택
driver.find_elements_by_css_selector('#query')

 

개인적으로 CSS selector 개념이 직관적이고 이해하기 쉬워서 주로 이용할 예정이지만, 인터넷에 돌아다니는 웹 크롤링 관련 코드들은 html 태그를 직접 지목하는 함수로 짜여진 경우들이 많습니다. 

 

<find 관련 함수_그냥 코드 이해용으로만 알아둘 것>

 

selenium 패키지: driver.find_element(s)_by_의 뒤에  xpath(), id(), class_name(), tag_name()를 사용

beautifulsoup 패키지: find_all(), find() 함수

 


오늘 준비한 내용은 여기까지 입니다.

 

다음 시간에는 동적/정적 페이지의 개념과 그에 따라 selenium과 beautifulsoup/requests 패키지를 사용하는 방법에 대해서 알아보겠습니다. 

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

 

[웹 크롤링 기초]

2021.03.22 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 파이썬 웹 크롤링 기초 of 기초

2021.03.23 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 크롬드라이버 크롬 버전에 맞춰서 설치하는법

2021.03.24 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 파이썬 웹 크롤링 관련 패키지 3종 총정리

2021.03.27 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 파이썬 웹 크롤링을 위한 속성 HTML, CSS 요약 정리

2021.03.28 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 동적/정적 페이지 차이와 그에 따른 크롤링 방법 간단정리

 

[정적 웹크롤링]

2021.03.30 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 파이썬 웹 크롤링 정적 수집 방법 개념 정리_find, find_all, select, select_one

2021.04.02 - [파이썬 패키지/웹 크롤링] - [Python/Requests/Beautifulsoup] 네이버 뉴스 기사 제목 크롤링을 통한 정적 수집 기초 정리

2021.04.06 - [파이썬 패키지/웹 크롤링] - [Python/Reuqests/Beautifulsoup] 파이썬 정적 웹크롤링 텍스트, 이미지, 하이퍼링크, 속성 가져오는 법

 

[동적 웹크롤링]

2021.04.03 - [분류 전체보기] - [코딩유치원] 네이버 뉴스 기사 제목 크롤링을 통한 동적 수집 기초 정리(selenium, beautifulsoup)

2021.06.21 - [파이썬 패키지/웹 크롤링] - [Python/Selenium] 파이썬 동적 웹크롤링 텍스트, 하이퍼링크, 이미지, 속성 가져오는 법

2021.05.22 - [파이썬 패키지/GUI 프로그램] - [파이썬 GUI 프로그래밍] 잡플래닛 리뷰 정보 크롤링 GUI 프로그램

 


오늘은 웹크롤링 관련 파이썬 패키지 3가지를 알아보겠습니다.

 

 

우리가 앞으로 하게 될 웹 크롤링은 두 가지 단계를 거칩니다.

 

1) 원하는 웹 페이지의 html문서를 싹 긁어온다.

 

2) html 문서에서 원하는 것을 골라서 사용한다.

 

 

위의 두 가지 작업과 관련하여 자주 사용되는 패키지를 하나씩 살펴보겠습니다.

 

1. requests 

html 문서를 가져올 때 사용하는 패키지입니다. requests는 사용자 친화적인 문법을 사용하여 다루기 쉬우면서 안정성이 뛰어나다고 합니다.  그래서 파이썬 기본 라이브러리에 포함된 urllib 패키지보다 자주 사용됩니다.

 

설치 방법

터미널에서 아래와 같이 입력하면 됩니다. (만약 anaconda 환경이 아니라 python을 사용한다면 conda 대신 pip를 입력할 것)

conda install requests

 

사용 방법

import requests                # requests 패키지 가져오기

url = 'https://www.naver.com'  # 가져올 url 문자열로 입력

response = requests.get(url)   # requests의 get함수를 이용해 해당 url로 부터 html이 담긴 자료를 받아옴

print(response.status_code)    # 정상적으로 받아졌다면 200이라는 상태코드를 반환

html_text = response.text      # 우리가 얻고자 하는 html 문서가 여기에 담기게 됨

 

 

2. Selenium

 

selenium 패키지는 지난 시간 설치했던 chromedriver를 이용해 chrome을 제어하기 위해 사용합니다. 크롤링을 하다보면 무엇인가 입력하거나 특정 버튼을 눌러야 하는 상황이 발생합니다. 이 때 selenium을 이용하는 것입니다.

 

만약 크롬드라이버가 설치되어 있지 않다면 아래의 글을 참고해서 설치해주세요.

2021.03.23 - [파이썬 기초/개발환경 구축] - [코딩유치원] 크롬드라이버 크롬 버전에 맞춰서 설치하는법

 

설치 방법

터미널에서 아래와 같이 입력하면 됩니다. (만약 anaconda 환경이 아니라 python을 사용한다면 conda 대신 pip를 입력할 것)

conda install selenium

 

사용 방법

이 패키지는 조금 공부할 것이 많아서 여기서는 대략적으로 어떤 식으로 사용하는지 파악하시면 좋을 것 같아요.

driver.find_element 함수나 send_keys 함수는 여기서 다 다루기가 힘들어서 다음 시간에 따로 정리하겠습니다.

 

# selenium의 webdriver를 사용하기 위한 import
from selenium import webdriver

# selenium으로 무엇인가 입력하기 위한 import
from selenium.webdriver.common.keys import Keys

# 페이지 로딩을 기다리는데에 사용할 time 모듈 import
import time

# 크롬드라이버 실행  (경로 예: '/Users/Roy/Downloads/chromedriver')
driver = webdriver.Chrome('chromedriver의 경로를 입력할 것') 

#크롬 드라이버에 url 주소 넣고 실행
driver.get('https://www.google.co.kr/')

# 페이지가 완전히 로딩되도록 3초동안 기다림
time.sleep(3)

#검색어 창을 찾아 search 변수에 저장
search = driver.find_element_by_xpath('//*[@id="google_search"]')

#search 변수에 저장된 곳에 값을 전송
search.send_keys('코딩유치원 파이썬')
time.sleep(1)

#search 변수에 저장된 곳에 엔터를 입력
search.send_keys(Keys.ENTER)

 

 

3. BeautifulSoup4

 

마지막으로 BeautifulSoup4라는 패키지는 매우 길고 정신없는 html 문서를 잘 정리되고 다루기 쉬운 형태로 만들어 원하는 것만 쏙쏙 가져올 때 사용합니다. 이 작업을 파싱(Parsing)이라고도 부릅니다.

 

설치 방법

터미널에서 아래와 같이 입력하면 됩니다. (만약 anaconda 환경이 아니라 python을 사용한다면 conda 대신 pip를 입력할 것)

conda install beautifulsoup4

 

사용 방법

이 패키지 역시 내용이 많아서 여기서는 대략적으로 어떤 식으로 사용하는지 파악하시면 좋을 것 같아요.

파싱을 하는 방법에는 크게 Xpath를 이용하는 법과 CSS selector를 이용하는 방식이 있는데, 이것 역시 다음에 정리하는 시간을 갖겠습니다.

import requests

# 주로 bs로 이름을 간단히 만들어서 사용함
from bs4 import BeautifulSoup as bs

response = requests.get('https://www.google.co.kr')

# html을 잘 정리된 형태로 변환
html = bs(response.text, 'html.parser')

# find 함수로 특정 이미지를 선택하는 코드
google_logo = html.find('img', {'id':'hplogo'})

 

오늘은 가볍게 파이썬을 이용하여 웹 크롤링을 할 때 사용되는 주요 패키지에 대해서 정리해보았습니다.

 

다음 시간에는 크롤링을 자유자재로 하기 위해 꼭 필요한 내용들을 더 깊게 들어가보도록 하겠습니다.

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 


파이썬 기초 문법 강의를 마치고 블로그의 방향성에 대해 많이 고민했습니다.

 

여기서 클래스나 정규표현식, 예외 처리 등의 중급 문법을 바로 들어갈까도 생각해봤지만 아무리 생각해봐도 너무 지루합니다.

(중급 문법은 추후 필요하다고 판단될 때 정리하는 시간을 가질 예정입니다)

 

그래서 먼저 지금까지 배운 파이썬을 가장 유용하게 써먹을 곳이 무엇일까 생각해보다가 가장 처음으로 웹 크롤링을 선택했습니다.

가장 유용하다고 판단한 이유는 우리가 많은 정보를 인터넷에서 검색하고, 그 결과를 수집하고 정리해야하는 일이 자주 있기 때문입니다.

 

먼저 웹 크롤링을 배우기로 했으니 먼저 웹이란 것이 무엇인지 개념을 확실히 할 필요가 있을 것 같아요.

 

웹 (Web)

 

Web은 World Wide Web의 줄임말입니다. 우리가 인터넷 웹사이트의 주소를 칠 때 www.google.com이런 식으로 입력하죠?

바로 이 www가 World Wide Web에서 유래된 것입니다.

 

흔히 인터넷과 웹을 자주 혼동해서 사용하는데요. 인터넷컴퓨터 네트워크 통신망을 의미하며 인터넷 상에서 동작하는 하나의 서비스입니다. 인터넷을 활용한 서비스는 전자우편(e-mail), 파일전송(FTP), 원격접속(telnet), 유즈넷(usenet) 등이 있다고 하는데 e-mail 말고는 잘 모르겠네요. 그만큼 인터넷을 활용한 서비스에서 웹의 영향력이 압도적이라 할 수 있습니다.

 

또 하나 알아두셔야할 중요한 사실은 웹은 HTML(Hypertext Markup Language)이라는 언어로 작성된 문서라는 것입니다.

대충 아래처럼 생겼답니다.

<!DOCTYPE html>
<html lang="ko">

<head>
    <meta charset="UTF-8">
    <title>HTML Intro</title>
</head>

<body>

    <h1>여기는 코딩유치원입니다</h1>

</body>


</html>

 

웹 브라우저 (Web Browser)

 

이런 HTML로 작성된 웹을 보기 편하게 해주는 소프트웨어를 웹 브라우저(Web browser)라고 하는데요. 여러분들이 흔히 아시는 인터넷 익스플로러, 크롬, 사파리 등이 있습니다.

 

출처. pixabay

 

웹 크롤링과 웹 스크래핑

 

우리는 앞으로 파이썬을 이용해 웹 페이지에서 HTML 문서를 분석해서 원하는 정보를 얻어오는 웹 크롤링을 해볼 예정입니다.

참고로 웹 크롤링이란 용어가 많이 사용되는데 사실 웹 크롤링은 싹 다 긁어 오는 것이고, 웹 스크래핑은 원하는 부분만 선택적으로 추려내는 것이니 우리가 할 것은 웹 스크래핑이라고 할 수 있겠네요.

 

앞으로는 우리는 프로잭트를 수행하면서 크롬(Chrome)을 사용 할 예정인데요. 크롬을 켜고 우클릭-검사 혹은 F12를 누르면 아래 사진과 같이 우측에 HTML 문서가 쭉 나옵니다. 다음시간부터는 HTML 문서에서 원하는 부분을 추출하기 위해 간단히 HTML을 다루어 보겠습니다.

 

 

그리고 나서는 파이썬의 라이브러리 selenium을 이용해서 로봇이 크롬 브라우저를 조정할 수 있는 방법과 BeautifulSoup4를 이용해서 HTML문서의 원하는 부분을 효과적으로 추출하는 방법을 배워보겠습니다.

 

그럼 다음 시간에 만나요~

반응형
반응형

안녕하세요, 코린이를 위한 코딩 유치원에 오신 것을 환영합니다.

 

 

오늘 배워볼 내용은 대세 코딩 언어! '파이썬'입니다.

 

피이썬 로고 이미지 (출처. 위키백과)

 

전 세계에는 약 600가지 프로그래밍 언어가 있습니다.

각각의 언어들은 장단점이 존재하고, 그에 맞는 어플리케이션에 사용되고 있죠.

다시 말해 딱 하나만 배워서 모든 것을 다할 수 있고, 성능도 킹왕짱 좋은 프로그래밍 언어라는 것은 존재하지 않습니다.

하지만 트랜드에 따라 유행하는 언어는 존재하고, 그 중 하나가 파이썬입니다.

 

GitHub의 저장소에 기여한 순위 (개발자들의 언어 선호도를 대략적으로 알 수 있음)

 

아마 이 글을 보고 계신 분이라면, 파이썬에 관심이 조금 있으신 분이라고 생각됩니다.

여러분들은 많은 언어들 중 파이썬에 왜 관심 갖게 되셨나요?

 

파이썬의 장점

1. 배우기 쉽다

프로그래밍 언어는 컴퓨터가 이해하기 쉬운 언어인지, 사람이 이해하기 쉬운 언어인지에 따라 저급언어와 고급언어로 나뉩니다.

파이썬은 고급언어이기에 가독성이 뛰어날 뿐만 아니라, 쉬운 탓에 많은 사람들이 사용해서 공부하는데에 필요한 자료들이 넘쳐나죠.

그 덕분에 우리같은 비전공자도 정말 쉽게 배울 수 있습니다. 옛날부터 코딩의 기초로 생각되던 C언어와 비교하면 정말정말 쉽습니다!

저는 기계공학과를 나와서 C언어를 배운적이 있어서 파이썬 기초 문법을 모두 익히는데에 2주정도 걸렸지만, 코딩을 전혀 해보지 않은 분들도 한 달이면 배울 수 있다고 생각됩니다.

파이썬과 C언어 비교. 

2. 패키지가 많다

파이썬은 패키지들이 정말 다양하게 존재합니다.

패키지란 쉽게 말해, '어느 똑똑한 개발자가 내가 원하는 기능을 이미 코드로 짜놓은 것들의 모음'이라 할 수 있습니다.

예를 들어, 제가 파이썬으로 인터넷에서 특정 주제의 기사를 1000개 수집해야한다고 가정해 봅시다.

이때, 누군가가 이미 만들어 놓은 웹크롤링(웹에서 대량의 정보를 얻는 행위) 관련 라이브러리를 설치해서 필요한 함수를 사용한다면

코드 단 몇 줄로 그것이 가능합니다.

 

3. 정보가 많다

앞서 언급한 장점으로 인해 많은 사람들이 파이썬을 익히고, 그 내용을 공유하고 있습니다.

덕분에 내가 모르는 것이 있으면 구글에 파이썬+OOO으로 검색하면 웬만하면 다 나옵니다.

우리가 할 것은 선배들이 짜놓은 코드나 라이브러리를 적절히 Ctrl+C, Ctrl+V로 갖고와서 유기적으로 연결하기만 하면 되는 것입니다.

아래 영상은 방금 말씀드린 내용과 알맞는데다가 제가 너무 재밌게 본 영상이라 공유해봅니다.

www.youtube.com/watch?v=cXB8rCW7lto

 

파이썬의 쓸모

지금까지 글을 읽으셨다면 이런 생각이 드실거라 생각합니다.

"그래. 파이썬이 왜 좋은지는 알겠어. 근데 배워서 어따 써먹어?"

맞습니다. 우리의 시간은 소중하기 때문에, 누군가 아무리 좋다고 피를 토하면서 주장해도

내 삶에 써먹지 못하면 쓸모가 없는 것입니다. 파이썬은 개발자, 비개발자를 떠나서 매우 유용한 언어입니다.

 

1. 개발자 입장

웹 서비스 개발

빅데이터 수집, 분석

머신러닝, 딥러닝 등의 AI 관련 프로그래밍

 

2. 비개발자 입장

웹 상에서 필요한 정보를 크롤링 (상품 정보 수집, 기사 분석, 댓글 분석)

반복적인 사무 작업을 자동화 (엑셀 작업, 메일 보내기, PDF 변환)

 

파이썬에 대한 개인적인 생각

파이썬은 가성비 좋은 언어라고 생각합니다. 배운 것에 비해, 할 수 있는 것은 너무나도 많은 언어죠.

제가 파이썬을 배우고 나서 든 생각은 제가 컴퓨터의 기능을 너무나도 조금만 활용하고 있었다는 것입니다.

만약 파이썬을 배우시면 여러분들의 컴퓨터가 단순한 문서작업, 인터넷 검색용이 아닌,

내 시간을 아껴주고, 내 능력을 한 단계 높여주는 도구가 되어 있을 것이라 자신있게 말씀드립니다.

 

여러분들이 파이썬을 배우는데에 코딩 유치원이 도움이 되길 바랍니다.

 

긴 글 읽어주셔서 감사합니다.

반응형

+ Recent posts