πŸ““ 9μž₯. μ›Ή 크둀러(Web Crawler) 섀계

onyΒ·2022λ…„ 12μ›” 1일
1

πŸ“š book

λͺ©λ‘ 보기
3/10
post-thumbnail

μ›Ή ν¬λ‘€λŸ¬λž€?

λ‘œλ΄‡(robot) λ˜λŠ” μŠ€νŒŒμ΄λ”(Spider)라고 뢀름
검색 μ—”μ§„μ—μ„œ 널리 μ“°λŠ” 기술둜, 웹에 μƒˆλ‘œ μ˜¬λΌμ˜€κ±°λ‚˜ κ°±μ‹ λœ 컨텐츠λ₯΄ μ°Ύμ•„λ‚΄λŠ” 것이 주된 λͺ©μ 
-> λͺ‡κ°œμ˜ Web Page μ—μ„œ μ‹œμž‘ν•΄μ„œ κ·Έ 링크λ₯Ό 따라 λ‚˜κ°€λ©° μƒˆλ‘œμš΄ μ½˜ν…μΈ λ₯Ό μˆ˜μ§‘ν•œλ‹€...

ν¬λ‘€λŸ¬κ°€ μ΄μš©λ˜λŠ” κ³³λ“€ ?

1. 검색 엔진 인덱싱(Search Engine Indexing)

ν¬λ‘€λŸ¬κ°€ 제일 보편적으둜 μ‚¬μš©λ˜λŠ” κ³³
μ›Ή νŽ˜μ΄μ§€λ₯Ό λͺ¨μ•„ 검색 엔진을 μœ„ν•œ 둜컬 인덱슀(local index)λ₯Ό λ§Œλ“¬
ex) Googlebot - ꡬ글(Google) 검색 엔진이 μ‚¬μš©ν•˜λŠ” μ›Ή 크둀러

2. μ›Ή 아카이빙(Web Archiving)

λ‚˜μ€‘μ— μ‚¬μš©ν•  λͺ©μ μœΌλ‘œ μž₯기보관을 μœ„ν•΄ μ›Ήμ—μ„œ 정보λ₯Ό λͺ¨μœΌλŠ” 절차λ₯Ό 말함
ex) λ―Έκ΅­ ꡭ회 λ„μ„œκ΄€(US Library of Congress), EU μ›Ή μ•„μΉ΄μ΄λΈŒ ...

3. μ›Ή λ§ˆμ΄λ‹(Web Mining)

ex) 유λͺ… 금육 κΈ°μ—… λ“±μ—μ„œ 크둀러λ₯Ό μ‚¬μš©ν•΄μ„œ μ£Όμ£Ό 총회 μžλ£Œλ‚˜ μ—°μ°¨ λ³΄κ³ μ„œ(annual report)λ₯Ό λ‹€μš΄λ°›μ•„ κΈ°μ—…μ˜ 핡심 사업 λ°©ν–₯을 μ•Œμ•„λ‚΄κΈ°λ„ ν•œλ‹¨λ‹€

4. μ›Ή λͺ¨λ‹ˆν„°λ§(Web Monitoring)

μΈν„°λ„·μ—μ„œ μ €μž‘κΆŒμ΄λ‚˜ μƒν‘œκΆŒμ΄ μΉ¨ν•΄λ˜λŠ” 사둀도 λͺ¨λ‹ˆν„°λ§μ΄ κ°€λŠ₯ν•˜λ‹€.
ex) λ””μ§€λ§ˆν¬(Degimarc)μ‚¬λŠ” μ›Ή 크둀러λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•΄μ νŒ μ €μž‘λ¬Όμ„ μ°Ύμ•„λ‚΄μ„œ λ³΄κ³ ν•œλ‹€κ³  함..

1단계. 문제 이해 및 섀계 λ²”μœ„ ν™•μž₯

