pip install requests
# http ์์ฒญ์ฒ๋ฆฌ๋ฅผ ์ํด ์ฌ์ฉํ๋ ๋ชจ๋
pip install BeautifulSoup4
# ์น ํฌ๋กค๋ง ๋๋ ์คํฌ๋ํ ํ ๋ ์ฌ์ฉํ๋ ๋ชจ๋
pip install selenium
# ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ์ปจํธ๋กคํ์ฌ ์น UI๋ฅผ Automationํ๋ ๋๊ตฌ ์ค ํ๋
pip install webdriver-manager
์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์น ํ ์น ํฌ๋กค๋ง์ ์งํํด๋ณด๋ ค๊ณ ํ๋ค.
๋ฏธ๋์ฝ๋ค ๊ฐ์ํ๊ฒฝ์ด ์ค์น๋์ด์๋ค๋ ๊ฐ์ ํ์ ์งํํ์๋ค.
๋๋ ์คํ๋ฒ
์ค ๋ฉ๋ด ์ค '์๋ฃ'๋ฆฌ์คํธ์ ํ๋ชฉ๋ช
๊ณผ ์ด๋ฏธ์ง ์ฃผ์๋ฅผ ๋ฐ์ค๋ ค๊ณ ํ๋ค.
๊ฐ๋ฐ์๋๊ตฌ๋ฅผ ๋๋ฌ์ ์ดํด๋ณด๋ฉด, img src์ ์ด๋ฏธ์ง ์์ค์ alt ํ๊ทธ ์์ ์๋ฃ name์ด ์๋ ๊ฒ์ ์ ์ ์๋ค.
๊ทธ ์์ ํ๊ทธ๋ฅผ ๋ณด๋ฉด, ํด๋์ค๋ช
์ด 'menuDataSet'์ธ liํ๊ทธ๋ก ํ๋์ ์ํ์ ๋ํ๋ด๊ณ ์๋ค.
๊ฐ์ํ๊ฒฝ ์คํ ํ, ํ์ผ ๋ง๋ค๊ธฐ
import csv
import re
import time
from bs4 import BeautifulSoup
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ import ํ๊ธฐ
โ๐ป ์ฌ๊ธฐ์! ๋ด๊ฐ ์๋ฌ ๋ ๋ถ๋ถ์ด ์์๋ค. ์ ์ผ ๋ง์ง๋ง ์ค์ ์ํฌํธ ํ์ง ์๊ณ ์งํํ๋,
chromedriver executable needs to be in PATH์ค๋ฅ๊ฐ ๋ฌ๋ค๐
๊ตฌ๊ธ๋ง ํด๋ณด๋, ์ ์ผ ๋ง์ง๋ง ์ค์ฒ๋ผ import ํ
webdriver.Chrome(ChromeDriverManager().install())
์ ์
๋ ฅํด์ค์ผํ๋ค! ์ ์ฝ๋๋ ์๋ ์ฝ๋์ ์๋ค.
์ํฌํธ ํ, csvํ์ผ์ ์ ์ฅํด์ผ ํ๋, csvํ์ผ์ ์์ฑํ๋ค.
filename = "starbucks_product.csv"
csv_open = open(filename, "w+", encoding="utf-8")
csv_writer = csv.writer(csv_open)
open๋ช
๋ น์ด๋ก w+(์ฝ๊ธฐ+์ฐ๊ธฐ ๋ชจ๋๋ก ์ด๊ธฐ)๋ก ํ์ผ์ ์์ฑํ๋ค
| ๋ชจ๋ | ์ค๋ช |
|---|---|
| r | ํ์ผ์ ์ฝ๊ธฐ ์ ์ฉ ๋ชจ๋๋ก ์ด๊ธฐ |
| r+ | ์ฝ๊ธฐ+์ฐ๊ธฐ ๋ชจ๋, ๋ฎ์ด์ฐ๊ธฐ๋ก ํ์ผ์ ์ด๋ค |
| w | ํ์ผ์ ์ฐ๊ธฐ ๋ชจ๋๋ก ์ด๊ธฐ |
| w+ | ์ฝ๊ธฐ+ ์ฐ๊ธฐ ๋ชจ๋, ๊ธฐ์กด์ ํ์ผ์ ์ง์ฐ๊ณ ํ์ผ์ ์ด๋ค |
| a | ํ์ผ์ ๋ด์ฉ ์ถ๊ฐํ๊ธฐ ๋ชจ๋๋ก ์ด๊ธฐ |
| t | ํ ์คํธ ๋ชจ๋๋ก ํ์ผ ์ด๊ธฐ |
| b | ๋ฐ์ด๋๋ฆฌ ๋ชจ๋๋ก ํ์ผ ์ด๊ธฐ |
write๋ช
๋ น์ด๋ก ๋ฆฌ์คํธ ๋ฃ๊ธฐ
๋ง์ฝ ํ ์ค์ ๋ฃ๊ณ ์ ํ๋ค๋ฉด, writelines ์ฐ๊ธฐ!
driver = webdriver.Chrome(ChromeDriverManager().install())
url = "https://www.starbucks.co.kr/menu/drink_list.do"
driver.get(url)
time.sleep(7)
์น์ด ์ผ์ง๊ณ , ์๋ url๋ก ์ ์ ํ ์ ์๋๋ก driver~ ๋ด์ฉ์ ์
๋ ฅํ๋ค.
get๋ฉ์๋๋ก url์ ์ !!!
ํน์๋, ํฌ๋กฌ ๋ก๋ฉ ๋๋๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์ผ๋ 7์ด ๊ธฐ๋ค๋ฆฌ์๐
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
drinks = soup.findAll("li", {"class": re.compile("menuDataSet")})
BeautifulSoup(html, 'html.parser')
๋ด๊ฐ ์ ์ํ ํ์ด์ง์ ๋ฌธ์์ด์ html๊ตฌ์กฐ๋ก ๋์ด ์์ด~ ๊ทธ๋ฌ๋๊น html๋ก ๋ถ์ํด์ค!
๐ฆ์ฌ๊ธฐ์ ์ ๊น! ๋๋ html.parser๋ฅผ ์ผ๋๋ฐ ์ด parser์ ์ข
๋ฅ๋ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋ค.
๊ทธ ์ค ๊ฐ์ฅ ๋ํ์ ์ธ ๋๊ฐ์ง! html.parser์ lxml
| parser | ์ฌ์ฉ๋ฐฉ๋ฒ | ์ฅ์ | ๋จ์ |
|---|---|---|---|
| html.parser | BeautifulSoup(markup, "html.parser") | ๊ฐ์ข ๊ธฐ๋ฅ ์๋น, ์ ์ ํ ์๋ | ์ด์ ๋ฒ์ ์ ํ์ด์ฌ์ ๋ํด ํธํ์ฑ์ด ์ข์ง ์์ ( ํ์ด์ฌ 2.7.3 ์ด๋ 3.2.2 ์ด์ ๋ฒ์ ์์) |
| lxml | BeautifulSoup(markup, "lxml") | ์์ฃผ ๋น ๋ฆ, ์ด์ ๋ฒ์ ํ์ด์ฌ์ ๊ฝค ์ ํธํ๋จ | ์ธ๋ถ C ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์กด |
๐คทโโ๏ธ lxml์ด ์ข ๋ ๋น ๋ฅด์ง๋ง, ๊ฒ์ํด๋ณธ ๊ฒฐ๊ณผ ์ ๋ฌธ์ ์ด๊ณ ๋ง์ ์์ ์์
์ ํ๋๊ฒ ์๋๋ผ๋ฉด ๋ณดํต์ html.parser๋ฅผ ์ด๋ค๊ณ ํ๋ค.
๋ํ ์ ํํ๊ฒ html๋ก ๋งํฌ์
์ด ์๋์ด ์์ ๊ฒฝ์ฐ, lxml๋ก ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
์ถ์ฒ: parser์ถ์ฒ
์ด์ ์ ๋ฒจ๋ก๊ทธ์ ํ๋ฒ ์ ๋ฆฌํ ์ ์ด ์๋๋ฐ, ๋ค์ ํ๋ฒ ์ ๋ฆฌํ๋ ค๊ณ ํ๋ค.
์ด์ ์ ์ ๋ฆฌํ ๋ฒจ๋ก๊ทธ(์ ๊ทํํ์)
print("m.group():", m.group()) # ์ผ์นํ๋ ๋ฌธ์์ด ๋ฐํ
print("m.string():", m.string) # ์
๋ ฅ๋ฐ์ ๋ฌธ์์ด
print("m.start():", m.start()) # ์ผ์นํ๋ ๋ฌธ์์ด์ ์์ index
print("m.end():", m.end()) # ์ผ์นํ๋ ๋ฌธ์์ด์ ๋ index
print("m.span():", m.span()) # ์ผ์นํ๋ ๋ฌธ์์ด์ ์์/๋ index
Ex.
def print_match(m):
if m:
print("m.group():", m.group())
print("m.string():", m.string)
print("m.start():", m.start())
print("m.end():", m.end())
print("m.end()", m.span())
p = re.compile("ca.e")
m = p.search("careless") #search๋ ์ฃผ์ด์ง ๋ฌธ์์ด ์ค์ ์ผ์นํ๋๊ฒ ์๋์ง ํ์ธํ๋ค
print_math(m)
#๊ฒฐ๊ณผ
m.group() : care
m.string() : careless
m.start() : 0
m.end() : 4
m.end() : (0,4)
๊ทธ๋ฆฌ๊ณ ๋ค์ ์ฝ๋๋ฅผ ์ดํด๋ณด์
์ ๊ทํํ์์ ํ์ฉํ์ฌ ์ผ์นํ๋ ๋ถ๋ถ์ drinks์ ๋ฃ์๊ณ ,
for drink in drinks:
image_tag = drink.find("img")
image_url = image_tag['src']
title = image_tag['alt']
csv_writer.writerow((title, image_url))
csv_open.close()
img๋ก findํ ํ, src๋ image_url ๋ณ์์ ๋ด๊ณ , alt๋ ํ์ดํ์ ๋ด์๋ค.
๊ทธ๋ผ csvํ์ผ๋ก ํ๋ชฉ๋ช
๋ฐ ์ด๋ฏธ์งurl์ด ํ๋ก ์ ๋ฆฌ๋ ๊ฑธ ํ์ธํ ์ ์๋ค!
์ด๋ฐ์ ์ ํฌ๋ธ์์ ํฌ๋กค๋ง ์์๋ณด๊ณ ๋ฐ๋ผํ๋๋ฐ, ๊ณ์ ์ค๋ฅ๊ฐ ๋์ ๋ช์๊ฐ์ ๋ ๋ฆฐ ๊ฒ ๊ฐ๋ค ใ
ใ
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์น๋ค ์ค์นํ๋๋ฐ ๊ณ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ค๊ณ ์ค๋ฅ๊ฐ ๋ฌ๋ค..
์์ธ์,, ํ์ด์ฌ ๋ฒ์ ๊ณผ ๊ฐ์ํ๊ฒฝ์ผ๋ก ์์ฑํ ํ์ด์ฌ ๋ฒ์ ์ด ๋ฌ๋ผ์ ์ถฉ๋์ด ์์๋ ๊ฒ ๊ฐ๋ค ๐
์น ๋ค ์ง์ฐ๊ณ , ๊ฐ์ํ๊ฒฝ ์ค์ ์ ํ์ด์ฌ ๋ฒ์ ์ง์ ํด์ ๋ค์ ์์ํ๋ค!
์๋ ํ์ธ์ ์ข์์๋ฃ ๊ฐ์ฌํฉ๋๋ค! ๊ทธ๋ฐ๋ฐ from selenuim import webdriver์์ selenium์ธ๋ฐ ์คํ๊ฐ ์์ด์.. ๋ง์๋๋ฆฝ๋๋ค