์ด๋ฒ์ ๋ด๊ฐ ํ๋๊ฑด ์ง์ง ์ฐ ์น ํฌ๋กค๋ง์ ์๋๋ค. ๊ทธ์ ๊ธ์ด์ค๋๊ฑธ ๋ฐ๋ผํด๋ณด๋๊ฒ์ด์ง..
์๋ฐ์ ํ๋ฒ ๊ฒ๋ง ํฅ์๋ณด๋....์์ด๋๊น?ใ ๊ทธ๋ฐ๋ฐ..ํ๋ค๊ฐ ์ค๋ฐ์ ๊นจ๋ฌ์ ์ฌ์ค... ๋๋ ์ด๋ฏธ ๊ฒฝํ์๋ค(?)
๋ ธ๋ง๋์ฝ๋ ์น์คํฌ๋ฆฌํผ ๋ง๋ค๊ธฐ
๊ทผ๋ฐ ์ด๊ฑฐ ๋ค์๋จ๊ณ์์ 2์ผ ๐๊ณ ์ํจ
์๋ํ ๋ด(bot)์ธ ์น ํฌ๋กค๋ฌ(web crawler)๊ฐ ์กฐ์ง์ , ์๋ํ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ๋ณต์ ๊ฐ์ ์น ํ์ด์ง๋ฅผ ๋ธ๋ผ์ฐ์ง ํ๋ ํ์
์ค๋๋ ๋ฐ์ดํฐ์ฌ์ด์ธ์ค์ ๋จธ์ ๋ฌ๋์ด ๋๋ํ๋ฉฐ ๋น
๋ฐ์ดํฐ๊ฐ ์ค์์ฑ์ด ๋๋๋์๊ณ , ์ด๋ฅผ ์ํด ์ธํฐ๋ท์์ ์ ๋ณด๋ฅผ ๊ธ์ด์ค๋ ํฌ๋กค๋ง์ด ๋ง์ด ์ฌ์ฉ๋๊ณ ์๋ค. (๋ฌผ๋ก ๊ฐ์ธ์ ์ธ ํธ์์ฑ๊ณผ, ์๋น์ค๋ฅผ ์ํด์๋ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ๋ง๋ค)
ํ์ด์ฌ์ด ํฌ๋กค๋ง์ผ๋ก ๊ฐ์ฅ ์ ๋ช
ํ๋ค๋๋ฐ, ์ค์ ๋ก ๋ค๋ฅธ ์ธ์ด์์๋ ํฌ๋กค๋ง์ ๊ฐ๋ฅํจ(๊ฒ์์ ๊น์ง ํ์ด์ฌ๋ง ๋๋์ค ์์๋ค)
์ธํฐ๋ท์ ํตํด ํฌ๋กค๋ง์ ๊ฒ์ํ๋ค๋ณด๋ฉด ์น ์คํฌ๋ํ
์ด๋ผ๋ ๋น์ทํ ๊ฐ๋
์ด ๋์ค๋ ์ด์ ๋์จ๊น์ ํ๋ฒ ์ ๋ฆฌ๋ฅผ ํด๋์
์น ์คํฌ๋ํ(scraping) : ์น์ฌ์ดํธ ์์์ ์ํ๋ ๋ถ๋ถ์ ์์นํ ์ ๋ณด๋ฅผ ์ปดํจํฐ๋ก ํ์ฌ๊ธ ์๋์ผ๋ก ์ถ์ถํด ์์งํ๋ ๊ธฐ์ . ๋ณธ์ธ์ด ์ํ๋ ํํ๋ก ๊ฐ๊ณตํ๋๊ฒ.
~ํฌ๋กค๋ง๋ ์ผ์ข ์ ์คํฌ๋ํ๊ธฐ์ ์ด๋ผ ๋ณผ ์ ์๋ค.~
์์์๋ ๋งํ์ง๋ง, ๋ง์ด์ผ ์นํฌ๋กค๋ง์ด์ง
์ ๋ฐ์ ธ๋ณด๋ฉด ์น ์คํฌ๋ํ์ด๋ค... ํฌ๊ด์ ์ผ๋ก ํํํ์ฌ ํฌ๋กค๋ง์ด๋ผ๊ณ ํ๋๊ฒ์ผ๋ฟ
๊ทธ๋๋ ๊ทธ๊ฒ ์ด๋๋ ์ด์ 3์ฃผ์ฐจ์ธ๋ฐ..!!!
์ค์ง์ ์ธ ์นํฌ๋กค๋ง์ ๊ตฌ์กฐ๋ ์๋์ ๊ฐ๋ค๊ทธ๋ฅ๋ด๋ ๊ฒ๋ด ์ด๋ ค์ฐ๋.. ์ผ๋จ ๋๋ ์กฐ์ฉํ ๋ณด๊ธฐ๋งํ๊ณ ๋์ด๊ฐ๋ค
์ ์๊ถ๋ฒ๊ณผ ์ง์ ์ฌ์ฐ์ ๋ํ ์ค์์ฑ์ด ์ฆ๊ฐํ ํ๋์ฌํ์์, ๋๊ตฐ๊ฐ๊ฐ ์ด~์ฌํ ๋ง๋ ์๋ฃ๋ฅผ ์ฐ์ต์ฉ์ผ๋ก ์ฌ์ฉํ๋๊ฒ ๊ฐ๋ฅํ ๊น? ์ฌ์ดํธ์ฃผ์์ /robots.txt
๋ฅผ ์ณ๋ณด์.
์ฌ์ดํธ๋ณ๋ก ์๊ธฐ๋ค์ด ์ ํด๋ ๋ฃฐ, ์ด๋๊น์ง ์ฐ์ธ์~๊ฐ ์น์ ํ ๊ธฐ๋ก๋์ด์๋ค.
[P.S]์ฐพ์๋ณด๋ ๊ถ๊ณ ์ฌํญ์ด๋ผ ์ฌ์ดํธ๋ณ๋ก robots.txt๊ฐ ์๋ ๊ณณ๋ ์๋ค. ๊ทธ๋ฌ๋ ๋ค๋ฅธ์ฌ๋์ ์ง์ ์ฌ์ฐ๊ถ์ ์ฌ์ฉํ๋๊ฑฐ๋ ๋ฌด์กฐ๊ฑด ํ๋ฒ ๋ก๋ด์ ๋ฃ์ด๋ณด๋๊ฑธ ๊ถ์ฅ
(์ฌ์ฉ ์์ : https://www.nike.com/robots.txt)
์ด๋ ๊ฒ ์ด์คํฐ์๊ทธ์ฒ๋ผ ํํํ ๊ณณ๋ ์๋ค (์ถ์ฒ Nike)
๋ ธ๋ง๋์ฝ๋์ ๋์ฝ๋ผ์ค๊ฐ ์ธ์น๋ '๋ทฐ๋ฆฌํ ์ฉ~'์ผ๋ก ์ต์ํด์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ
HTML, XML ํ์ผ์ ์ ๋ณด๋ฅผ ์ถ์ถํด๋ด๋ python ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ์ฌ์ฉํ๊ธฐ ๋งค์ฐ ์ฝ๊ณ , ์ฌํํ๋ค๋ ์ฅ์ ์ด ์์ผ๋, ์๋ฒ์์ HTML์ ๋ค์ด๋ก๋ ๋ฐ๊ธฐ๋๋ฌธ์, ์๋ฒ์ฌ์ด๋๋ ๋๋ง์ ์ฌ์ฉํ์ง ์๋ SPA ์ฌ์ดํธ๋, javascript ๋ ๋๋ง์ ํ์๋กํ๋ ์ฌ์ดํธ๋ค์ ์๋นํ ๊น๋ค๋ก์ด ํธ
์ด๊ฑฐ ์ ๋ ๋์์ด๋ผ๊ณ ๋ชป์ฝ๋ ๋ฐ๋ณด->๋ฐ๋ก '๋'
(์ด์ ๋ ์ ์ฝ์)
Selenium์ย ์น ์๋ํ ํ ์คํธ (๋ฒํผ ํด๋ฆญ, ์คํฌ๋กค ์กฐ์ ๋ฑ๋ฑ)์ ์ฌ์ฉ๋๋ ํ๋ ์์ํฌ์ด๋ค. ์น ํ์ด์ง์์ javascript๋ฅผ ํตํด ๋์ ์ผ๋ก ์์ฑ๋๋ ๋ฐ์ดํฐ๋ค์ ์์ฝ๊ฒ ๊ฐ์ ธ์ฌ ์ ์๋ค.
์คํ๋ฒ ์ค ์ฝ๋ฆฌ์์์ ๋ชจ๋ ์๋ฃ์ ์ ๋ชฉ๊ณผ ์ด๋ฏธ์ง๋ฅผ ํฌ๋กค๋งํด์ csv๋ก ์ ์ฅํด๋ณด๊ธฐ
CSV์ ๋ํด์
์ฐธ๊ณ ํ ์คํ๋ฒ
์ค์ฌ์ดํธ
์ด๋ฒ ์ฐ์ต์ ์ด๋ฏธ ์ฌ์ ์ ์ฝ๋๋ฅผ ๋ค ์๋ ค์ฃผ์
จ๊ณ , ํฌ๋กค๋ง์ด๋ผ๊ธฐ๋ณด๋ค ๊ทธ๋ฅ ํ๋ฆ์ ์ดํดํ๋ ์์ค์ด์๋ค๊ณ ์๊ฐํ๋ค. ๊ทธ๋์ ๊ทธ๋ฅ ๊ฒฐ๊ณผ ์ฝ๋๋ง ๊ธฐ์ ํ๋๋ก ํ๊ฒ ๋ค
#ํ์ํ ์ ๋ค import
import csv
import time
from bs4 import BeautifulSoup
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
#csvํ์ผ ์์ฑํด์ ์ค์ ์ด๋ฆ์ stabucks.csv
csv_name = "starbucks.csv"
#csv์ด์ด๋ณธ๋ค
csv_open = open(csv_name, "w+", encoding = "utf-8")
csv_writer = csv.writer(csv_open)
csv_writer.writerow(('category','name','image_url'))
#ํฌ๋กฌ์ ์ด๊ฒ ํ๊ฒ ๋ค
driver = webdriver.Chrome(ChromeDriverManager().install())
#๊ฐ์ ธ์ค๋ ํ์ด์ง
org_crawling_url = "https://www.starbucks.co.kr/menu/drink_list.do"
driver.get("https://www.starbucks.co.kr/menu/drink_list.do")
#๊ฐ์ ธ์ค๋ ํ์ด์ง์ ์ ์ฒด ์์ค๋ฅผ ๊ฐ์ ธ์๋ผ~
full_html = driver.page_source
#์ ์ฒด์์ค๋ฅผ ํ์ด์ฌ์ด html์ ์์๋ณผ ์ ์๊ฒ ํ์
soup = BeautifulSoup(full_html, 'html.parser')
#๋ถ๋ฌ์ค๋๋ฐ 3์ด์ ๋ ๊ธฐ๋ค๋ ค์ฃผ์
time.sleep(3)
#์ ์ฒด์์ ๋ด๊ฐ ๊ฐ์ ธ์ฌ ์นดํ
๊ณ ๋ฆฌ์ ๊ทธ ํ๊ทธ๋ฅผ ์ฐพ์์ฃผ์
categories = soup.select('#mCSB_1_container > li > label')
#๊ทธ ์นดํ
๊ณ ๋ฆฌ๋ฅผ ์ฌ๋ฌ๊ฐ ๋ฐ๋ณตํ๊ธฐ์ํ for๋ฌธ
for i in range(2,len(categories)+1):
#์นดํ
๊ณ ๋ฆฌ ๋๋ฆฌ๋๊ฑฐ 2,3,4,5,6์
element = driver.find_element_by_css_selector(f'#mCSB_1_container > li:nth-child({i}) > label')
category_name = element.text
time.sleep(2)
element.click()
#ํํ์ด์ง์์ ์ ์ฒด ์์ค ๊ฐ์ ธ์ค๊ณ ๊ฑฐ๊ธฐ์ html๊ธ์ด์!
full_html = driver.page_source
soup = BeautifulSoup(full_html, 'html.parser')
#๊ฐ ์นดํ
๊ณ ๋ฆฌ๋ 2์ฉ ๋์ด๋๋๋ฐ,
titles = soup.select(f'#container > div.content > div.product_result_wrap.product_result_wrap01 > div > dl > dd:nth- child(2) > div.product_list > dl > dd:nth-child({i*2-2}) > ul > li > dl > dt > a > img')
print(titles)
for i, title in enumerate(titles):
#print('name: ',title['alt'])
#print('image_url: ',title['src'].split('/')[4:])
url = title['src']
print(url)
if i == 0:
csv_writer.writerow((category_name,title['alt'],url))
else:
csv_writer.writerow(('',title['alt'],url))
์ด๋ฒ๊ฑด ์์งํ ์์ฝ๋์์ ๋ค ๋ ๋จน์ฌ์ค๊ฑฐ๋ผ..(์ฌ์ ์ ์ฝ๋๋ฅผ ์๋ ค์ฃผ์ฌ)
๋จ์ง ๊ณ์ ๊ณ ์ํ๋ ๋ถ๋ถ์
BeautifulSoup๊ฐ Javascript๋ฅผ ์ธ์ํ์ง ๋ชปํ๋ค๋์ ์ ์ฌ์ ์ ์ธ์ํ์ง ๋ชปํ๊ณ
BeautifulSoup๋ง importํด์ ์ฐ๋ค๊ฐ ๋ค๋ฆ๊ฒ ๋ค๋ฅธ๋๊ธฐ๋ถ์ด ์๋ ค์ฃผ์ ๊ฑฐ์๋ค..ใ
..
๊ทธ๋ฆฌ๊ณ ์๋ฆฌ๋ฅผ ์ดํดํ๋๋ฐ ์ฌ์ดํธ์์ ์๋ง๋ ํ๊ทธ๋ฅผ ์ฐพ์๋ด๋๊ฒ๋..ใ
ํ ๋ค๋ค์ฏ์๊ฐ ๊ณ ์ํ๋ฏใ
ใ
์ด๋ฒ ๊ณผ์ ๋ ์.. ๋ด๊ฐ ๋
ธ๋ ฅํ๊ฒ๋ณด๋ค ๋ค๋ฅธ๋ถ๋ค์ด ๋์์ฃผ์ ๊ฒ ์ปค์ ์ข ์์ฌ์ด ๊ณผ์ ์๋ค.
(๊ทธ๋๋ ์ดํด๋ ํ๊ณ ์์ผ๋ ๋ค์๋ฒ์ ํ๋ฒ๋ ํผ์์ ํด๋ด์ผ๊ฒ ๋ค. ํ ๊ฒ ์์ด๋์ค)