□ 예제 : 특정 페이지의 태그별 영역의 값을 가져와 원하는 형태로 출력하자
(작성자는 사이트의 요약정보를 출력해주는 것을 위해 태그별 크롤링한 데이터를 단순가공하여 출력함)
#라이브러리 호출
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 |