μ›Ή 크둀러의 κΈ°λ³Έ μ•Œκ³ λ¦¬μ¦˜

  1. URL 집합이 μž…λ ₯으둜 주어지면, ν•΄λ‹Ή URL듀이 κ°€λ¦¬ν‚€λŠ” λͺ¨λ“  μ›Ή νŽ˜μ΄μ§€λ₯Ό λ‹€μš΄λ‘œλ“œν•¨.
  2. λ‹€μš΄λ°›μ€ μ›Ή νŽ˜μ΄μ§€μ—μ„œ URL듀을 μΆ”μΆœ..
  3. μΆ”μΆœλœ URL듀을 λ‹€μš΄λ‘œλ“œν•  URL λͺ©λ‘μ— μΆ”κ°€ν•˜κ³  μœ„μ˜ 과정을 μ²˜μŒλΆ€ν„° 반볡

근데 ν¬λ‘€λŸ¬λŠ” 생각보닀 λ‹¨μˆœν•˜κ²Œ λ™μž‘ν•˜λŠ” 게 μ•„λ‹ˆλΌμ„œ.. μ–΄λŠμ •λ„ μˆ˜μ€€μ˜ 규λͺ¨λ₯Ό κ°–λŠ” μ›Ή 크둀러λ₯Ό μ„€κ³„ν•˜λŠ” 건 μ‰¬μš΄ μž‘μ—…μ΄ μ•„λ‹ˆλΌκ³  ν•œλ‹€.

μ›Ή 크둀러 섀계 μ‹œμ— κ³ λ €ν•΄μ•Όν•  포인트

  1. 규λͺ¨ ν™•μž₯μ„±: 웹은 κ±°λŒ€ν•¨.. κ·ΈλŸ¬λ―€λ‘œ 병행성(parallelism)을 ν™œμš©ν•˜λ©΄ 보닀 효과적으둜 μ›Ή 크둀링을 ν•  수 μžˆλ‹€.
  2. μ•ˆμ •μ„±(robustness)
  3. 예절(politeness): μˆ˜μ§‘ λŒ€μƒ μ›Ή μ‚¬μ΄νŠΈμ— 짧은 μ‹œκ°„ λ™μ•ˆ λ„ˆλ¬΄ λ§Žμ€ μš”μ²­μ„ λ³΄λ‚΄μ„œλŠ” μ•ˆλ¨.
  4. ν™•μž₯μ„±(extensibility): μƒˆλ‘œμš΄ ν˜•νƒœμ˜ μ½˜ν…μΈ λ₯Ό μ§€μ›ν•˜κΈ°κ°€ μ‰¬μ›Œμ•Ό 함.

2단계. 개랡적 μ„€κ³„μ•ˆ μ œμ‹œ 및 λ™μ˜ κ΅¬ν•˜κΈ°

μ‹œμž‘ URL 집합
μ›Ή ν¬λ‘€λŸ¬κ°€ 크둀링을 μ‹œμž‘ν•˜λŠ” 좜발점
μΌλ°˜μ μœΌλ‘œλŠ” 전체 URL 곡간을 μž‘μ€ λΆ€λΆ„μ§‘ν•©μœΌλ‘œ λ‚˜λˆ„λŠ” μ „λž΅μ„ μ‚¬μš©ν•¨

λ―Έμˆ˜μ§‘ URL μ €μž₯μ†Œ
ν˜„λŒ€ 크둀러의 크둀링 μƒνƒœ
= (1) λ‹€μš΄λ‘œλ“œν•  URL (2) λ‹€μš΄λ‘œλ“œλœ URL 의 두 κ°€μ§€λ‘œ λ‚˜λˆ μ„œ 관리

λ―Έμˆ˜μ§‘ URL μ €μž₯μ†Œ(URL frontier): (2) 'λ‹€μš΄λ‘œλ“œ ν•  URL' 을 μ €μž₯ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈ

FIFO(First-In-First-Out) 큐(Queue)라고 μƒκ°ν•˜λ©΄ 됨.

HTML λ‹€μš΄λ‘œλ”

μΈν„°λ„·μ—μ„œ μ›Ή νŽ˜μ΄μ§€λ₯Ό λ‹€μš΄λ‘œλ“œν•˜λŠ” μ»΄ν¬λ„ŒνŠΈ

