๋ฐ์ดํฐ ๋ถ์์ ๊ฝ๐ป ํฌ๋กค๋ง(crawling)โญ
- ์น์์ ์ํ๋ ์๋ฃ๋ฅผ ์ปดํจํฐ์๊ฒ ์์งํด์ค๋๋ก ํ๋ ๊ธฐ์
- requests ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ ๋ธ๋ผ์ฐ์ ์๋ ํฌ๋กค๋ง
- selenium ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ ๋ฌผ๋ฆฌ ๋๋ผ์ด๋ฒ ํฌ๋กค๋ง
- urllib ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ api ํฌ๋กค๋ง ๋ฑ์ด ์๋ค.
- ํฌ๋กค๋ฌ์ ์ญํ ์ ์ํ๋ ์ ๋ณด๋ฅผ ํฌํจํ ์๋ฃ๋ฅผ ์์งํด์ค๋ ๊ฒ๊น์ง์ด๋ฉฐ
- ์ค์ ๋ก ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฉ๋์ ๋ง๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ์ beautifulsoup๊ฐ ๋ด๋นํ๋ค.
๋จผ์ ์คํํ๊ธฐ ์ํด์ ๋ช ๊ฐ์ง ๋จ๊ณ๋ฅผ ์งํํด์ฃผ์ด์ผ ํ๋ค.
ํด๋ฐ๋ค๋ ๊ณง ์๋ก์ด ๋ ธํธ๋ถ์ ์ฅ๋งํ๊ธฐ ๋๋ฌธ์
chapter1. selenium ์ค์น๐จ๐ป
- anaconda navigator์์ ์ข์ธก envionments๋ฅผ ์ ํํฉ๋๋ค.
- ์ค๊ฐ์ base(root) ์ฐ์ธก์ ๋ถ์ด์๋ ์ฌ์ ๋ฒํผ ํด๋ฆญ -> open terminal์ ์ ํํฉ๋๋ค.
- ์ด๋ฆฌ๋ cmd์ฐฝ์์ pip install selenium์ ์ ๋ ฅํฉ๋๋ค.
- ํฌ๋กค๋ง ์์
์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํฌํธ
from bs4 import BeautifulSoup
from selenium import webdriver
import requests
- ์ฝ๋ ์งํ ์ง์ฐ์ ์ํ time ์ํฌํธ
import time
- 2022๋ ๋ 7์ ์ดํ selenium ์ ๋ฐ์ดํธ๋ก ์ธํ xpath ์ถ์ ์ ์ํฌํธ
from selenium.webdriver.common.by import By
chapter 2. ํฌ๋กฌ ๋๋ผ์ด๋ฒ ๋ค์ด๋ก๋ํ๊ธฐ๐จ๐ป
- ํฌ๋กฌ ์ฐฝ ์ฐ์ธก ์๋จ ๋ฉ๋ด ํด๋ฆญ
- ๋ฐ์์ ๋ ๋ฒ์งธ์ ์๋ "๋์๋ง" ํญ๋ชฉ์ ๋ง์ฐ์ค ๊ฐ๋ค ๋๊ธฐ
- Chrome์ ๋ณด ํด๋ฆญํ๊ธฐ
- Chrome์ ๋ณด์ ๋์จ ๋ฒ์ (๊ฐ์ฌ ์ปดํจํฐ๋ ํ์ฌ ํฌ๋กฌ 101 ๋ฒ์ ์ฌ์ฉ ์ค) ํ์ธํ๊ธฐ
- https://chromedriver.chromium.org/downloads ์ ์ฃผ์๋ก ์ ์ํด์ ๋ฒ์ ์ ๋ง๋ ๋ค์ด๋ก๋ ๋งํฌ๋ก ๊ฐ๊ธฐ
- chromedriver zip ํ์ผ ๋ฐ์์ ๋ด๋ถ chromedriver.exeํ์ผ์ ๋ํ ์์ถ์ ์ฃผํผํฐ ๋ ธํธ๋ถ ์ฝ๋๊ฐ ์๋ ์ชฝ์ ํ๊ธฐ (window -> win32, ๋ฆฌ๋ ์ค ๋งฅ ๋ฑ์ ๋ง๋ ๋ฒ์ ์ผ๋ก)
- driver๋ผ๋ ๋ณ์๋ฅผ ์ด์ฉํด ๋ฌผ๋ฆฌ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ ์ดํฉ๋๋ค.
driver = webdriver.Chrome('chromedriver') ์ ๋ ฅ ํ - driver.get("https://"๋ค์ด๊ฐ๊ณ ์ถ์ ์ฌ์ดํธ ์ฃผ์") ์ฝ๋๋ฅผ ์ ๋ ฅํด๋ณด์ ์ ์คํ๋๋ค๋ฉด ์ฑ๊ณตโโ๐
chapter 3. ๋ณธ๊ฒฉ์ ์ธ ์คํ๐จ๐ป
- ๐time.sleep(์ง์ฐ์๊ฐ(์ด)) ์ ๋ ฅ ์ ํด๋น ์๊ฐ๋งํผ ์ฝ๋ ์คํ์ด ์ง์ฐ๋ฉ๋๋ค. ๋๋ ์ด ๋ฃ๊ธฐ
- ๐.get(์ ์์ฃผ์)๋ฅผ ์ ๋ ฅํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ํด๋น ์ฃผ์๋ก ์ ์ํฉ๋๋ค.
- ๐xpath์ ๋ค์ํ ์ฝ๋ ์กฐํฉ์ ์คํ์ํค๋ฉด ๋ง์ ๋์ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค!
โ driver.find_element(By.XPATH, 'xpath์นดํผ ๊ฐ').click()์ ์คํํ๋ฉด ํด๋ฆญ๋์
- ๐ํค ์ ๋ ฅ์ .send_keys('์ ์ก๋ฌธ์์ด') ์ ์ ๋ ฅํด์ค๋๋ค.
- ๐๋ธ๋ผ์ฐ์ ๋ฅผ ๋ค ์ฐ๋ฉด ๋ซ์์ค์ผ ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ์ด ๋ฉ๋๋ค.
โ
driver.close()
ํน์ url๋ก ์ ๊ทผํ์๋ ๋ฐ๋ก ์ํ๋ ์ ๋ณด๋ฅผ ์ป์ ์ ์๋ ๊ฒฝ์ฐ
- ๊ทธ๋ฅ ๋ฐ๋ก ์ ๊ทผํ๋ฉด ๋จ(๊ตณ์ด ๋ณต์กํ๊ฒ ๊ฒ์ํ๊ณ ๋์จ ๊ฒฐ๊ณผ๋ฅผ ์ด์ฉ๊ณ ... ํ ํ์ ์์)
- ๊ทธ๋ฌ๋ ํ์ด์ค๋ถ ๊ฐ์ด ํน์ ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ์ถ๊ฐ์ ์ธ ์๋ฃ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ฌ์ดํธ๋ ์๊ณ
- ๋ก๊ทธ์ธํด์ผ๋ง ์๋ฃ์ ์ ๊ทผํ ์ ์๋ ์ฌ์ดํธ๋ ์๊ธฐ ๋๋ฌธ์
- ์ด๋ป๊ฒ ์ ๊ทผํด์ผ ์ํ๋ ์๋ฃ๋ฅผ ์ป์ด์ฌ ์ ์๋์ง๋ ์ ์คํ๊ฒ ๊ณ ๋ คํด์ผํจ
- - ๋ธ๋ผ์ฐ์ ๊ฐ ํน์ ํ์ด์ง์ ์ ๊ทผํ์๋, ํด๋น ํ์ด์ง ์์ค์ฝ๋ ์ ์ฒด ๊ธ์ด์ค๊ธฐ
- ์ฌ๊ธฐ๊น์ง๊ฐ ์ ๋ ๋์์ ์ญํ ์. ๊ฐ์ ธ์จ ์์ค์ฝ๋๋ ๋ทฐํฐํ์ํ๋ก ์ ์ ํจ
- driver.page_source๋ source ๋ณ์์ ์ ์ฒด ํ์ด์ง ์์ค๋ฅผ ๋ฌธ์๋ก ์ ์ฅํจ
source = driver.page_source
print(type(source))
print(source)
ํ์ฑ ํ์ฉ
- BeautifulSoup(์์ค์ฝ๋, "html.parser") ๋ก ์ ๋ ฅ์ ํด๋น ์ฝ๋๋ฅผ html ํ์์ผ๋ก ์ธ์ํจ.
- ํด๋น str(๋ฌธ์์ด) ์๋ฃ๋ฅผ htmlํ์์ผ๋ก ์ธ์์ํค๋๊ฒ์ "ํ์ฑ" ์ด๋ผ๊ณ ํฉ๋๋ค.
- ์ฑ ์ ์์ ํ๊ณ ์๋ค๊ณ ๊ทธ ์ฑ ์ ๋ํด ๋ฐ๋์ ์ดํดํ๊ณ ์๋๊ฑด ์๋๋ฏ ์ฑ ๋ด์ฉ์ ์ฝ์ด์ ์ดํดํ๊ณ
- ์ง์์ ๊ตฌ์กฐํํด์ผ ๋น๋ก์ ์ฑ ์ ์ดํดํ๊ณ ์๋ค๊ณ ํ ์ ์๋๋ฐ
- ๋ทฐํฐํ์ํ๋ ์์ค์ฝ๋๊ฐ ๋จ์ ๋ฌธ์๋ก ์กด์ฌํ ๋๋ ๊ธฐ๋ฅ์ ์ธ ์ ์์ง๋ง
- ํ์ฑ์ ํตํด ์์ค์ฝ๋ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ฉด ์ ์ ๋ฅผ ๋งค์ฐ ๋น ๋ฅด๊ณ ์ฝ๊ฒ ์ฒ๋ฆฌํด์ค๋๋ค.
parsed_source = BeautifulSoup(source, "html.parser")
print(type(parsed_source))
print(type(source)) - ํน์ ํ ๊ฐ๋ง ๊ฐ์ ธ์ค๊ธฐ
- ํ์ฑ๋์ฝ๋.find_all("ํ๊ทธ๋ช ", class_="ํด๋์ค๋ช ", id="์์ด๋๋ช ")
- ์
๋ ฅ์ ํด๋น ํ๊ทธ๋ ํด๋์ค์ ๋ํ ๋ฐ์ดํฐ๋ง ๊ฐ์ ธ์ฌ ์ ์์
- span_title_list = parsed_source.find_all("์๋ฆฌ๊ฐ", class_="์๋ฆฌ๊ฐ")
- span_title_list
- ๊ธฐ๋ณธ์ ์ผ๋ก .find_all()๋ก ์ป์ด์จ ํ๊ทธ ์์๋ค์ 0๊ฐ๊ฐ ์กํ๋
1๊ฐ๊ฐ ์กํ๋ , 2๊ฐ ์ด์์ด ์กํ๋ ๋ฌด์กฐ๊ฑด ๋ฆฌ์คํธ ํ์์ผ๋ก ๋ฆฌํด๋ฉ๋๋ค.
๋ด๋ถ ์๋ฃ๋ค์ ํธ๋ค๋งํ๊ณ ์ถ๋ค๋ฉด, ํ๋ํ๋ ์ธ๋ฑ์ฑ ๋ฑ์ผ๋ก ๋์ง์ด๋ด์ผ ํฉ๋๋ค.
ํ๊ทธ ์์ "ํ๋" ์ ๋ํด์ .text ๋ฅผ ๋ถ์ด๋ฉด ํ๊ทธ๊ฐ ์ ๊ฑฐ๋ ๋ฌธ์ฅ์ด ๋์ต๋๋ค.
์๋ฆฌ๊ฐ_์๋ฆฌ๊ฐ_list[]
๋ฐ๋ณต๋ฌธ ์์
๋ฐ๋ณต๋ฌธ์ ์ด์ฉํด์ span_title_list ๋ด๋ถ์ ํ๊ทธ ์์๋ค์
์ ๋ถ ํ๊ทธ๋ฅผ ์ ๊ฑฐํ๊ณ print()๋ก ์ฐ์ด์ฃผ์ธ์.
"์ฑ
์ ๋ชฉ๋ง ๊ฐ์ ธ์ค๊ธฐ" ํ๊ทธ์ ๊ฑฐ = .text
title_list = []
# span_title_list๊ฐ "๋ฆฌ์คํธ"์ด๊ณ
# ๋ฆฌ์คํธ ๋ด๋ถ ์์๋ฅผ ํ๋ํ๋ ๋ฐ๋ณตํด์ span_title์ ๋์
ํด์ฃผ๊ธฐ ๋๋ฌธ์
for span_title in span_title_list:
# ๋ด๋ถ ์์ ํ๋ํ๋๊ฐ ๊ฐ๋ณ์ ์ผ๋ก ์๋ํ๋ span_title์ .text๋ฅผ ๊ฑธ์ด์ผ ํฉ๋๋ค.
print(span_title.text)
title_list.append(span_title.text)
๐codecs ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ํ์ด์ฌ 3.5๋ฒ์ ๋ค์ด์ ๋ด์ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ฐ๋(์์ ์๋ pip๋ก ์ค์นํด์ผ ํ์์)
- ํ์ด์ฌ์ผ๋ก ํ ์คํธํ์ผ์ ์ ์ดํ ์ ์๋๋ก(์ฝ์ด์ค๊ธฐ, ์ฐ๊ธฐ) ๋์์ค
- ๐์ฝ์์ฐฝ์ ์ถ๋ ฅ๋ ๋ด์ฉ์ txtํ์ผ๋ก ์ฎ๊ฒจ์ ์ถ๋ ฅํ ๋ ์ฌ์ฉ๐
- ํน์ด์ฌํญ
โ๊ฐํ์ \r\n์ผ๋ก ์ฒ๋ฆฌํจโ- mode => w(๊ธฐ์กด์ ์๋ ์๋ฃ ์์ ๊ณ ์ ํ์ผ ์ ๋ ฅ)
- mode => a(๊ธฐ์กด์ ์๋ ์๋ฃ์ ์ด์ด์ ๊ณ์ ์ ๋ ฅ)
- mode => r(ํ ์คํธํ์ผ์ ์๋ ๋ด์ฉ ์ฝ์ด์ค๊ธฐ)
- โ
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํฌํธ
import codecs - โ
f ๋ณ์๊ฐ ํ
์คํธํ์ผ ๊ทธ ์์ฒด์ฒ๋ผ ์ฌ์ฉํจ
.open(ํ์ผ๊ฒฝ๋ก(ํ์ผ์ด ์กด์ฌํ์ง ์์ผ๋ฉด ์ ํ ์คํธ ํ์ผ ์์ฑ),
encoding="์ธ์ฝ๋ฉ๋ฐฉ์", mode="๋ชจ๋")
f = codecs.open("C:/Users/Playdata/crawler/test.txt", mode="a") - โ
.write("์ ์๋ด์ฉ") ์ ์คํํ๋ฉด ํ
์คํธํ์ผ ๋ด๋ถ์ ์์ฑ์ด ๋ฉ๋๋ค.
"Hello world"๋ฅผ 10๋ฒ ์์ฑํด์ฃผ์ธ์
for i in range(10):
f.write("Hello world\n")
โ ๋ฐ๋์ ์ข ๋ฃ๋ฅผ ํด์ฃผ์ ์ผ ํฉ๋๋ค.
f.close()
์ ์ฅ๋ result.txt์ ๋ด์ฉ์ ์ ์์ ์ฝ์ด์ค๊ธฐ
โฉ f = codecs.open("c:/users/playdata/crawler/result.txt", mode="r")
print(f.readlines())
์ข
๋ฃ f.close()
๐คข์ค๋์ ๊ณ ๋(difficulty)๐คข
์ํ ํฌ๋กค๋ฌ
- ๊ฐ์ ์์์ ํ์ด์ง๋ฅผ ์ํํ๋ฉด์ ์๋ฃ๋ฅผ ์์งํด์ค๋ ํฌ๋กค๋ฌ
- ์ ํ์ด์ง ํฌ๋กค๋ฌ๋ฅผ ์ ์ํ ๋ค์, ์์ฑ๋ ํฌ๋กค๋ฌ๋ฅผ ๋ฐ๋ณต๋ฌธ์ ๋ฃ์ด์ ๋ง๋ ๋ค.
- ๋ฐ๋ณต์ ์ด๋๋ถํฐ ๋๋ฆด์ง์ ๋ํ ํ์
์ด ์ ์ผ ์ค์ํ๋ค.
์ํ์ ์ฐ์ ์์ ๊ฒฐ์ ๋ฐฉ๋ฒ
์ํ์ ์ฐ์ ์์ ๊ฒฐ์ ๋ฐฉ๋ฒ์๋ ์ฃผ๋ก ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ ๋ค์ ์์ต๋๋ค. ์ด๋ค ๋ฐฉ๋ฒ๋ ๋จ๋ ์ผ๋ก ์ด์ฉ๋์ง๋ ์๊ณ , ๊ฒ์์์ง๋ง๋ค ๊ฐ๊ฐ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ๊ณ ๋๋ก ์กฐํฉ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
ํ์ด์ง ์ด๋ ํ์
๊ธฐ์ ์ผ๋ก ํ๋ ์นํ์ด์ง๋ก๋ถํฐ์ ์ด๋ ํ์(ํ์ด์ง๋ฅผ ์ด๋ํ๋ ํ์)๋ฅผ ์ ํด๋๊ณ , ์ง์ ๋ ํ์๋งํผ ๋งํฌ๋ฅผ ๋ฐ๋ผ๊ฐ ์์ ์์ ํฌ๋กค๋ง์ ์ข ๋ฃํ๋ ๋ฐฉ์์ ๋๋ค. ๊ฐ์ ์น ํ์ด์ง๋ฅผ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณตํด์ ๋ฐ๋ผ๊ฐ ์ ์์ด๋, ์์ฐจ๋ก์ ๋ฐ๋ณต์ผ๋ก ํฌ๋กค๋ง์ ๋ง์น ์ ์์ด์ ๋ฌดํ ๋ฃจํ์ ๋น ์ง ๊ฐ๋ฅ์ฑ์ด ์์ด์ง๋๋ค.
๋น๋ฆฌ์คํธ ๋ง๋ค์ด์ ๊ฐ ์ ๋ฌํด์ฃผ๊ธฐ
1. nํ์ด์ง ์ ๊ทผ
driver.find_element(By.XPATH," ~~์ฃผ์~~")
2. ์์ค์ฝ๋ ๊ธ์ด์ค๊ธฐ
source = driver.page_source
3. ํ์ฑ
parsed_source = BeautifulSoup(source, "html.parser")
4. ์ํ๋ ๋ฐ์ดํฐ ์ถ์ถ
5. ๋น๋ฆฌ์คํธ ๋ง๋ค์ด์ ๊ฐ ์ ๋ฌํด์ฃผ๊ธฐ
6. ์ ๋ฌ์ด ๋๋ ๋ฆฌ์คํธ๋ค์ for in ์ ํ์ฉํ์ฌ ํ์ถ
๐ฃ์ค๋์ ํ์คํ(comment)๐ฃ
์๋ ํ์ธ์ ํด๋ฐ๋ค์ ๋๋ค๐ค ์๋ก์ด ๊ณผ์ ์ธ ํฌ๋กค๋ง์ ์ฒ์ ์์ํ์ต๋๋ค ๋ณธ๊ฒฉ์ ์ธ
๋ฐ์ดํฐ ์ถ์ถ ๊ด๋ จ ๊ณผ์ ์ ์ ๋ฌธํ๊ฑฐ๊ฐ์์ ๊ทธ๋ฐ์ง ๋๋ฌด ์ฌ๋ฏธ์์์ต๋๋ค. ํ์ง๋ง
๊ทธ ์ ๋จ๊ณ์ธ ํ์ด์ฌ ๊ธฐ์ด๋ฅผ ์ตํ์ง ์์๋ค๋ฉด ํฌ๋กค๋ง์ ์ ๊ทผ์กฐ์ฐจ ํ ์ ์์๊ฒ ์ฃ โ
ํญ์ ์ด์ฉํ๋ ์ฌ์ดํธ์์ ๊ฐ์ ์ถ์ถํด๋ด๋๊ฒ์
๋ ์๋กญ๊ณ (์ ๋ง ์ฌ์ดํธ๋ง๋ค ์ฝ๋๊ฐ ๋ค๋ฆ ๋๋ค) ์ง๋ฆฟํฉ๋๋ค ์ฌ๋ฌ๊ฐ์ง ๋์๋ค์
์ปดํจํฐ์๊ฒ ๋ช ๋ นํ์ฌ ์คํ ์ํค๋ ๊ฒ์ ์คํ์์ผ๋ณด๋ ์ด์ ์ผ ํ๋ก๊ทธ๋จ๋ค์ด ์ด๋ค์์ผ๋ก
๋์์ ํ๋์ง ์ดํด๊ฐ ์กฐ๊ธ์ ๊ฐ๋๋ค. ๊ฐ์ ์ ๋ง ์ถ์ถํ๊ธฐ ์ด๋ ค์ด ๋๊ด์ ๋ง์ฃผ์น ๋๋
๋จธ๋ฆฌ๊ฐ๐คฏ ๐ ์ด๋ ๊ฒ ๋์ง๋ง ๋์ค์ ์ด์ฐจํผ ๋ชจ๋ ์ฒ๋ฆฌํด์ผํ ๊ณผ์ ์ด๊ธฐ ๋๋ฌธ์
๋ฏธ๋ฆฌ ๋ฏธ๋ฆฌ ์ตํ๋๋ ค๊ณ ํฉ๋๋ค. ํฌ๋กค๋ง์ ์ ๋ง ํฅ๋ฏธ๋ก์ ์ด์ ์ค๋ ํฌ๋กค๋ง ๊ด๋ จ ์์ ๋
๋์ฌํ์ต๋๋ค. ๋ง๋ฅ ํฌ๋กค๋ง์ ํ ์ ์์๋๊น์ง ํ์ดํ ํ๊ฒ ์ต๋๋ค~ ์ด์์ ๋๋ค.
'ํ๋ฃจ๊ณต๋ถ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ 9์ฅ ๐ํ์ด์ฌ(python) ๊ตฌ์กฐ์ฒด์ ํด๋์ค๐ (0) | 2022.10.17 |
---|---|
์ 8์ฅ ๐ํฌ๋กค๋ง(crawling) ๊ณผ ๋คํธ์ํฌ์ ๊ธฐ๋ณธ ์๋ฆฌ๐ (0) | 2022.10.14 |
์ 6์ฅ ๐ํ์ด์ฌ ๊ธฐ์ด_ํจ์๐ (0) | 2022.10.12 |
์ 5์ฅ ๐ํ์ด์ฌ ๊ธฐ์ด_์ ์ด๋ฌธ๐ (2) | 2022.10.11 |
์ 4์ฅ ๐ํ์ด์ฌ ๊ธฐ์ด_์๋ฃํ(๋์ ๋๋ฆฌ)๐ (0) | 2022.10.07 |