본문 바로가기
Python/Python_Crawling

SSG 이벤트 크롤링 : select, find_all(string=True)

by Mr.DonyStark 2024. 2. 9.

□ .replace : 기존 A를 B로 바꿈 

.strip() : 앞뒤 공백 제거

 태그활용법

   : ('태그명'), ('.클래스명'), ('태그명.클래스명'), ('부모태그.클래스명 > 자식태그.클래스명'), ('태그')['속성']

select + find_all(string=True)  vs  select + select_one

  ○ 아래 코드보면 알 수 있듯이  select + select_one 방법이 정확한 데이터를 추출하고 전처리하기에도 수월함

  ○ select+find_all 사용시 간편한 코드로 해당 영역의 텍스트를 신속하게 추출할 수 있지만 전처리하기에 불편함.

  * 개인적으로 select + select_one 추천 / 특정영역의 정확한 태그값을 지정함으로써 효율적으로 수집, 가공이 가능하기에 추천

□ Select, Select_One 활용

#라이브러리 호출
import requests
from bs4 import BeautifulSoup
import datetime as dt

now_day = dt.datetime.now()

#크롤링 페이지
url_link = 'https://www.ssg.com/event/eventMain.ssg'

#request 설정
get_url_info = requests.get(url_link)
get_info = get_url_info.text
#parser 설정
my_parser = BeautifulSoup(get_info, 'html.parser')
#타겟영역의 데이터 추출 : li태그 class명(.evt_osmu_unit)
target_area = my_parser.select('li.evt_osmu_unit')

for index, v in enumerate(target_area):
    index += 1
    evt_title = v.select_one('strong').string.replace('  ',' ').strip() #행사명
    evt_contents_1 = v.select_one('p.desc1').text.replace('\n',' ').strip() #행사내용1 : p태그의 클래스명 desc1
    evt_contents_2 = v.select_one('p.desc2').text.replace('\n',' ').strip() #행사내용2 : p태그의 클래스명 desc2
    evt_total_contents = evt_contents_1 + evt_contents_2 #행사내용1,2 합친 총 내용
    if evt_total_contents == '': #행사 총 내용이 공란이라면 아래문구와 함께 저장
        evt_total_contents = '특이내용 없음'
    evt_link = v.select_one('a')['href'] #세부페이지 링크 : a태그의 href속성
    if index > 43:
        break
    print(f'{now_day}\t{index} 번째 \t행사\n이벤트명\t:\t{evt_title}\n이벤트 내용\t:\t{evt_total_contents}\n이벤트링크\t:\t{evt_link}')

select, select_one으로만 사용시

 

□ Select, Select_One 활용

#라이브러리 호출
import requests
from bs4 import BeautifulSoup
import datetime as dt

now_day = dt.datetime.now()

#크롤링 페이지
url_link = 'https://www.ssg.com/event/eventMain.ssg'

#request 설정
get_url_info = requests.get(url_link)
get_info = get_url_info.text
#parser 설정
my_parser = BeautifulSoup(get_info, 'html.parser')
#타겟영역의 데이터 추출 : li태그 class명(.evt_osmu_unit)
target_area = my_parser.select('li.evt_osmu_unit')

for v in target_area:
    for index, v1 in enumerate(target_area):
        text_area = v1.select_one('div.eo_in')
        evt_content = text_area.find_all(string=True)
        if index == 43:
            break
        for v2 in evt_content:
            if v2 != '\n':
                print(v2)

find_all(string=True) 사용결과