All Articles

Python Crawling with Serverless framework

사싀 λ„ˆλ¬΄ λ‹Ήμ—°ν•œκ±΄λ° μ•ˆ μ¨λ†“μœΌλ©΄ κΉŒλ¨ΉμœΌλ‹ˆκΉŒ.

Serverless + Python κ΄€ν•΄μ„œ

  • ν”„λ‘œμ νŠΈλ³„λ‘œ virtualenvλ₯Ό λ§Œλ“€μ–΄μ„œ μ‹œμž‘ν•œλ‹€. λ‚˜μ€‘μ— requirements.txtλ₯Ό λ§Œλ“€μ–΄μ•Ό μ˜μ‘΄μ„±μ„ νŒ¨ν‚€μ§•ν•  수 μžˆλŠ”λ°, μ›λž˜ μ“°λ˜ ν™˜κ²½μ—μ„œλŠ” μ˜¨κ°– λΌμ΄λΈŒλŸ¬λ¦¬κ°€ λ‹€ κΉ”λ €μžˆμ„ν…Œλ‹ˆ pip freeze > requirements.txt둜 νŒŒμΌμ„ μž‘μ„±ν•  μˆ˜κ°€ μ—†λ‹€.
  • sls invoke local을 μ΅œλŒ€ν•œ μ¨λ¨Ήμ–΄μ„œ 적어도 둜직 자체의 였λ₯˜ λ•Œλ¬Έμ— deployλ₯Ό λ‹€μ‹œ ν•  일은 μ—†κ²Œ λ§Œλ“ λ‹€.

    • 곡식 κ°€μ΄λ“œμ—μ„œλŠ” μœ λ‹› ν…ŒμŠ€νŒ…μ€ 언어별 ν…ŒμŠ€νŒ… ν”„λ ˆμž„μ›Œν¬λ₯Ό ν™œμš©ν•˜κ³ , μΈν…Œκ·Έλ ˆμ΄μ…˜ ν…ŒμŠ€νŒ… 용으둜 invokeλ₯Ό μ‚¬μš©ν•˜λΌκ³  λ‚˜μ™€μžˆλ‹€.
  • μ‚¬μš©ν•˜λŠ” λΌμ΄λΈŒλŸ¬λ¦¬κ°€ Cμ˜μ‘΄μ„±μ΄ μžˆλ‹€λ©΄, serverless-python-requirements νŒ¨ν‚€μ§€μ˜ dockerizePip μ˜΅μ…˜μ„ κΌ­ μΌœμ€€λ‹€.

    • μ΄λ²ˆμ— 크둀링을 ν•  λ•ŒλŠ” lxml νŒ¨ν‚€μ§€κ°€ κ·Έλž¬λŠ”λ° μ €κ±Έ λͺ¨λ₯΄κ³  μ•½κ°„μ˜ μ‚½μ§ˆμ„ κ±°μ³€λ‹€.
  • requests-html μ§„μ§œ λ„ˆλ¬΄ νŽΈν•˜λ‹€. bs4λŠ” 이제 μ•ˆλ…•.

