본문 바로가기
DATA/[ 모각코+ 12월 과정 ] 웹 크롤링

[ 모각코+ 9일차 ] 정적 크롤링 사용해보기 ④

by 2CHAE._.EUN 2021. 12. 30.
URL 주소의 패턴을 이용해서 여러 페이지의 정보 수집해보기

 

# 정적 크롤링을 위한 라이브러리 import
import requests
import bs4

# URL 주소 입력 및 HTML 받아오기
# URL에 한글이 포함될 경우 자동으로 인코딩 되므로 지우고 한글로 써주면됨
URL = "https://tv.naver.com/r"

# get 함수를 이용해서 웹 페이지의 내용 요청하기
raw = requests.get(URL)

# 문자열 타입인 raw.text를 실제 HTML 코드로 변환해주기
html = bs4.BeautifulSoup(raw.text, 'html.parser')

# 데이터를 감싸는 큰 틀 추출하기
box = html.find('div', { 'class' : 'top100' })

# 각 영상에 대한 데이터를 모두 받아오기
contents = box.find_all('dl', { 'class' : 'cds_info'})

# video 갯수 구하기 ( top 100이므로 100개 나오는게 맞음 )
#print(len(video))

#반복문을 사용해서 각 영상의 이름과 제목 추출하기
for content in contents :
    name = content.find('dd',{ "class" : "chn" })
    title = content.find('dt',{ "class" : "title" })

    print( name.text, title.text)

 

 

* top100은 실시간 데이터라 실시간으로 순위가 변경됨

 

 

크롤링 기능 추가하기

 

import requests
import bs4

# 반복문과 input 함수를 사용해서 원하는 데이터 찾기

while True :

    keyword = input("원하는 데이터 키워드를 입력해주세요. (0을 입력하면 종료)")
    if keyword == "0" :
        break

    URL = "https://tv.naver.com/" + keyword

    raw = requests.get(URL)

    html = bs4.BeautifulSoup(raw.text, 'html.parser')

    box = html.find('div', { 'class' : 'top100' })

    contents = box.find_all('dl', { 'class' : 'cds_info'})

    for content in contents :
        name = content.find('dd',{ "class" : "chn" })
        title = content.find('dt',{ "class" : "title" })

        print( name.text, title.text)

 

r을 입력하면 실시간 네이버tv의 TOP100을 확인할 수 있음

 

 

최종 코드

 

# 정적 크롤링을 위한 라이브러리 import
import requests
from bs4 import BeautifulSoup

keyword = input("원하는 데이터 키워드를 입력해주세요. (0을 입력하면 종료) ")

# URL 주소 입력 및 HTML 받아오기
# * URL에 한글이 포함될 경우 자동으로 인코딩 되므로 지우고 한글로 써주면된다.
# keyword를 이용해서 검색하고자하는 데이터 페이지로 이동해 데이터 추출이 가능함
URL = "https://tv.naver.com/" + keyword

# get 함수를 이용해서 웹 페이지의 내용 요청하기
raw = requests.get(URL)

# 문자열 타입인 raw.text를 실제 HTML 코드로 변환해주기
# from bs4 import BeautifulSoup 로 지정해줘서 bs4 안써줘도 됨
html = BeautifulSoup(raw.text, 'html.parser')

# 데이터를 감싸는 큰 틀 추출하기
box = html.find('div', { 'class' : 'top100' })

# 각 영상에 대한 데이터를 모두 받아오기
contents = box.find_all('dl', { 'class' : 'cds_info'})

print("\n[ 네이버 TV 실시간 TOP10 ]\n")
rank = 0
# 반복문을 사용해서 각 영상의 이름과 제목 추출하기
# 이름과 제목을 추출할 경우 문자열 타입으로 추출해야함
# strip 함수를 사용해서 양쪽 공백 제거
# lstrip : 왼쪽 공백 제거, rstrip : 오른쪽 공백 제거, strip : 양쪽 공백 제거
for content in contents[:10] :
    rank += 1
    name = content.find('dd',{ "class" : "chn" })
    title = content.find('dt',{ "class" : "title" })

    print( rank, ":", name.text.strip())
    print(title.text.strip() + "\n")

 

 


[ 9일차 문제 ]

 


import requests
import bs4

# 반복문과 input 함수를 사용해서 원하는 데이터 찾기

my_list = [["G마켓 랭크 순", 7] , ["판매 인기 순" , 8], ["낮은 가격 순" , 1] ,["높은 가격 순", 2], ["상품평 많은 순" , 13], ["신규 상품 순", 3]]

while True :
    print(" 1. G마켓 랭크 순\n 2. 판매 인기 순\n", "3. 낮은 가격 순\n", "4. 높은 가격 순\n", "5. 상품평 많은 순\n", "6. 신규 상품 순\n"  )

    keyword = int(input("원하는 정렬 순서를 입력해주세요. (0을 입력하면 종료) "))

    if keyword == 0 :
        break

    number = my_list[keyword-1][1]
    URL = "https://browse.gmarket.co.kr/search?keyword=마스크&s=" + str(number)

    raw = requests.get(URL)

    html = bs4.BeautifulSoup(raw.text, 'html.parser')

    box = html.find('div', {'class' : 'section__module-wrap', 'module-design-id' : '15'})

    items = box.find_all('div', {"class" : 'box__item-container'})

    print("\n<<<<", my_list[keyword-1][0], ">>>>\n")

    for item in items[:4] :
        name = item.find('span', {'class' : 'text__item'})
        price = item.find('strong', {'class' : 'text__value'}) 

        print( "이름 :", name.text, "\t가격 : ", price.text, "\n")

 

 

* 검색을 원하는 키워드를 입력받아서 그 키워드에 해당하는 모든 랭크 순 나열하기

import requests
import bs4

while True :
    keyword = input("검색을 원하는 키워드를 입력 (0을 입력하면 종료) : ")

    if keyword == "0" :
        break

    print("< G마켓의 ", keyword, " 상품 정보 >")

    my_List = [["7", "G마켓 랭크 순"], ["8", "판매 인기 순"], ["1", "낮은 가격 순"], ["2", "높은 가격 순"], ["13", "상품평 많은 순"], ["1", "신규 상품 순"]]

    for page, name in my_List :

        URL = "https://browse.gmarket.co.kr/search?keyword=" + keyword + "&s=" + page

        raw = requests.get(URL)
        
        html = bs4.BeautifulSoup(raw.text, 'html.parser')
        
        box = html.find('div', {'class' : 'section__module-wrap', 'module-design-id' : '15'})
        
        items = box.find_all('div', {'class' : 'box__item-container'})

        print("< ", name, " >\n")

        for item in items[:5] :

            title = item.find('span', {'class' : 'text__item'})
            price = item.find('strong', {'class' : 'text__value'})

            print( "이름 :", title.text, "\t가격 :", price.text, "\n")

 

 

저작권 출처 : https://cafe.naver.com/codeuniv

 

코딩 커뮤니티 - 코뮤니티 [파이썬/... : 네이버 카페

코뮤니티 [코딩공부/독학/스터디/대외활동] : python, C언어, java, 자바스크립트, HTML, CSS, 웹/앱개발

cafe.naver.com