Design Web Crawler

Web Crawler

μ›Ή ν¬λ‘€λŸ¬λŠ” μ›Ή νŽ˜μ΄μ§€λ₯Ό νƒμƒ‰ν•˜κ³  정보λ₯Ό μˆ˜μ§‘ν•˜λŠ” 기술둜, λ‹€μ–‘ν•˜κ²Œ μ΄μš©λœλ‹€.

  • 검색 엔진 인덱싱: κ°€μž₯ 보편적인 μš©λ‘€λ‘œ, μ›Ή νŽ˜μ΄μ§€λ₯Ό λͺ¨μ•„ 검색 엔진을 μœ„ν•œ 둜컬 인덱슀 생성 λͺ©μ 

  • μ›Ή 아카이빙: λ‚˜μ€‘μ— μ‚¬μš©ν•˜κΈ° μœ„ν•œ μž₯기보관 λͺ©μ 

  • μ›Ή λ§ˆμ΄λ‹: 인터넷 μ›Ήμ˜ μœ μš©ν•œ 지식을 μΆ”μΆœν•˜κΈ° μœ„ν•œ λͺ©μ 

  • μ›Ή λͺ¨λ‹ˆν„°λ§: μΈν„°λ„·μ—μ„œ μ €μž‘κΆŒμ΄λ‚˜ μƒν‘œκΆŒμ΄ μΉ¨ν•΄λ˜λŠ” 것을 κ°μ§€ν•˜κΈ° μœ„ν•œ λͺ©μ 

μ›Ή ν¬λ‘€λŸ¬λŠ” μ²˜λ¦¬ν•΄μ•Ό ν•  λ°μ΄ν„°μ˜ 규λͺ¨μ— 따라 μ‹œμŠ€ν…œμ˜ λ³΅μž‘λ„λ„ 달라지기 λ•Œλ¬Έμ—, μ£Ό λͺ©μ κ³Ό μˆ˜μ§‘ν•΄μ•Όν•  λ°μ΄ν„°μ˜ 양을 κ³ λ €ν•˜μ—¬ 섀계해야 ν•œλ‹€.

μš”κ΅¬μ‚¬ν•­ 및 개랡적 μΆ”μ •

  • 검색 엔진 인덱싱 μˆ˜μ§‘ λͺ©μ 

  • 맀달 10μ–΅ 개의 μ›Ή νŽ˜μ΄μ§€ μˆ˜μ§‘

  • μˆ˜μ§‘ν•œ μ›Ή νŽ˜μ΄μ§€λŠ” 5λ…„κ°„ 보관

  • 규λͺ¨ ν™•μ •μ„± 용이

  • 크둀링 μ‹œ μ•ˆμ •μ„± 보μž₯(λ¬΄λ°˜μ‘ μ„œλ²„ / μž₯μ•  / μ•…μ„± μ½”λ“œ λ“±)

  • μˆ˜μ§‘ λŒ€μƒ μ›Ή μ‚¬μ΄νŠΈμ— λΆˆν•„μš”ν•œ μš”μ²­ X

  • μ€‘λ³΅λœ μ»¨ν…μΈ λŠ” λ¬΄μ‹œ

μ›Ή ν¬λ‘€λŸ¬κ°€ μœ„μ™€ 같은 μš”κ΅¬μ‚¬ν•­μ„ λ§Œμ‘±ν•΄μ•Όν•  λ•Œ, μ•„λž˜μ™€ 같이 μΆ”μ •ν•΄λ³Ό 수 μžˆλ‹€.

  • QPS = 10μ–΅ / 30일 / 24μ‹œκ°„ / 60λΆ„ / 60초 = 385/초, μ΅œλŒ€ QPS = 385 * 2 = 770/초

  • λ ˆμ½”λ“œ 수: 10μ–΅ * 12κ°œμ›” * 5λ…„ = 600μ–΅

  • μ €μž₯ μš©λŸ‰: (평균 μ›Ή νŽ˜μ΄μ§€ 크기 500k κ°€μ •) 600μ–΅ * 500k = 300PB

섀계 및 μˆ˜μ§‘ ν”Œλ‘œμš°

