웹크롤링(Web crawling)_selenium 예제(광주날씨검색, 한솥도시락 가격 크롤링, 크롤링에서 자주쓰는 예외처리 방법)
WEB 2021. 5. 3. 10:08Google에서 광주날씨 검색하기¶
In [1]:
from selenium import webdriver as wb
from selenium.webdriver.common.keys import Keys
In [15]:
driver = wb.Chrome()
url = "http://www.google.com"
driver.get(url)
In [16]:
#class를 찾을때는 뒤에 name이 꼭 와야 함.
#class명이 두개일때 띄어쓰기를 지우고 '.'으로 구별해서 작성해준다.
search = driver.find_element_by_class_name('gLFyf.gsfi')
In [18]:
search.send_keys('광주날씨')
In [20]:
search.send_keys(Keys.ENTER)
In [31]:
#복수개의 값을 가지고오고 싶은경우 element 뒤에 s를 붙여줌.
weather = driver.find_element_by_class_name('wob_t')
In [32]:
weather.text
Out[32]:
'25'
한솥도시락에서 이름, 가격, 정보 수집¶
In [73]:
from selenium import webdriver as wb
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup as bs
import pandas as pd
import time
In [74]:
menu_url = "https://www.hsd.co.kr/menu/menu_list"
In [78]:
driver = wb.Chrome()
driver.get(menu_url)
In [79]:
#더보기 버튼 찾기
btn_more = driver.find_element_by_class_name('c_05')
In [80]:
#더보기 버튼 클릭하기 >> 예외처리를 넣어서 에러발생시
# 에러발생시 프로그램이 끊기지 않도록 함.
#try >> 작동할 코드를 넣어줌.
try :
for index in range(5):
btn_more.click()
time.sleep(2)
#except >> 에러가 났을 떄 실행될 코드
except :
print(f"{index} 까지 버튼이 존재합니다.")
3 까지 버튼이 존재합니다.
In [81]:
# request와 driver를 사용할때 가장 큰 차이: request는 그 페이지 자체정보를 가져옴.
# Driver.page_source의 경우 보이는 페이지(화면이 변할때마다)에 대해서만 적용하게 됨.
menu_soup = bs(driver.page_source,'lxml')
In [86]:
menu_name = menu_soup.select('div.item-text > h4')
In [87]:
price_soup = bs(driver.page_source,'lxml')
In [88]:
menu_price = price_soup.select('span.blind+strong')
menu_price
Out[88]:
[<strong>10,000</strong>, <strong>10,000</strong>, <strong>10,000</strong>, <strong>7,000</strong>, <strong>8,000</strong>, <strong>4,700</strong>, <strong>4,500</strong>, <strong>5,500</strong>, <strong>5,500</strong>, <strong>5,600</strong>, <strong>6,000</strong>, <strong>5,200</strong>, <strong>4,000</strong>, <strong>6,900</strong>, <strong>7,000</strong>, <strong>5,000</strong>, <strong>15,000</strong>, <strong>9,000</strong>, <strong>8,500</strong>, <strong>8,000</strong>, <strong>7,000</strong>, <strong>6,000</strong>, <strong>6,500</strong>, <strong>5,000</strong>, <strong>6,900</strong>, <strong>3,900</strong>, <strong>4,000</strong>, <strong>5,000</strong>, <strong>4,400</strong>, <strong>4,200</strong>, <strong>3,900</strong>, <strong>3,900</strong>, <strong>2,200</strong>, <strong>1,000</strong>, <strong>1,700</strong>, <strong>3,500</strong>, <strong>5,500</strong>, <strong>3,200</strong>, <strong>5,200</strong>, <strong>4,200</strong>, <strong>3,500</strong>, <strong>2,900</strong>, <strong>3,400</strong>, <strong>3,400</strong>, <strong>2,900</strong>, <strong>3,500</strong>, <strong>4,000</strong>, <strong>3,900</strong>, <strong>4,500</strong>, <strong>4,500</strong>, <strong>3,700</strong>, <strong>4,500</strong>, <strong>4,300</strong>, <strong>5,700</strong>, <strong>6,700</strong>, <strong>5,500</strong>, <strong>3,900</strong>, <strong>3,600</strong>, <strong>3,900</strong>, <strong>4,800</strong>, <strong>4,800</strong>, <strong>3,200</strong>, <strong>5,000</strong>, <strong>5,000</strong>, <strong>5,000</strong>, <strong>13,000</strong>, <strong>14,000</strong>, <strong>7,000</strong>, <strong>2,700</strong>, <strong>2,200</strong>, <strong>2,200</strong>, <strong>2,800</strong>, <strong>3,900</strong>, <strong>4,100</strong>, <strong>2,400</strong>, <strong>3,900</strong>, <strong>3,400</strong>, <strong>3,200</strong>, <strong>3,200</strong>, <strong>3,200</strong>, <strong>3,100</strong>, <strong>2,500</strong>, <strong>2,800</strong>, <strong>2,000</strong>, <strong>2,500</strong>, <strong>2,000</strong>, <strong>2,000</strong>, <strong>1,500</strong>, <strong>1,000</strong>, <strong>3,600</strong>, <strong>3,600</strong>, <strong>2,900</strong>, <strong>2,900</strong>, <strong>1,500</strong>, <strong>1,500</strong>, <strong>4,800</strong>, <strong>8,000</strong>, <strong>7,800</strong>, <strong>3,000</strong>, <strong>7,800</strong>, <strong>3,000</strong>, <strong>7,500</strong>, <strong>2,800</strong>, <strong>10,000</strong>, <strong>5,000</strong>, <strong>5,000</strong>, <strong>400</strong>, <strong>400</strong>, <strong>700</strong>, <strong>1,800</strong>, <strong>500</strong>, <strong>400</strong>, <strong>400</strong>, <strong>400</strong>, <strong>300</strong>, <strong>300</strong>]
In [100]:
menu_list = []
rank_list = []
price_list = []
for i in range(len(menu_name)) :
menu_list.append(menu_name[i].text)
price_list.append(menu_price[i].text)
rank_list.append(i+1)
In [101]:
info = {"순위": rank_list, "메뉴": menu_list, "가격": price_list}
In [102]:
menu_pd = pd.DataFrame(info)
In [106]:
pd.set_option('display.max_row', None)
In [107]:
menu_pd.set_index('순위', inplace=True)
pandas의 다른 옵션들¶
- pd_dt.head(5) : 상위 5개의 내용만 출력
- pd.set_option('display.max_row', None) : 행을 생략하지 않고 모든 내용 출력
In [108]:
menu_pd
Out[108]:
메뉴 | 가격 | |
---|---|---|
순위 | ||
1 | 매화 (고메이 크림고로케) | 10,000 |
2 | 매화(치킨, 연어구이) | 10,000 |
3 | 매화 (순살 고등어데리야끼) | 10,000 |
4 | 진달래 | 7,000 |
5 | 개나리(순살 고등어 간장구이) | 8,000 |
6 | 중화 짜장볶음밥 | 4,700 |
7 | 나시고랭 | 4,500 |
8 | 생선까스도련님고기고기 | 5,500 |
9 | 돈까스도련님고기고기 | 5,500 |
10 | 탕수육도련님고기고기 | 5,600 |
11 | 새치 고기고기 | 6,000 |
12 | 돈치 고기고기 | 5,200 |
13 | 고기고기 | 4,000 |
14 | 찜닭도시락 | 6,900 |
15 | 믹스후라이정식 | 7,000 |
16 | 믹스후라이도시락 | 5,000 |
17 | 주말숯불삼겹2종정식 | 15,000 |
18 | 고추장숯불삼겹정식 | 9,000 |
19 | 숯불삼겹정식 | 8,500 |
20 | 제육 김치찌개 정식 | 8,000 |
21 | 고등어 불고기 정식 | 7,000 |
22 | 콤비네이션 정식 | 6,000 |
23 | 숯불직화구이 | 6,500 |
24 | 소불고기 | 5,000 |
25 | 메가치킨제육 | 6,900 |
26 | 생선까스도련님 | 3,900 |
27 | 칠리 찹쌀탕수육도련님 | 4,000 |
28 | 동백 | 5,000 |
29 | 치킨제육 | 4,400 |
30 | 국화 | 4,200 |
31 | 돈까스도련님 | 3,900 |
32 | 제육볶음 | 3,900 |
33 | 미니닭가슴살볶음밥 | 2,200 |
34 | 한솥밥 | 1,000 |
35 | 현미밥 | 1,700 |
36 | 스팸마요 | 3,500 |
37 | 메가스팸마요 | 5,500 |
38 | 갈비치킨마요 | 3,200 |
39 | 메가치킨마요 | 5,200 |
40 | 왕치킨마요 | 4,200 |
41 | 빅치킨마요 | 3,500 |
42 | 치킨마요 | 2,900 |
43 | 참치 샐러드마요 | 3,400 |
44 | 치킨 샐러드마요 | 3,400 |
45 | 참치마요 | 2,900 |
46 | 돈치마요 | 3,500 |
47 | 치즈 카레도시락 | 4,000 |
48 | 돈까스 카레 | 3,900 |
49 | 스팸철판볶음밥 | 4,500 |
50 | 소불고기 철판볶음밥 | 4,500 |
51 | 한솥 철판볶음밥 | 3,700 |
52 | 소고기 육개장 | 4,500 |
53 | 묵은지 김치찌개 | 4,300 |
54 | 숯불직화구이 덮밥 | 5,700 |
55 | 숯불구이 덮밥 + 쌈채소 | 6,700 |
56 | 왕카레돈까스덮밥 | 5,500 |
57 | 새우돈까스 덮밥 | 3,900 |
58 | 돈까스 덮밥 | 3,600 |
59 | 열무두부강된장 | 3,900 |
60 | 소불고기 감초고추장 비빔밥 | 4,800 |
61 | 시골제육 두부강된장 비빔밥 | 4,800 |
62 | 참치야채 감초고추장 | 3,200 |
63 | 튼튼도시락 | 5,000 |
64 | 해피닭가슴살볶음밥 | 5,000 |
65 | 쑥쑥치킨마요 | 5,000 |
66 | 순살치킨 세트(대) | 13,000 |
67 | 순살치킨믹스 세트 | 14,000 |
68 | 순살치킨 세트(중) | 7,000 |
69 | 반찬 녹두전 | 2,700 |
70 | 반찬 해물부추전 | 2,200 |
71 | 반찬 계란말이 | 2,200 |
72 | 반찬 치즈계란말이 | 2,800 |
73 | 반찬 묵은지김치찌개 | 3,900 |
74 | 반찬 소고기육개장 | 4,100 |
75 | 반찬 카레 | 2,400 |
76 | 반찬 소불고기 | 3,900 |
77 | 반찬 순살 고등어데리야끼 | 3,400 |
78 | 반찬 치킨 | 3,200 |
79 | 반찬 고기고기 | 3,200 |
80 | 반찬 돈까스 도련님 | 3,200 |
81 | 반찬 제육볶음 | 3,100 |
82 | 반찬 돈까스 | 2,500 |
83 | 믹스고로케 | 2,800 |
84 | 바삭 군만두 | 2,000 |
85 | 미니 찹쌀핫도그 | 2,500 |
86 | 미니 찹쌀탕수육 | 2,000 |
87 | 감자고로케 | 2,000 |
88 | 케이준후라이 | 1,500 |
89 | 쌈채소 세트 | 1,000 |
90 | 치킨 샐러드(유자드레싱) | 3,600 |
91 | 치킨 샐러드(사과드레싱) | 3,600 |
92 | 그린 샐러드 (유자드레싱) | 2,900 |
93 | 그린 샐러드 (사과드레싱) | 2,900 |
94 | 미니 샐러드 (유자드레싱) | 1,500 |
95 | 미니 샐러드 (사과드레싱) | 1,500 |
96 | 국물떡볶이 튀김세트 | 4,800 |
97 | 닭강정 트리플 콤보 | 8,000 |
98 | 탕수 닭강정(중) | 7,800 |
99 | 탕수 닭강정(소) | 3,000 |
100 | 갈비 닭강정(중) | 7,800 |
101 | 갈비 닭강정(소) | 3,000 |
102 | 오리지널 닭강정(중) | 7,500 |
103 | 오리지널 닭강정(소) | 2,800 |
104 | 치킨 BOX(대) | 10,000 |
105 | 치킨BOX(중)_양식소스 | 5,000 |
106 | 치킨BOX(중)_칠리소스 | 5,000 |
107 | 오징어젓갈 | 400 |
108 | 간장마늘쫑 | 400 |
109 | 오이지무침 | 700 |
110 | 한솥 두부강된장소스 | 1,800 |
111 | 한솥 감초볶음고추장소스 | 500 |
112 | 반찬 열무얼갈이김치 | 400 |
113 | 반찬 무생채 | 400 |
114 | 볶음김치 | 400 |
115 | 김치 | 300 |
116 | 무말랭이 | 300 |
예외처리¶
--try문에서 오류가 나면 except로 빠져나간다.
In [72]:
#try >> 작동할 코드를 넣어줌.
try :
for index in range(5):
btn_more.click()
time.sleep(2)
#except >> 에러가 났을 떄 실행될 코드
except :
print(f"{index} 까지 버튼이 존재합니다.")
3 까지 버튼이 존재합니다.
'WEB' 카테고리의 다른 글
웹 크롤링(Web crawling)_ 크롬창 안띄우고 크롤링(headless option) (0) | 2021.05.03 |
---|---|
웹크롤링(Web crawling)_유튜브 영상제목, 네이버 이미지 크롤링 (0) | 2021.05.03 |
웹크롤링(Web crawling)_selenium(셀레니움) (0) | 2021.05.03 |
웹크롤링(web crawling)_영화관람객 리뷰 수집 (0) | 2021.05.03 |
웹크롤링(web crawling)_20210506기준 네이버영화 랭킹페이지 (0) | 2021.05.03 |