도메인 이름 λ³€ν™˜κΈ°
μ›Ή νŽ˜μ΄μ§€ λ‹€μš΄ μ‹œ URL을 IP μ£Όμ†Œλ‘œ λ³€ν™˜ν•˜λŠ” μ ˆμ°¨κ°€ ν•„μš”

μ½˜ν…μΈ  νŒŒμ„œ
μ›Ή νŽ˜μ΄μ§€λ₯Ό λ‹€μš΄λ‘œλ“œ ν•˜λ©΄ νŒŒμ‹±(parsing)κ³Ό 검증(validation) 절차λ₯Ό 거쳐야 함.
크둀링 μ„œλ²„ μ•ˆμ— μ½˜ν…μΈ  νŒŒμ„œλ₯Ό κ΅¬ν˜„ν•˜λ©΄ 크둀링 과정이 λŠλ €μ§€κ²Œ 될 수 μžˆμœΌλ―€λ‘œ, λ…λ¦½λœ μ»΄ν¬λ„ŒνŠΈλ‘œ..

쀑볡 μ½˜ν…μΈ μΈκ°€?
μ›Ή νŽ˜μ΄μ§€μ˜ ν•΄μ‹œ 값을 λΉ„κ΅ν•˜λŠ” 것이 제일 효율적

μ½˜ν…μΈ  μ €μž₯μ†Œ
HTML λ¬Έμ„œλ₯Ό λ³΄κ΄€ν•˜λŠ” μ‹œμŠ€ν…œ
μ €μž₯μ†Œλ₯Ό κ΅¬ν˜„ν•˜λŠ” 데 쓰일 κΈ°μˆ μ„ κ³ λ₯Ό λ•Œμ—λŠ” 1) μ €μž₯ν•  λ°μ΄ν„°μ˜ μœ ν˜•, 2) 크기, 3) μ €μž₯μ†Œ μ ‘κ·Ό λΉˆλ„, 4) λ°μ΄ν„°μ˜ 유효 κΈ°κ°„ 등을 μ’…ν•©μ μœΌλ‘œ κ³ λ €ν•΄μ•Ό 함.

URL μΆ”μΆœκΈ°
HTML νŽ˜μ΄μ§€λ₯Ό νŒŒμ‹±ν•˜μ—¬ 링크듀을 κ³¨λΌλ‚΄λŠ” μ—­ν• 

URL ν•„ν„°
1) νŠΉμ •ν•œ μ½˜ν…μΈ  νƒ€μž…μ΄λ‚˜ 2) 파일 ν™•μž₯자λ₯Ό κ°–λŠ” URL, 3) 접속 μ‹œ 였λ₯˜κ°€ λ°œμƒν•˜λŠ” URL, 4) μ ‘κ·Ό μ œμ™Έ λͺ©λ‘(deny list)에 ν¬ν•¨λœ URL 등을 크둀링 λŒ€μƒμ—μ„œ μ œμ™Έν•˜λŠ” μ—­ν• 

이미 λ°©λ¬Έν•œ URL
ν•΄λ‹Ή 자료 ꡬ쑰둜 λΈ”λ£Έ ν•„ν„° λ‚˜ ν•΄μ‹œ ν…Œμ΄λΈ”μ΄ 널리 μ‚¬μš©λ¨

URL μ €μž₯μ†Œ
이미 λ°©λ¬Έν•œ URL을 λ³΄κ΄€ν•˜λŠ” μ €μž₯μ†Œ

3단계. 상세 섀계

DFSλ₯Ό μ“Έ 것인가, BFSλ₯Ό μ“Έ 것인가?

μ›Ή 크둀러의 경우 보톡 λ„ˆλΉ„ μš°μ„  탐색법(BFS:breath-first search)λ₯Ό μ‚¬μš©
= FIFO(first in first out) 큐λ₯Ό μ‚¬μš©ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜
= ν•œ μͺ½μœΌλ‘œλŠ” 탐색할 URL을 집어넣고, λ‹€λ₯Έ ν•œμͺ½μœΌλ‘œλŠ” κΊΌλ‚΄κΈ°λ§Œ ν•œλ‹€.