μ›Ή 크둀러 섀계 μ‹œ μœ„μ™€ 같이 μ»΄ν¬λ„ŒνŠΈλ₯Ό λ‚˜λˆ„μ–΄ 섀계할 수 μžˆλ‹€.

  • μ‹œμž‘ URL 집합: μ›Ή ν¬λ‘€λŸ¬κ°€ 크둀링을 μ‹œμž‘ν•˜λŠ” URL 집합

  • λ―Έμˆ˜μ§‘ URL μ €μž₯μ†Œ: ν˜„λŒ€μ  μ›Ή ν¬λ‘€λŸ¬λŠ” 크둀링 크둀링 μƒνƒœλ₯Ό λ‹€μš΄λ‘œλ“œν•  URL / λ‹€μš΄λ‘œλ“œ 된 URL 두 κ°€μ§€λ‘œ λ‚˜λˆ  κ΄€λ¦¬ν•˜λŠ”λ°, λ‹€μš΄λ‘œλ“œν•  URL에 ν•΄λ‹Ήν•˜λŠ” URL μ €μž₯μ†Œ

  • HTML λ‹€μš΄λ‘œλ”: μ›Ή νŽ˜μ΄μ§€λ₯Ό λ‹€μš΄λ‘œλ“œ

  • 도메인 이름 λ³€ν™˜κΈ°: URL을 IP μ£Όμ†Œλ‘œ λ³€ν™˜

  • 컨텐츠 νŒŒμ„œ: μ›Ή νŽ˜μ΄μ§€λ₯Ό νŒŒμ‹±ν•˜κ³ , μ˜¬λ°”λ₯Έ μ›Ή νŽ˜μ΄μ§€μΈμ§€ 확인

  • 쀑볡 컨텐츠: μ€‘λ³΅λœ 컨텐츠λ₯Ό 확인

    • λ¬Έμžμ—΄λ‘œ 보고 λΉ„κ΅ν•˜λŠ” 것이 κ°€μž₯ μ •ν™•ν•˜κ³  κ°„λ‹¨ν•˜μ§€λ§Œ, 느리기 λ•Œλ¬Έμ— ν•΄μ‹œ 값을 λΉ„κ΅ν•˜λŠ” 방법 μ‚¬μš©

  • 컨텐츠 μ €μž₯μ†Œ: λ‹€μš΄λ‘œλ“œν•œ μ›Ή νŽ˜μ΄μ§€λ₯Ό μ €μž₯

  • URL μΆ”μΆœκΈ°: HTML νŽ˜μ΄μ§€λ₯Ό νŒŒμ‹±ν•˜μ—¬ μƒˆλ‘œμš΄ URL을 μΆ”μΆœ

    • μ˜ˆμ‹œ: μƒλŒ€ 경둜인 /wiki/platypusλ₯Ό https://en.wikipedia.org/wiki/platypus둜 λ³€ν™˜

  • URL ν•„ν„°: νŠΉμ •ν•œ 컨텐츠 νƒ€μž…μ΄λ‚˜ 파일 ν™•μž₯자λ₯Ό κ°–λŠ” URL / 접속 μ‹œ 였λ₯˜ λ°œμƒ URL / μ œμ™Έ λͺ©λ‘μ— ν¬ν•¨λœ URL 등을 필터링

  • 이미 λ°©λ¬Έν•œ URL: 이미 λ°©λ¬Έν•œ URL인지 ν™•μΈν•˜μ—¬ 같은 URL μ—¬λŸ¬ 번 λ°©λ¬Έν•˜λŠ” 것을 방지

  • URL μ €μž₯μ†Œ: λ‹€μš΄λ‘œλ“œλœ URL을 μ €μž₯

