본문 바로가기
Python/Python_Crawling

크롤링 예제 4

by Mr.DonyStark 2023. 12. 20.

□ 예제 : 특정 페이지의 태그별 영역의 값을 가져와 원하는 형태로 출력하자

(작성자는 사이트의 요약정보를 출력해주는 것을 위해 태그별 크롤링한 데이터를 단순가공하여 출력함)

 

#라이브러리 호출
import requests
from bs4 import BeautifulSoup
#크롤링 대상 웹사이트 지정
web = 'https://davelee-fun.github.io/'
#정보 가져오기 requests.get()
requests_info = requests.get(web)
requests_info_parser = BeautifulSoup(requests_info.content, 'html.parser')

print('\n####################블로그 기본정보####################\n')
#블로그 기본정보
blog_info = requests_info_parser.select_one('div > h1.sitetitle') #div 태그의 바로 하위태그인 h1태그 중 sitetitle 클래스를 지는 값 출력
blog_nm = blog_info.string
print(f'블로그명\t:\t{blog_nm}')

blog_usr_id = blog_nm.split(' ')[0][0:5] #.split()을 활용하여 리스트 변환후 첫번째 값의 0부터 5까지의 길이만큼 출력
print(f'블로그 소유자\t:\t{blog_usr_id}') 

blog_intro = requests_info_parser.select_one('div.mainheading > p.lead') #클래스 mainheading을 가진 div 태그의 하위 p태그이며 클래스가 lead인 값
print(f'블로그 소개글\t:\t{blog_intro.get_text().strip()}') #strip을 활용하여 앞뒤 공백제거

blog_menu = requests_info_parser.select('ul', class_='navbar-nav ml-auto')
a=0
for v2 in blog_menu:
    v2_edit = v2.get_text().strip()
    v2_edit = v2_edit.split()
    for v2_1 in v2_edit:
        a+=1
        print(f'{a} 번째 대메뉴\t:\t{v2_1}')
print(f'블로그 메뉴 총합\t:\t{a} 개')

category_pd = requests_info_parser.select('section.featured-posts a.text-dark') #클래스명을 featured-posts를 가진 section태그의 하위 태그들 중 a태그이며 클래스가 text-dark인 것 추출
category_pd_list1 = list() #빈 리스트 생성
for v1_1 in category_pd: 
    category_pd_list1.append(v1_1.get_text()) #리스트에 태그로부터 받은 값을 가공하여 적재

category_pd_nm = requests_info_parser.select('section.featured-posts h4.card-text') #클래스명을 featured-posts를 가진 section태그의 하위 태그들 중 h4태그이며 클래스가 card-text인 것 추출
category_pd_list2 = list() #빈 리스트 생성
for v1_2 in category_pd_nm:
    category_pd_list2.append(v1_2.get_text().strip().split('상품명: ')[1]) #리스트에 태그로부터 받은 값을 가공하여 적재 + .strip() 앞뒤 공백제거 + split()함수로 특정 문자 기준으로 분리후 불필요한 값 제거

all_pd_dict = dict() #빈 딕셔너리 생성
for v1 in range(0,len(category_pd_list1)): #range함수를 활용해 0부터 categoty_pd_list 길이만큼 반복 시도
    all_pd_dict[category_pd_list1[v1]] = category_pd_list2[v1] #반복회수만큼 카테고리 리스트와 제품명 리스트의 값을 딕셔너리의 키와 벨류값으로 추가
print(f'\nFeatured 판매제품(카테코리:제품명)\n:{all_pd_dict}\n')

feature_ct = requests_info_parser.select('div.row.listrecent a.text-dark') #클래스명이 row listrecent를 가진 div태그의 하위태그중 text-dark클래스를 가진 a태그 추출
feature_ct_list = list()
a=0
for i in feature_ct:
    a+=1  
    #해당 데이터로 딕셔너리의 키에 적재예정이지만, 해당리스트는 중복값이 많기에 키별 차별성을 부여하기위해 번호부여
    feature_ct_list.append(str(a) + i.get_text()) #숫자와 스트링 계열 연산은 오류발생으로 숫자 타입을 문자로 형변환하여 연산 진행

feautre_pd = requests_info_parser.select('div.row.listrecent h4.card-text') #클래스명이 row listrecent를 가진 div태그의 하위태그중 card-text클래스를 가진 h4태그 추출
feautre_pd_list = list()
for i in feautre_pd:
    feautre_pd_list.append(i.get_text().strip()) #.strip()함수를 사용해 앞뒤 공백 제거후 list 적재

all_feature_dict = dict()
for i in range(0,len(feature_ct_list)): #range함수를 활용해 0부터 feature_ct_list 길이만큼 반복 시도
    all_feature_dict[feature_ct_list[i]] = feautre_pd_list[i] #반복회수만큼 카테고리 리스트와 제품명 리스트의 값을 딕셔너리의 키와 벨류값으로 추가
print(f'\nAll Stroies 판매제품(카테코리:제품명)\n:{all_feature_dict}\n') 

footer_content = requests_info_parser.select('div.container.text-center')
footer_content_list = list()
for i in footer_content:
    footer_content_list.append(i.get_text().strip())
print(f'블로그 푸터내용\t:\t{footer_content_list[0]}')

print('\n######################################################\n')

'Python > Python_Crawling' 카테고리의 다른 글

openpyxl : 엑셀파일 저장  (0) 2023.12.27
반복문을 활용한 페이지별 크롤링  (1) 2023.12.21
css selector  (0) 2023.12.20
크롤링 예제 3  (0) 2023.12.19
크롤링 예제 2  (0) 2023.12.19