[ 문제점 ]
1. ν•œ νŽ˜μ΄μ§€μ—μ„œ λ‚˜μ˜€λŠ” 링크의 μƒλ‹Ήμˆ˜λŠ” 같은 μ„œλ²„λ‘œ λ˜λŒμ•„κ°.
2. ν‘œμ€€μ  BFS μ•Œκ³ λ¦¬μ¦˜μ€ URL 간에 μš°μ„ μˆœμœ„λ₯Ό 두지 μ•ŠλŠ”λ‹€.
-> λͺ¨λ“  μ›Ή νŽ˜μ΄μ§€κ°€ 같은 μˆ˜μ€€μ˜ ν’ˆμ§ˆ, 같은 μˆ˜μ€€μ˜ μ€‘μš”μ„±μ„ κ°–μ§€λŠ” μ•ŠλŠ”λ‹€..
-> νŽ˜μ΄μ§€ μˆœμœ„, μ‚¬μš©μž νŠΈλž˜ν”½μ˜ μ–‘, μ—…λ°μ΄νŠΈ λΉˆλ„ λ“± μ—¬λŸ¬ 가지 척도에 λΉ„μΆ”μ–΄ 처리 μš°μ„ μˆœμœ„λ₯Ό κ΅¬λ³„ν•˜λŠ”κ²Œ 적합.

λ―Έμˆ˜μ§‘ URL μ €μž₯μ†Œ

1. 예의

동일 μ›Ή μ‚¬μ΄νŠΈμ— λŒ€ν•΄μ„œλŠ” ν•œ λ²ˆμ— ν•œ νŽ˜μ΄μ§€λ§Œ μš”μ²­ν•œλ‹€.
-> 이것을 만쑱 μ‹œν‚€λ €λ©΄, μ›Ήμ‚¬μ΄νŠΈμ˜ 호슀트λͺ…(hostname)κ³Ό λ‹€μš΄λ‘œλ“œλ₯Ό μˆ˜ν–‰ν•˜λŠ” μž‘μ—… μŠ€λ ˆλ“œ(worker thread) μ‚¬μ΄μ˜ 관계λ₯Ό μœ μ§€ν•˜λ©΄ λœλ‹€.

  • 큐 λΌμš°ν„°(Queue Router): 같은 ν˜ΈμŠ€νŠΈμ— μ†ν•œ URL은 μ–Έμ œλ‚˜ 같은 큐둜 가도둝 보μž₯ν•˜λŠ” μ—­ν• 
  • 맀핑 ν…Œμ΄λΈ”(Mapping Table): 호슀트 이름과 큐 μ‚¬μ΄μ˜ 관계λ₯Ό λ³΄κ΄€ν•˜λŠ” ν…Œμ΄λΈ”
  • FIFO 큐(b1λΆ€ν„° bnκΉŒμ§€): 같은 ν˜ΈμŠ€νŠΈμ— μ†ν•œ URL은 μ–Έμ œλ‚˜ 같은 큐에 보관됨
  • 큐 선택기: 큐듀을 μˆœνšŒν•˜λ©΄μ„œ νμ—μ„œ URL을 κΊΌλ‚΄μ„œ ν•΄λ‹Ή νμ—μ„œ λ‚˜μ˜¨ URL을 λ‹€μš΄λ‘œλ“œν•˜λ„λ‘ μ§€μ •λœ μž‘μ—… μŠ€λ ˆλ“œμ— μ „λ‹¬ν•˜λŠ” μ—­ν• 
  • μž‘μ—… μŠ€λ ˆλ“œ: μ „λ‹¬λœ URL을 λ‹€μš΄λ‘œλ“œν•˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•¨. μ „λ‹¬λœ URL은 순차적으둜 처리될 것이며, μž‘μ—… 간에 μ§€μ—°μ‹œκ°„(delay)을 쀄 수 있음