μœ„ μ»΄ν¬λ„ŒνŠΈλ‘œ κ΅¬μ„±λœ μ›Ή 크둀러의 μž‘μ—… 흐름을 κ°„λž΅ν•˜κ²Œ μš”μ•½ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

  1. μ‹œμž‘ URL듀을 λ―Έμˆ˜μ§‘ URL μ €μž₯μ†Œμ— μ €μž₯

  2. HTML λ‹€μš΄λ‘œλ”μ—μ„œ λ―Έμˆ˜μ§‘ URL μ €μž₯μ†Œμ—μ„œ URL λͺ©λ‘μ„ κ°€μ Έμ˜΄

  3. 도메인 이름 λ³€ν™˜κΈ°λ₯Ό μ‚¬μš©ν•˜μ—¬ URL의 IP μ£Όμ†Œλ‘œ λ³€ν™˜ ν›„ μ›ΉνŽ˜μ΄μ§€ λ‹€μš΄λ‘œλ“œ

  4. 컨텐츠 νŒŒμ„œμ—μ„œ λ‹€μš΄λœ HTML νŽ˜μ΄μ§€λ₯Ό νŒŒμ‹±ν•˜μ—¬ μ˜¬λ°”λ₯Έ μ›Ή νŽ˜μ΄μ§€μΈμ§€ 검증

  5. 검증 ν›„ 쀑볡 컨텐츠인지 확인

  6. 쀑볡 컨텐츠인지 ν™•μΈν•˜κΈ° μœ„ν•΄ 컨텐츠 μ €μž₯μ†Œμ—μ„œ ν•΄μ‹œ 값을 비ꡐ

    • 이미 μ €μž₯μ†Œμ— μžˆλŠ” 경우 μ²˜λ¦¬ν•˜μ§€ μ•Šκ³  버림

  7. URL μΆ”μΆœκΈ°μ—μ„œ ν•΄λ‹Ή HTML νŽ˜μ΄μ§€μ—μ„œ 링크λ₯Ό μΆ”μΆœ

  8. μΆ”μΆœλœ 링크λ₯Ό URL ν•„ν„°λ‘œ 전달

  9. 필터링을 거친 ν›„ 남은 URLλ“€ 쀑 이미 λ°©λ¬Έν•œ URL인지 확인

    • 이미 λ°©λ¬Έν•œ URL인 경우 μ²˜λ¦¬ν•˜μ§€ μ•Šκ³  버림

  10. μ €μž₯μ†Œμ— μ—†λŠ” URL인 경우 URL μ €μž₯μ†Œμ— μ €μž₯ ν›„ λ―Έμˆ˜μ§‘ URL μ €μž₯μ†Œμ— 전달

  11. μ „λ‹¬λœ URL듀을 λŒ€μƒμœΌλ‘œ λ‹€μ‹œ 2번으둜 λŒμ•„κ°€ 반볡

상세 섀계

DFS vs BFS

ν•˜λ‚˜μ˜ μ›Ή νŽ˜μ΄μ§€ μ•ˆμ—” μ—¬λŸ¬ 링크가 μ‘΄μž¬ν•˜κ³ , 이 링크듀은 λ‹€λ₯Έ μ›Ή νŽ˜μ΄μ§€λ‘œ μ—°κ²°λ˜μ–΄ μžˆμ–΄, ν•˜λ‚˜μ˜ 유ν–₯ κ·Έλž˜ν”„λΌκ³  λ³Ό 수 μžˆλ‹€. λ•Œλ¬Έμ— 크둀링 ν”„λ‘œμ„ΈμŠ€λ„ μ΄λŸ¬ν•œ 유ν–₯ κ·Έλž˜ν”„λ₯Ό νƒμƒ‰ν•˜λŠ” 과정이라 λ³Ό 수 μžˆμ–΄, DFS와 BFS 쀑 μ–΄λ–€ λ°©μ‹μœΌλ‘œ 탐색할지 κ²°μ •ν•΄μ•Ό ν•œλ‹€.

  • DFS: κ·Έλž˜ν”„ 크기가 클 경우 μ–΄λŠ μ •λ„λ‘œ κΉŠμˆ™μ΄ νƒμƒ‰ν•˜κ²Œ 될지 κ°€λŠ ν•˜κΈ° μ–΄λ ΅κΈ° λ•Œλ¬Έμ— 잘 μ‚¬μš©ν•˜μ§€ μ•ŠμŒ

  • BFS: 보톡 μ‚¬μš©ν•˜λŠ” λ°©μ‹μ΄μ§€λ§Œ, μ•„λž˜ 두 가지 λ¬Έμ œκ°€ λ°œμƒν•  수 있음

    • 예의(politeness): ν•˜λ‚˜μ˜ νŽ˜μ΄μ§€μ—μ„œ λ‚˜μ˜€λŠ” 링크 쀑 상당 μˆ˜λŠ” 같은 μ„œλ²„λ‘œ μ—°κ²°λ˜μ–΄ μžˆμ–΄, 같은 μ„œλ²„μ— λŒ€ν•œ μš”μ²­μ΄ λ§Žμ•„μ§ˆ 수 있음(ν•΄λ‹Ή μ„œλ²„μ— λΆ€ν•˜ λ°œμƒ)

    • μš°μ„ μˆœμœ„: λͺ¨λ“  μ›Ή νŽ˜μ΄μ§€κ°€ 같은 μˆ˜μ€€μ˜ ν’ˆμ§ˆμ΄λ‚˜ μ€‘μš”μ„±μ„ 갖지 μ•Šμ§€λ§Œ, ν‘œμ€€μ  BFSλŠ” μš°μ„ μˆœμœ„κ°€ μ—†μ–΄ μ—¬λŸ¬ 척도(νŽ˜μ΄μ§€ μˆœμœ„ / νŠΈλž˜ν”½ μ–‘ λ“±)에 λ”°λ₯Έ μš°μ„ μˆœμœ„ ν•„μš”

