한솥 도시락 페이지 가져오기
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 |