2. μš°μ„ μˆœμœ„

  • μˆœμœ„κ²°μ •μž₯치(priortizer): URL을 μž…λ ₯으둜 λ°›μ•„ μš°μ„ μˆœμœ„λ₯Ό 계산함
  • μ „λ©΄ 큐: μš°μ„ μˆœμœ„ κ²°μ • 과정을 처리
  • ν›„λ©΄ 큐: ν¬λ‘€λŸ¬κ°€ 예의 λ°”λ₯΄κ²Œ λ™μž‘ν•˜λ„λ‘ 보증

3. 신선도

이 μž‘μ—…μ„ μ΅œμ ν™” ν•˜κΈ° μœ„ν•œ μ „λž΅
1. μ›Ή νŽ˜μ΄μ§€μ˜ λ³€κ²½ 이λ ₯(update history) ν™œμš©
2. μš°μ„ μˆœμœ„λ₯Ό ν™œμš©ν•˜μ—¬, μ€‘μš”ν•œ νŽ˜μ΄μ§€λŠ” μ’€ 더 자주 μž¬μˆ˜μ§‘

4. λ―Έμˆ˜μ§‘ URL μ €μž₯μ†Œλ₯Ό μœ„ν•œ 지속성 μ €μž₯μž₯치

HTML λ‹€μš΄λ‘œλ”

1. Robot.txt
이 νŒŒμΌμ—λŠ” ν¬λ‘€λŸ¬κ°€ μˆ˜μ§‘ν•΄λ„ λ˜λŠ” νŽ˜μ΄μ§€ λͺ©λ‘μ΄ λ“€μ–΄μžˆμŒ

2. μ„±λŠ₯ μ΅œμ ν™”
HTML λ‹€μš΄λ‘œλ”μ— μ‚¬μš©ν•  수 μžˆλŠ” μ„±λŠ₯ μ΅œμ ν™” 기법듀

  1. λΆ„μ‚° 크둀링

  2. 도메인 이름 λ³€ν™˜ μΊμ‹œ
    도메인 이름 λ³€ν™˜κΈ°(DNS Resolver)λŠ” 크둀러 μ„±λŠ₯의 병λͺ© 쀑 ν•˜λ‚˜μ΄λ°, μ΄λŠ” DNS μš”μ²­μ„ 보내고 κ²°κ³Όλ₯Ό λ°›λŠ” μž‘μ—…μ˜ 동기적 νŠΉμ„± λ•Œλ¬Έ
    -> DNS 쑰회 결과둜 얻어진 도메인 이름과 IP μ£Όμ†Œ μ‚¬μ΄μ˜ 관계λ₯Ό μΊμ‹œμ— 보관해 놓고 크둠 작(cron job) 등을 돌렀 주기적으둜 κ°±μ‹ ν•˜λ„λ‘ ν•΄ λ†“μœΌλ©΄ μ„±λŠ₯ 높일 수 μž‡μŒ

  3. 지역성

  4. 짧은 νƒ€μž„μ•„μ›ƒ

3. μ•ˆμ •μ„±

  1. μ•ˆμ • ν•΄μ‹œ(consistent hashing)
  2. 크둀링 μƒνƒœ λ―Έ μˆ˜μ§‘ 데이터 μ €μž₯: μž₯μ• κ°€ λ°œμƒν•œ κ²½μš°μ—λ„ μ‰½κ²Œ 볡ꡬ할 수 μžˆλ„λ‘..
  3. μ˜ˆμ™Έ 처리(Exception handling)
  4. 데이터 검증(Data Validation)

4. ν™•μž₯μ„±

PNG λ‹€μš΄λ‘œλ”μ™€ μ›Ήλͺ¨λ‹ˆν„°(웹을 λͺ¨λ‹ˆν„°λ§ν•˜μ—¬ μ €μž‘κΆŒμ΄λ‚˜ μƒν‘œκΆŒμ΄ μΉ¨ν•΄λ˜λŠ” 일을 λ§‰λŠ” λͺ¨λ“ˆ)