λ•Œλ¬Έμ— 크둀링 μ•Œκ³ λ¦¬μ¦˜ κ΅¬ν˜„ μ‹œ BFSλ₯Ό μ‚¬μš©ν•˜λ˜, μœ„ 두 가지 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ―Έμˆ˜μ§‘ URL μ €μž₯μ†Œλ₯Ό ν™œμš©ν•  수 μžˆλ‹€.

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

μ „λ©΄ 큐둜 μš°μ„ μˆœμœ„ κ²°μ • 과정을 μ²˜λ¦¬ν•œ λ’€, ν›„λ©΄ 큐둜 ν¬λ‘€λŸ¬κ°€ 예의 λ°”λ₯΄κ²Œ λ™μž‘ν•˜λ„λ‘ λ³΄μ¦ν•˜μ—¬ 예의(politeness)와 μš°μ„ μˆœμœ„ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€.

μš°μ„ μˆœμœ„

크둀러 μž…μž₯μ—μ„œλŠ” μ€‘μš”ν•œ νŽ˜μ΄μ§€λ₯Ό λ¨Όμ € μˆ˜μ§‘ν•˜λ„λ‘ ν•˜λŠ” 것이 쒋은데, 이λ₯Ό μœ„ν•΄μ„œ μˆœμœ„ κ²°μ • μž₯치λ₯Ό μΆ”κ°€ν•  수 μžˆλ‹€. μˆœμœ„ κ²°μ • μž₯μΉ˜λŠ” μœ μš©μ„±μ— 따라 URL μš°μ„ μˆœμœ„λ₯Ό λ‚˜λˆŒ λ•ŒλŠ” νŽ˜μ΄μ§€λž­ν¬ / νŠΈλž˜ν”½ μ–‘ / κ°±μ‹  λΉˆλ„ λ“± λ‹€μ–‘ν•œ 척도에 따라 URL μš°μ„ μˆœμœ„λ₯Ό μ •ν•˜λ„λ‘ ν•œλ‹€.

  • μˆœμœ„ κ²°μ • μž₯치(prioritizer): URL을 μž…λ ₯으둜 λ°›μ•„ μš°μ„ μˆœμœ„ 계산

  • 큐: μš°μ„ μˆœμœ„λ³„λ‘œ 큐 ν•˜λ‚˜μ”© ν• λ‹Ή

  • 큐 선택기: μž„μ˜ νμ—μ„œ μ²˜λ¦¬ν•  URL을 κΊΌλ‚΄λŠ” μž‘μ—… μˆ˜ν–‰, μˆœμœ„κ°€ 높은 νμ—μ„œ 더 자주 꺼내도둝 섀계

예의(politeness)

예의(politeness) 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„  동일 μ›Ή μ‚¬μ΄νŠΈμ— λŒ€ν•΄μ„œλŠ” ν•œ λ²ˆμ— ν•œ νŽ˜μ΄μ§€λ§Œ μš”μ²­ν•΄μ•Ό ν•œλ‹€. λ―Έμˆ˜μ§‘ URL μ €μž₯μ†Œλ₯Ό 섀계할 λ•Œ, λ‹€μŒκ³Ό 같은 μ»΄ν¬λ„ŒνŠΈλ“€λ‘œ ν•΄λ‹Ή 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€.

  • 큐 λΌμš°ν„°: 같은 ν˜ΈμŠ€νŠΈμ— μ†ν•œ URL이 μ–Έμ œλ‚˜ 같은 큐둜 λΌμš°νŒ…λ˜λ„λ‘ 보μž₯

  • 맀핑 ν…Œμ΄λΈ”: 호슀트 이름과 큐 μ‚¬μ΄μ˜ 관계λ₯Ό μ €μž₯ν•˜λŠ” ν…Œμ΄λΈ”

  • FIFO 큐: 같은 ν˜ΈμŠ€νŠΈμ— μ†ν•œ URL은 같은 큐에 보관(호슀트 λ³„λ‘œ 큐λ₯Ό μƒμ„±ν•˜μ—¬ 관리)

  • 큐 선택기: 큐듀을 μˆœνšŒν•˜λ©΄μ„œ νμ—μ„œ URL을 κΊΌλ‚΄μ–΄ μ§€μ •λœ μž‘μ—… μŠ€λ ˆλ“œμ— 전달

  • μž‘μ—… μŠ€λ ˆλ“œ: μ „λ‹¬λœ URL을 λ‹€μš΄λ‘œλ“œν•˜λŠ” μž‘μ—… μˆ˜ν–‰

