빅데이터 서비스 교육/크롤링

크롤링 웹페이지 데이터 수집

Manly 2022. 5. 16. 12:51
반응형

한솥 도시락 페이지 가져오기

from selenium import webdriver as wb
from selenium.webdriver.common.keys import Keys
import pandas as pd
import time
from bs4 import BeautifulSoup as bs

 

url = 'https://www.hsd.co.kr/menu/menu_list'
driver = wb.Chrome()
driver.get(url)

 

# 예외처리 try문에서 오류가나면 except으로 빠짐

for i in range(5):
    try:
        btn = driver.find_element_by_css_selector('a.c_05')
        btn.click()
        time.sleep(0.3)
    except:
        print('더보기 끝')

더보기 버튼을 찾고 클릭 후 0.3초 대기를 5회 반복

더보기 버튼을 다누르고 페이지가 다 펼쳐져 버튼이 없어지면 오류가 나므로 try, except문으로.

 

 

soup = bs(driver.page_source,'lxml')

driver.page_source가 전에 썼던 res.text와 같다

 

제어를 하고싶을때는 

driver.find_element_by_css_selector

웹페이지의 컨텐츠를 가져오고싶을때

BeautifulSoup을 통해 파싱 후 select

 

더보기 버튼이 있는 메뉴 이름 / 가격 가져오기

soup = bs(driver.page_source,'lxml')

soup.select('h4.h.fz_03')[0].text

 

title = soup.select('h4.h.fz_03')
price = soup.select('div.item-price > strong')

 

태그들을 가져왔으니, 원하는 텍스트(가격,메뉴명)들만 뽑아서 리스트에 넣어보자

 

title_list = []
price_list = []
rank_list = []
for i in range(len(title)):
    title_list.append(title[i].text)
    price_list.append(price[i].text)
    rank_list.append(i+1)
dic = {'번호':rank_list, '메뉴명':title_list, '가격':price_list}
df = pd.DataFrame(dic)
df = df.set_index('번호')
df
	메뉴명	          가격
번호		
1	1993 왕돈까스 도시락	9,300
2	나시고랭 콤보          6,800
3	나시고랭	          6,000
4	스리라차 알새우칩	  1,200
5	한입 족발 도시락	   8,500
...	...	...
90	무말랭이 무침           300
91	한솥밥	                1,000
92	현미밥	                1,700
93	리얼 티라미수 찰떡	   1,500
94	리얼꿀 미니호떡	     2,200

 

메뉴 그림을 클릭해서 메뉴 설명들 가져오기

이때 클릭해서 들어가기 위해 아래 img가아닌 onclick이 있는 위의 a태그에서 가져온다

 

먼저 메뉴 그림을 클릭

img = driver.find_elements_by_css_selector('div.item-spacer > a.item-cont')
img[0].click()

 

페이지 정보 파싱 후 메뉴 설명 가져오기

soup = bs(driver.page_source, 'lxml') # 파싱부터 해야된다
c=soup.select_one('p.account')[0]
# 여러개이므로 [0]이나  c=soup.select_one('p.account') select_one을 쓴다

driver.back()     #뒤로가기

 

위의 과정들을 반복해서 메뉴 그림 클릭 후 설명가져오고 뒤로가기

img = driver.find_elements_by_css_selector('div.item-spacer > a.item-cont')
c_list=[]

for i in range(len(img)):
    img = driver.find_elements_by_css_selector('div.item-spacer > a.item-cont')
    img[i].click()
    time.sleep(0.5) #클릭 후 화면전환 시간
    
    soup = bs(driver.page_source, 'lxml')
    c=soup.select('p.account')[0]   #OR   c=soup.select_one('p.account')
    #이때 실제로는 하나만 가져오기때문에 [0]으로 고정이다
    c_list.append(c.text.strip())
    
    driver.back()
    time.sleep(0.5)

이때 클릭 후 들어가고 뒤로간 후에 이미지와 처음 찾은 이미지가 다르기 때문에

뒤로가기 후 반복문안에서도 이미지를 찾아야 한다

c_list