5. 문제 μžˆλŠ” μ½˜ν…μΈ  감지 및 νšŒν”Ό

  1. 쀑볡 컨텐츠
    μ›Ή μ½˜ν…μΈ μ˜ μ•½ 30% κ°€λŸ‰μ€ 쀑볡
    ν•΄μ‹œλ‚˜ 체크섬(check-sum)을 μ‚¬μš©ν•˜λ©΄ 쀑볡 μ½˜ν…μΈ λ₯Ό 보닀 μ‰½κ²Œ 탐지 κ°€λŠ₯

  2. 거미 덫(Spider Map)
    크둀러λ₯Ό λ¬΄ν•œ 루프에 λΉ νŠΈλ¦¬λ„λ‘ μ„€κ³„ν•œ μ›Ή νŽ˜μ΄μ§€
    덫을 μžλ™μœΌλ‘œ ν”Όν•΄κ°€λŠ” μ•Œκ³ λ¦¬μ¦˜μ„ λ§Œλ“€κΈ°λŠ” 맀우 어렀움
    = μ‚¬λžŒμ΄ μˆ˜μž‘μ—…μœΌλ‘œ 덫을 ν™•μΈν•˜κ³  μ°Ύμ•„λ‚Έ 후에 덫이 μžˆλŠ” μ‚¬μ΄νŠΈλ₯Ό 크둀러 탐색 λŒ€μƒμ—μ„œ μ œμ™Έν•˜κ±°λ‚˜ URL ν•„ν„° λͺ©λ‘μ— κ±Έμ–΄λ‘λŠ” 것

  3. 데이터 λ…Έμ΄μ¦ˆ

4단계. 마무리

μΆ”κ°€ λ…Όμ˜ 포인트

1. μ„œλ²„ μΈ‘ λ Œλ”λ§(server-side rendering)
λ§Žμ€ μ›Ή μ‚¬μ΄νŠΈκ°€ μžλ°”μŠ€ν¬λ¦½νŠΈ(Java Script), AJAX λ“±μ˜ κΈ°μˆ μ„ μ‚¬μš©ν•΄μ„œ 링크λ₯Ό μ¦‰μ„μ—μ„œ λ§Œλ“€μ–΄ λ‚΄λŠ”λ°, μ›Ή νŽ˜μ΄μ§€λ₯Ό κ·Έλƒ₯ μžˆλŠ” κ·ΈλŒ€λ‘œ λ‹€μš΄ λ°›μ•„μ„œ νŒŒμ‹±ν•΄λ³΄λ©΄ λ™μ μœΌλ‘œ μƒμ„±λ˜λŠ” λ§ν¬λŠ” λ°œκ²¬ν•  μˆ˜κ°€ μ—†κ²Œ λœλ‹€.
-> 동적 λ Œλ”λ§(dynamic rendering) 으둜 ν•΄κ²° κ°€λŠ₯

2. μ›μΉ˜ μ•ŠλŠ” νŽ˜μ΄μ§€ 필터링

3. λ°μ΄ν„°λ² μ΄μŠ€ 닀쀑화 및 샀딩

4. μˆ˜ν‰μ  규λͺ¨ ν™•μž₯μ„±(horizontal scalability)
μˆ˜ν‰μ  규λͺ¨ ν™•μž₯성을 λ‹¬μ„±ν•˜λŠ” 데에 κ°€μž₯ μ€‘μš”ν•œ 것은 μ„œλ²„κ°€ μƒνƒœμ •λ³΄λ₯Ό μœ μ§€ν•˜μ§€ μ•Šλ„λ‘ ν•˜λŠ” 것, 즉 λ¬΄μƒνƒœ(stateless) μ„œλ²„λ‘œ λ§Œλ“œλŠ” 것이닀.

5. κ°€μš©μ„±, 일관성, μ•ˆμ •μ„±

6. 데이터 뢄석 μ†”λ£¨μ…˜(analytics)

profile
파이(Ο€)ν˜• 개발자 🎐🌿🀍

0개의 λŒ“κΈ€