μ›Ήμ‚¬μ΄νŠΈ 호슀트λͺ…κ³Ό λ‹€μš΄λ‘œλ“œ μˆ˜ν–‰ μž‘μ—… μŠ€λ ˆλ“œ μ‚¬μ΄μ˜ 관계λ₯Ό μœ μ§€ν•˜λ©΄μ„œ, 각 μž‘μ—… μŠ€λ ˆλ“œλŠ” 별도 FIFO 큐λ₯Ό 가지고, ν•΄λ‹Ή νμ—μ„œ κΊΌλ‚Έ URL만 λ‹€μš΄λ‘œλ“œν•˜λ„λ‘ 섀계할 수 μžˆλ‹€.

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

HTML λ‹€μš΄λ‘œλ”μ—μ„œλ„ μ„±λŠ₯을 μ΅œμ ν™”ν•˜κΈ° μœ„ν•΄ μ—¬λŸ¬ 가지 방법을 μ‚¬μš©ν•  수 μžˆλ‹€.

  • Robots.txt 캐싱: ν¬λ‘€λŸ¬κ°€ μˆ˜μ§‘ν•΄λ„ λ˜λŠ” νŽ˜μ΄μ§€ λͺ©λ‘λ“€μ΄ μ‘΄μž¬ν•˜λŠ” Robots.txt νŒŒμΌμ„ μ—¬λŸ¬ 번 λ‹€μš΄λ‘œλ“œν•˜λŠ” 것을 ν”Όν•˜κΈ° μœ„ν•΄, 주기적으둜 λ‹€μš΄λ°›μ•„ μΊμ‹œμ— μ €μž₯ν•˜λŠ” 방법을 μ‚¬μš©ν•  수 μžˆλ‹€.

  • λΆ„μ‚° 크둀링: 크둀링 μž‘μ—…μ„ μ—¬λŸ¬ μ„œλ²„μ— λΆ„μ‚°ν•˜μ—¬ μˆ˜ν–‰

  • 도메인 이름 κ²°κ³Ό μΊμ‹œ: 도메인 이름 λ³€ν™˜κΈ°μ—μ„œ 받은 κ²°κ³Όλ₯Ό μΊμ‹œμ— μ €μž₯

  • 지역성: 크둀링 λŒ€μƒ μ„œλ²„μ™€ μ§€μ—­μ μœΌλ‘œ κ°€κΉŒμš΄ μ„œλ²„μ— μœ„μΉ˜ν•œ 크둀러 μ‚¬μš©

  • 짧은 νƒ€μž„μ•„μ›ƒ: μ›Ή μ„œλ²„λŠ” 항상 응닡을 λΉ λ₯΄κ²Œ ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ΅œλŒ€ μ–Όλ§ˆλ‚˜ 기닀릴지 κ²°μ •ν•˜λŠ” νƒ€μž„μ•„μ›ƒμ„ μ„€μ •

λ˜ν•œ λ‹€μš΄λ‘œλ“œ μ‹œ μ•ˆμ •μ„±λ„ μ€‘μš”ν•˜κΈ° λ•Œλ¬Έμ— μ•„λž˜μ˜ 방법을 μ‚¬μš©ν•  수 μžˆλ‹€.

  • μ•ˆμ • ν•΄μ‹œ: λ‹€μš΄λŸ¬λ„ μ„œλ²„λ“€μ— λΆ€ν•˜ λΆ„μ‚° μ μš©μ‹œ μ‚¬μš©

  • 크둀링 μƒνƒœ 및 μˆ˜μ§‘ 데이터 μ €μž₯: μž₯μ•  λ°œμƒ μ‹œ μ‰½κ²Œ 볡ꡬ할 수 μžˆλ„λ‘ 지속적 μ €μž₯μž₯μΉ˜μ— 기둝

참고자료

Last updated

Was this helpful?