크둀링 + λžŒλ‹€μ— κ΄€ν•΄μ„œ

  1. λ³„λ„λ‘œ λ™μ‹œμ„± μ˜΅μ…˜μ„ 지정해주지 μ•ŠμœΌλ©΄ κΈˆμƒˆ λ™μ‹œμ— 1000개의 λžŒλ‹€ μ»¨ν…Œμ΄λ„ˆκ°€ ν•΄λ‹Ή μ‚¬μ΄νŠΈλ₯Ό ν¬λ‘€ν•˜κ²Œ λ˜λŠ”λ°, κ·ΈλŸ¬λ‹€λ³΄λ©΄ μ‚¬μ΄νŠΈκ°€ λ§ˆλΉ„λ˜μ–΄ 크둀은 μ‹€νŒ¨ν•˜κ³ , λžŒλ‹€ ν•¨μˆ˜λŠ” timeout λ˜μ„œ λλ‚˜κ³ , ν•¨μˆ˜λŠ” 였래 μ‹€ν–‰λ˜μ—ˆμœΌλ‹ˆ μš”κΈˆμ€ 많이 μ²­κ΅¬λ˜λŠ” μ†μƒν•œ κ²½μš°κ°€ 생긴닀. κΌ­ μ μ ˆν•œ 숫자의 λ™μ‹œμ„±μ„ μ„€μ •ν•΄μ£Όμž.
  2. Invoke Async vs Synchronous

    • Async λ°©μ‹μœΌλ‘œ ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜λ©΄ 적어도 λž©νƒ‘μ—μ„œμ˜ 파이썬 μ½”λ“œκ°€ λ°”ν‹€λ„₯이 λ˜μ§€λŠ” μ•ŠλŠ”λ° λŒ€μ‹  κ²°κ³Όλ₯Ό SQS, S3, DynamoDB 등에 μ €μž₯을 ν•΄μ•Όν•œλ‹€. κ²°κ³ΌκΉŒμ§€ 돌렀 λ°›λŠ” μ‹μœΌλ‘œ Synchronous Invokeλ₯Ό λ°›μœΌλ©΄ μ—¬λŸ¬ 개의 λžŒλ‹€ μ»¨ν…Œμ΄λ„ˆλ‘œλΆ€ν„° κ²°κ³Όλ₯Ό λ°›λŠ” 뢀뢄이 λ°”ν‹€λ„₯이 될 수 μžˆλŠ” λŒ€μ‹  (κ·Έλž˜λ„ 둜컬 CPU의 μ“°λ ˆλ“œλ₯Ό ν™œμš©ν•˜λŠ”κ±° λ³΄λ‹€λŠ” 훨씬 λ™μ‹œμ— μ‹€ν–‰ν•  수 μžˆλŠ” μž‘μ—…μ˜ κ°œμˆ˜κ°€ λ§Žλ‹€) ν‰μ†Œμ— ν•˜λ˜λŒ€λ‘œ λ‘œμ»¬μ—μ„œ 데이터 μ „μ²˜λ¦¬λ₯Ό λ§ˆμ € ν•  수 μžˆλ‹€. μ‹œκ°„μ΄ 였래 κ±Έλ¦¬λŠ” λΆ€λΆ„λ§Œ λžŒλ‹€λ‘œ μ§œλŠ” 것도 방법이닀.
    • 양이 μ§„μ§œ λ§Žμ€ 경우 λžŒλ‹€ μ—¬λŸ¬κ°œλ‘œ μ „μ²˜λ¦¬λ₯Ό ν•˜κ³  Kinesis에 λ„£μ–΄μ„œ μ΅œμ’…μ μœΌλ‘œλŠ” S3에 μ“°κΈ° νŽΈν•œ 결과물이 μ €μž₯λ˜λŠ” 것이 이상적이겠닀. 둜컬 <-> AWS μ‚¬μ΄μ˜ 데이터가 μ˜€κ°€λ©΄ λΉ„μš©κ³Ό μ‹œκ°„μ΄ 많이 λ“€ν…Œλ‹ˆκΉŒ.
  3. μ–΄μ¨Œλ“  Failν•˜λŠ” μΌ€μ΄μŠ€κ°€ μƒκΈ°λŠ”λ°, Async둜 Invokeν•  경우 이런 μ‹€νŒ¨ν•œ νƒœμŠ€ν¬λ“€μ„ μ–΄λ–»κ²Œ μ²˜λ¦¬ν•΄μ•Όν•˜λŠ”μ§€ 아직 λ§˜μ— λ“œλŠ” 방법을 λͺ»μ°Ύκ² λ‹€. λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ“°λŠ” 것이 λ‹΅μΌκΉŒ.
Published 11 Oct 2018

If I keep marking the dots, someday they will πŸ”—πŸ”—
Hyeungshik Jung on Twitter