๐Ÿ–ฑ๏ธํฌ๋กค๋ง(Crawling)์˜ ๊ธฐ์ดˆ

๊ถŒ๊ทœ๋ฆฌยท2023๋…„ 5์›” 24์ผ
0

Crawling

๋ชฉ๋ก ๋ณด๊ธฐ
1/7
post-thumbnail

์—ฌ๋Š” ๋ง

๋ฆฌ์•กํŠธ์™€ JS๋งŒ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋‹ˆ ์‚ฌ์ด๋“œ ์–ธ์–ด๋„ ํ•œ ๋ฒˆ ๊ณต๋ถ€ํ•ด๋ณด๊ณ  ์‹ถ์–ด์„œ Python์„ ๋ฐฐ์šฐ๊ธฐ ์‹œ์ž‘ํ•œ ์ด์œ ๋„ ์žˆ์ง€๋งŒ , ํ•ญ์ƒ ์ž๋™ ๋กœ๊ทธ์ธ์€ ์–ด๋–ป๊ฒŒ ๋˜๋Š”๊ฑฐ์ง€? ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•Œ์•„์„œ ์›€์ง์ผ ๋ฐฉ๋ฒ•์€ ์—†๋‚˜? ์ด๋Ÿฐ ์˜๋ฌธ์„ ํ’ˆ๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํฌ๋กค๋ง, ์ž๋™ํ™”์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๊ณ  ์‹ถ์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์‹œ์ž‘ํ•œ Python์œผ๋กœ ํฌ๋กค๋ง ํ•˜๊ธฐ ๐Ÿคž๐Ÿปโœจ

01. ํฌ๋กค๋ง์ด๋ž€?

  • ํฌ๋กค๋ง(Crawling) : ์›นํŽ˜์ด์ง€์˜ ๊ตฌ์กฐ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ
  • ํฌ๋กค๋Ÿฌ(crawler) : ํฌ๋กค๋งํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด

๊ทธ๋ ‡๋‹ค๋ฉด ํฌ๋กค๋ง์˜ ํ•„์š”์„ฑ์€ ๋ฌด์—‡์ผ๊นŒ?๐Ÿค”

์˜ˆ๋ฅผ๋“ค์–ด, ํœด๋Œ€ํฐ ์ผ€์ด์Šค๋ฅผ ๊ตฌ๋งคํ•˜๋ ค๋Š” ์ƒํ™ฉ์ด๋‹ค. ์ธํ„ฐ๋„ท์œผ๋กœ ์‚ฌ๊ณ ์‹ถ์€ ์ผ€์ด์Šค์˜ ๊ฐ€๊ฒฉ์„ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด "์ด๋ฆ„" , "๊ฐ€๊ฒฉ" , "๊ตฌ์ž…์ฒ˜ ๋งํฌ"๋ฅผ ์ •๋ฆฌ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์‚ฌ๊ณ ์‹ถ์€ ์ผ€์ด์Šค๊ฐ€ 30๊ฐœ์ธ๋ฐ .. ์ด ์ผ€์ด์Šค๋“ค์˜ ์ด๋ฆ„, ๊ฐ€๊ฒฉ, ๊ตฌ์ž…์ฒ˜ ๋งํฌ๋ฅผ ํ•œ ๋ฒˆ์— ๊ฐ€์ ธ์˜ฌ ๋ฐฉ๋ฒ•์€ ์—†์„๊นŒ? ํ•  ๋•Œ ํฌ๋กค๋ง์ด ํ•„์š”ํ•˜๋‹ค.


02. ํฌ๋กค๋ง์˜ ์ข…๋ฅ˜

๐Ÿ’พ ์ •์  ํฌ๋กค๋ง

  • ํ•œ ํŽ˜์ด์ง€ ์•ˆ์—์„œ ์›ํ•˜๋Š” ์ •๋ณด๊ฐ€ ๋ชจ๋‘ ๋“œ๋Ÿฌ๋‚˜๋Š” ์ •์  ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค
  • ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ : requests + BeautifulSoup
    ๊ธฐ์—…์˜ ์ฃผ์‹ ํ˜„์žฌ๊ฐ€ ๋“ฑ ์ฃผ์‹์ •๋ณด๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ๋„ค์ด๋ฒ„์˜ ์ฆ๊ถŒ ํŽ˜์ด์ง€๋ฅผ ๋ณด๋ฉด ํ•œ๋ฒˆ์— ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ์ด์™€๊ฐ™์ด ํ•œ ํŽ˜์ด์ง€ ์•ˆ์— ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ๋Š”๊ฒŒ ์ •์  ํฌ๋กค๋ง์ด๋‹ค.

๐Ÿ’พ ๋™์  ํฌ๋กค๋ง

  • ํŽ˜์ด์ง€ ์ด๋™์ด ์žˆ์–ด์•ผ ์ •๋ณด๊ฐ€ ๋“œ๋Ÿฌ๋‚˜๋Š” ๋™์  ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค
  • ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ : selenium
    ๋กœ๊ทธ์ธ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ๋จผ์ € ๋ˆŒ๋Ÿฌ์•ผ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€๋กœ ์ด๋™์„ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ ‡๊ฒŒ ํŽ˜์ด์ง€ ์ด๋™์ด ์žˆ์–ด์•ผ ์ •๋ณด๊ฐ€ ๋“œ๋Ÿฌ๋‚˜๋Š” ๋™์ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋™์  ํฌ๋กค๋ง์ด๋‹ค.

03. Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ž€?

  • ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ์„ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ

๐Ÿ› ๏ธ requests

  • HTTP ํ†ต์‹ ์„ ์œ„ํ•œ ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • HTTP ์š”์ฒญ์œผ๋กœ ์ง์ ‘ HTML๋ฅผ ๋‹ค์šด๋กœ๋“œ ๋ฐ›๋Š” ๋ฐฉ์‹
  • ๋™์  ์‚ฌ์ดํŠธ๋Š” ํฌ๋กค๋ง ํ•˜๊ธฐ ์–ด๋ ค์›€
import requests

response= requests.get("http://www.naver.com")
html= response.text
print(html)

์ด๋ ‡๊ฒŒ requests๋ฅผ ์ด์šฉํ•˜์—ฌ http://www.naver.com ์„ ๋ถˆ๋Ÿฌ์˜ค๋ฉด, ํ„ฐ๋ฏธ๋„์—๋Š” ๋„ค์ด๋ฒ„ ๋ฉ”์ธํŽ˜์ด์ง€ ์˜ html ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.


๐Ÿ› ๏ธ BeautifulSoup

  • HTML ๋ถ„์„์„ ์œ„ํ•œ ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • requests๋ฅผ ์ด์šฉํ•˜์—ฌ ํฌ๋กค๋งํ•œ ์›นํŽ˜์ด์ง€์—์„œ ์ •๋ณด๋ฅผ ์‰ฝ๊ฒŒ ์ถ”์ถœํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
import requests
from bs4 import BeautifulSoup

response= requests.get("https://www.naver.com")
html= response.text
soup = BeautifulSoup(html, "html.parser") 
word=soup.select_one("#topAsideArea")
print(word)

soup = BeautifulSoup(html, "html.parser") ๊ตฌ๋ฌธ์€ requests๋กœ ๋ถˆ๋Ÿฌ์˜จ html ์ฝ”๋“œ๊ฐ€ ๋ฌธ์ž์—ด์ด๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์‹ฑํ•˜๊ธฐ ์–ด๋ ค์›Œ์„œ "html.parser" ์ด๋ผ๋Š” html ๋ฒˆ์—ญ ์„ ์ƒ๋‹˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ค€ ํ›„, soup์— ๋‹ด๋Š”๋‹ค.

word=soup.select_one("#topAsideArea") ๊ตฌ๋ฌธ์—์„œ #topAsideArea ์€ ๋„ค์ด๋ฒ„ ๋ฉ”์ธํŽ˜์ด์ง€์˜ ๋ฉ”๋‰ด ๋ถ€๋ถ„ id๊ฐ’์ด๋‹ค. ์ € ๊ตฌ๋ฌธ์„ ํ†ตํ•ด id๊ฐ’์ด ์†ํ•œ html ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์™€์„œ ํ„ฐ๋ฏธ๋„์— ์ถœ๋ ฅ๋œ๋‹ค.


๐Ÿ› ๏ธ selenium

  • ์›น ์ž๋™ํ™”์— ์‚ฌ์šฉ๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ
  • ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‹ค์ œ๋กœ ๋„์›Œ์„œ ์‚ฌ๋žŒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options

#ํฌ๋กฌ ๋“œ๋ผ์ด๋ฒ„ ์ž๋™ ์—…๋ฐ์ดํŠธ
from webdriver_manager.chrome import ChromeDriverManager

# ๋ธŒ๋ผ์šฐ์ € ๊บผ์ง ๋ฐฉ์ง€
chrome_options = Options()
chrome_options.add_experimental_option("detach",True)

service = Service(executable_path=ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=chrome_options)
driver.get("https://www.naver.com")

์œ„ ์ฝ”๋“œ์˜ ์ฒ˜์Œ 4์ค„์€ selenium ๊ธฐ๋ณธ์„ค์ •์ด๋‹ค.

service = Service(executable_path=ChromeDriverManager().install()) , driver = webdriver.Chrome(service=service,options=chrome_options) ์€ ChromeDriverManager๋ฅผ ํ†ตํ•ด์„œ ํฌ๋กฌ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ž๋™์œผ๋กœ ์„ค์น˜ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

์ž๋™์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋„์šฐ๊ธฐ ์œ„ํ•˜์—ฌ ์ด๋ ‡๊ฒŒ driver.get("https://www.naver.com") ๋„์šธ ๋ธŒ๋ผ์šฐ์ €์˜ ์ฃผ์†Œ๋ฅผ ์ ์–ด์ค˜์•ผ ํ•œ๋‹ค.

๐Ÿšจ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œ์ผฐ์„ ๋•Œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž˜ ์‹คํ–‰๋˜๋Š”๊ฐ€ ์‹ถ๋‹ค๊ฐ€ ๊บผ์ ธ๋ฒ„๋ฆฌ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์ด ๋‘ ์ค„์„ ์‹คํ–‰ํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ € ๊บผ์ง ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. chrome_options = Options() , chrome_options.add_experimental_option("detach",True)

profile
๊ทค๊ทค ์ฝ”๋”ฉ

0๊ฐœ์˜ ๋Œ“๊ธ€