['온 가족이 사랑하는 두툼하고 바삭한 왕 돈까스와 과일향 가득 감칠 맛 나는 한솥 특제 데미그라스 소스로 맛도 구성도 왕인 수량한정 신메뉴',
 'CNN에서 선정한 세계에서 가장 맛있는 음식 2위!  큼직한 닭고기와 스파이시한 풍미를 듬뿍 넣어 볶아  더 맛있게 돌아온 한솥 나시고랭과  특제 스리라차 마요소스를 곁들인 바삭바삭 알새우칩 콤보set',
 'CNN에서 선정한 세계에서 가장 맛있는 음식 2위!  큼직한 닭고기와 스파이시한 풍미를 듬뿍 넣어 볶아  더 맛있게 돌아온 한솥 나시고랭',
 '업그레이드되어 다시 돌아온 한솥 스리라차 마요소스와 바삭바삭 알새우칩! 계속 손이 가는 마성의 스낵',
...........

 

유튜브 크롤링

url='https://www.youtube.com/c/GYMJONGKOOK/videos'
driver = wb.Chrome()
driver.get(url)

 

휠을 내려야 영상들이 나타나는 구조

 

# 스크롤제어

body = driver.find_element_by_css_selector('body')

for i in range(50):
    body.send_keys(Keys.PAGE_DOWN)
    time.sleep(0.1)

 

유튜브 동영상 제목, 조회수 가져오기

soup = bs(driver.page_source, 'lxml')
title = soup.select('a#video-title')
view = soup.select('span.style-scope.ytd-grid-video-renderer:nth-child(1)')
#동일 span태그, 클래스명에 동영상 올린 날짜와 조회수가 같이 나와서 위처럼 span태그 클래스명의
#첫번째만 가져오게 nth-child(1)
title_list=[]
view_list=[]
rank_list=[]

for i in range(len(title)):
    title_list.append(title[i].text.strip())
    view_list.append(view[i].text.strip())
    rank_list.append(i+1)

가져 올때 title 제목 과 view 조회수의 길이가 같은지 확인해 볼것

dic={'번호':rank_list,'영상명':title_list,'조회수':view_list}
df = pd.DataFrame(dic)
df.set_index('번호',inplace=True)   
# inplace=True로 index를바꾼것을 기존df에 저장 
df
영상명	조회수
번호		
1	어깨후면.. 저는 이렇게 합니다..	조회수 49만회
2	삼촌이 짐종국일 때 2.. (Feat. TXT)	조회수 555만회
3	MZ세대와 쇼핑하는 X세대.. (Feat. 무신사 플레이어)	조회수 122만회
4	가수 맞으시죠...? (Feat. 지피티)	조회수 97만회
5	이 사람이다... (Feat. 김계란, 칼로바이)	조회수 213만회
6	호랑이 굴에 들어가도 운동만 하면 산다...	조회수 257만회
7	호랑이 굴에 들어온 기린	조회수 474만회
8	주짓수 블랙밸트와 런닝맨 블랙벨트	조회수 91만회
9	아프니까 홍보다... (Feat. 뜨거운 피 정우)	조회수 79만회
10	아프니까 유산소다...	조회수 112만회
11	런닝맨PD들아..놀면 뭐하니? 훈련해야지.. (feat. 놀뭐팀 도발)	조회수 195만회
12	근육 싸움꾼..(feat. 김동현)	조회수 153만회
13	치킨 레그 데이...(feat. 순살만 공격)	조회수 85만회
14	몰디브에서 운동 한 잔..	조회수 262만회
15	운동 유튜버의 효도 여행 삼분할	조회수 57만회
16	명절이니까 운동도 '세 배' 더..	조회수 222만회
17	축구 하는 날 하체 운동 하는 날이 겹칠 땐…	조회수 102만회
18	이렇게 동생 하나를 또 잃습니다.. (Feat. 황재균 선수)	조회수 121만회
....................

 

지마켓 페이지 베스트상품에서 클릭해서 들어가고 뒤로가기

url='http://corners.gmarket.co.kr/Bestsellers'
driver = wb.Chrome()
driver.get(url)

 

 

img = driver.find_elements_by_css_selector('img.lazy')
여기선 onlick로 가져오니 숨겨진5개는 클릭 불가능해서 img로 가져온다 
# 원하는 태그 copy - selector로 상위부터 빠짐없이 그 태그까지 나온다.

 

btn[0].click()
time.sleep(0.5)
driver.back()
img = driver.find_elements_by_css_selector('img.lazy')

for i in range(len(img)):
    img = driver.find_elements_by_css_selector('img.lazy')
    img[i].click()
    time.sleep(0.5)
    
    driver.back()
    time.sleep(0.3)

지마켓 베스트상품페이지 상품명, 가격, 원산지 크롤링

url='http://corners.gmarket.co.kr/Bestsellers'
driver = wb.Chrome()
driver.get(url)
img = driver.find_elements_by_css_selector('img.lazy')
title_list = []
price_list = []
o_list=[]
rank_list = []

for i in range(5):
    img = driver.find_elements_by_css_selector('img.lazy')
    img[i].click()
    time.sleep(0.3)
      
    soup = bs(driver.page_source, 'lxml')
    title = soup.select_one('h1.itemtit')
    price = soup.select_one('strong.price_real')

    w = soup.select_one('ul > li.list-item-origin.uxeslide_item > div > div')
    o_f = w.text.strip().split('\n')[1]
    
    title_list.append(title.text.strip())
    price_list.append(price.text.strip())
    o_list.append(o_f)
    rank_list.append(i+1)
        
    driver.back()
    time.sleep(0.3)
dic = {'순위':rank_list,'상품명':title_list,'가격':price_list,'원산지':o_list}
df = pd.DataFrame(dic)
df.set_index('순위', inplace=True)
df
	상품명	가격	원산지
순위			
1	제주농협 고당도 카라향 2.5kg(15~25과) 최종가15720원	25,900원	원산지제주
2	(아이허브) 2개X 프로텍티스 베이비 드롭 아기 유산균 비타민D 10ml 빠른직구	64,370원	원산지미국
3	주니어 여아 초등학생 원피스 팬츠 아동복 옷 레깅스	13,900원	원산지국산
4	BKC트리플팩티셔츠/트윈팩니트팬츠2종택1	16,940원	원산지상세설명 참조
5	농협 청원생명쌀 10kg 추청쌀 특등급 완전미 추가쿠폰	29,900원	원산지충북 청주시

 

 

반응형

'빅데이터 서비스 교육 > 크롤링' 카테고리의 다른 글

크롤링  (0) 2022.05.18
크롤링 이미지 가져오기  (0) 2022.05.17
크롤링 데이터 수집 및 웹페이지 제어  (0) 2022.05.13
크롤링 기초  (0) 2022.05.12