Upgrade to Pro — share decks privately, control downloads, hide ads and more …

クローラーをテストしよう!

Bde77cfd38607d50bfd5460f03882309?s=47 Chanmoro
February 26, 2019

 クローラーをテストしよう!

クローラーの品質を維持するためにテストを整備した話
tag: crawler, python, scrapy, TDD

Bde77cfd38607d50bfd5460f03882309?s=128

Chanmoro

February 26, 2019
Tweet

Transcript

  1. 2019/02/26 https://scouty.co.jp ΫϩʔϥʔΛςετ͠Α͏ʂ Kazuki Morozumi

  2. ࣗݾ঺հ \ lOBNFz< ྆֯࿨ي ΋ΖͣΈ͔͖ͣ   !$IBO@NPSP > 

    DPNQBOZTDPVUZ*OD   QPTJUJPOΤϯδχΞˑ%+୲౰  DBSFFS< 4*FSͰ8FCͷडୗ։ൃ ೥   "*ϕϯνϟʔͰνϟοτϘοτ։ൃ ೥   ΑΓTDPVUZೖࣾ > ^
  3. ࠓ೔࿩͢͜ͱ w TDPVUZͷΫϩʔϥʔʹ͍ͭͯ w Ϋϩʔϥʔͷςετʹ͍ͭͯ w ࠓޙͷల๬

  4. ʮscouty ͷΫϩʔϥʔʹ͍ͭͯʯ

  5. ͦ΋ͦ΋ scouty ͬͯԿʁ

  6. 2018೥8݄27೔ʹ scouty ਖ਼ࣜ൛ ΛϦϦʔε

  7. scouty ʹ͍ͭͯ w ༷ʑͳ৘ใιʔεΛΫϩʔϧ͠ݸਓͷΞ ΢τϓοτΛՄࢹԽ w ֤৘ใιʔεΛఆظతʹΫϩʔϧ͠৘ใ ͷ઱౓Λҡ࣋ w ৘ใιʔε͸4/4

    ϒϩάαʔϏε ݸ ਓͰϗεςΟϯά͍ͯ͠ΔϖʔδͳͲ༷ʑ
  8. Ͳ͏͍͏Ϋϩʔϥʔ͕ඞཁʁ

  9. scouty ΫϩʔϥʔʹٻΊΒΕΔཁ݅ w ؒҧͬͨσʔλͷऔಘ͸ઈର/( w ͭͷαΠτ΍"1*ΛεΫϨΠϐϯά͢Δॲཧࣗମ͸؆୯ w ΫϩʔϧઌαʔϏεͷߏ଄มԽɺߋ৽͠ଓ͚ͯ΋σʔλ͕յΕͳ͍ઃܭ w Ұఆͷظؒ಺ʹ࠷৽৘ใ͕औಘ͞ΕΔඞཁ͕͋Δ

    w ΫϩʔϧͷεέδϡʔϦϯά w ਫฏεέʔϧ͠΍͍͢ઃܭɺΞʔΩςΫνϟʔ
  10. scouty ΫϩʔϥʔʹٻΊΒΕΔཁ݅ w ؒҧͬͨσʔλͷऔಘ͸ઈର/( w ͭͷαΠτ΍"1*ΛεΫϨΠϐϯά͢Δॲཧࣗମ͸؆୯ w ΫϩʔϧઌαʔϏεͷߏ଄มԽɺߋ৽͠ଓ͚ͯ΋σʔλ͕յΕͳ͍ઃܭ w Ұఆͷظؒ಺ʹ࠷৽৘ใ͕औಘ͞ΕΔඞཁ͕͋Δ

    w ΫϩʔϧͷεέδϡʔϦϯά w ਫฏεέʔϧ͠΍͍͢ઃܭɺΞʔΩςΫνϟʔ ˠࠓ೔͸ͪ͜Βʹ͍ͭͯͷ࿩Λ͠·͢ ˠͪ͜Βͷ࿩΋͍͔͍ͭͨ͠
  11. શମͷΞʔΩςΫνϟʔ

  12. scouty ΫϩʔϥʔͷγεςϜߏ੒

  13. scouty ΫϩʔϥʔͷγεςϜߏ੒ Ϋϩʔϥʔ

  14. scouty ΫϩʔϥʔͷγεςϜߏ੒ Ϋϩʔϥʔ •ΫϩʔϧͷϦΫΤετ • ΫϩʔϧࡁΈσʔλͷอଘ • Ϋϩʔϧ׬ྃΠϕϯτ௨஌

  15. scouty ͕าΜͰ͖ͨΫϩʔϥʔ։ൃͷྺ࢙ (͜Ε·Ͱ) w ࣾ௕ !ITIJNBEB@ ͕(SFBUͳΞΠσΟΞΛࢥ͍ͭ͘ w ͍͔ͭ͘ͷΫϩʔϥʔΛεϐʔυ༏ઌͰॻ͖·͘Δ ˠͷϑΣʔζ

     w ͱʹ͔͘଎͘ॻ͍ͯܗʹ͢ΔɺҰ൪ಘҙͳ΍ΓํͰॻ͘ w ΤϯδχΞ΋਺໊ՃΘΓΫϩʔϧઌͷ௥Ճ΍ػೳ௥ՃΛ͠·͘Δ ˠͷϑΣʔζ  w ͋Δఔ౓ͷ࢓૊ΈΛ࡞Γͭͭεϐʔυ༏ઌͰ૿ڧ͍ͤͯ͘͞
  16. scouty ͕าΜͰ͖ͨΫϩʔϥʔ։ൃͷྺ࢙ (͍·) w ࣾ௕ !ITIJNBEB@ ͕(SFBUͳΞΠσΟΞΛࢥ͍ͭ͘ w ͍͔ͭ͘ͷΫϩʔϥʔΛεϐʔυ༏ઌͰॻ͖·͘Δ ˠͷϑΣʔζ

     w ͱʹ͔͘଎͘ॻ͍ͯܗʹ͢ΔɺҰ൪ಘҙͳ΍ΓํͰॻ͘ w ΤϯδχΞ΋਺໊ՃΘΓΫϩʔϧઌͷ௥Ճ΍ػೳ௥ՃΛ͠·͘Δ ˠͷϑΣʔζ  w ͋Δఔ౓ͷ࢓૊ΈΛ࡞Γͭͭεϐʔυ༏ઌͰ૿ڧ͍ͤͯ͘͞ w த௕ظͷઓུΛཱͯͯαʔϏεՁ஋Λ૿Ճͤ͞ଓ͚Δ ˠ ͷϑΣʔζ  w ٕज़తෛ࠴͕໨ཱͭΑ͏ʹͳΓ։ൃͷ଎౓͕མͪ࢝ΊΔ w ߟྀ͕ඞཁͳલఏ৚͕݅૿͑Δ ৑௕ʹݟ͑ΔॲཧΛม͑ͨΒόάͬͨʂͱ͔  w ͜Ε·Ͱͷܦݧ͔Βಠࣗͷϊ΢ϋ΢͕஝ੵ͞Ε֦ுͷํ਑͕ఆ·͍ͬͯ͘ w ͜ͷ෦෼͸ཁΒͳ͍ɺ͜͏͍͏ػೳ͕͋Ε͹։ൃ͕ര଎ʹͳΔɺͱ͔
  17. ςετΛॻ͍ͯ҆৺͍ͨ͠ʂ

  18. ʮΫϩʔϥʔͷςετʹ͍ͭͯʯ

  19. Ϋϩʔϥʔͷςετʹ͍ͭͯ Amazon
 DynamoDB Amazon
 RDS Amazon 
 ElastiCache Amazon
 SQS

    Ϋϩʔϧઌ ֎෦αʔϏε Scrapy spider middleware pipeline Ϋϩʔϧ ϦΫΤετ Request Output Input Response ΫϩʔϥʔΛʮ*OQVUΛड͚औΓɺ֎෦αʔϏεͱ௨৴͠ɺ%#ʹ0VUQVU͢Δॲཧʯͱଊ͑Δ
  20. Ϋϩʔϥʔͷςετʹ͍ͭͯ Amazon
 DynamoDB Amazon
 RDS Amazon 
 ElastiCache Amazon
 SQS

    Ϋϩʔϧઌ ֎෦αʔϏε Scrapy spider middleware pipeline Ϋϩʔϧ ϦΫΤετ Request Output Input ςετର৅ Output͕૝ఆ௨Γ͔Λςετ͍ͨ͠ ֎෦αʔϏεͷϨεϙϯεΛݻఆ͢Δ Response *OQVUͱ֎෦αʔϏεͷϨεϙϯεΛݻఆͨ͠ঢ়ଶͰɺΫϩʔϥʔͷ0VUQVUΛςετ͍ͨ͠ ΫϩʔϥʔͷInputΛݻఆ
  21. Ϋϩʔϥʔͷςετʹ͍ͭͯ Amazon
 DynamoDB Amazon
 RDS Amazon 
 ElastiCache Amazon
 SQS

    Ϋϩʔϧઌ ֎෦αʔϏε Scrapy spider middleware pipeline Ϋϩʔϧ ϦΫΤετ Request Output Input ςετର৅ ΫϩʔϥʔInput/Outputʹ͍ͭͯ ςετίʔυΛॻ͘ Response ֎෦αʔϏεΛελϒʹஔ͖׵͑ɺΫϩʔϥʔͷ*OQVU0VUQVUʹର͢ΔςετίʔυΛॻ͘ ֎෦αʔϏε ελϒ (middleware) ֎෦αʔϏεͷϨεϙϯεΛγϛϡϨʔτ ͢ΔελϒΛࠩ͠ࠐΉ ֤ DB ͸ localstack Λ࢖ͬͯγϛϡϨʔτ
  22. scrapy ʹ͸͜ͷΑ͏ͳػೳ͕ͳ͍ͷͰ ࣗલͰςετͷ࢓૊ΈΛ։ൃ

  23. ςετίʔυͷαϯϓϧ ҎԼΛݻఆͯ͠ΫϩʔϥʔΛ࣮ߦ • Ϋϩʔϥʔ΁ͷҾ਺ • ελϒͷϨεϙϯεσʔλ DB ΁ग़ྗ͞Εͨ஋͕૝ఆ௨Γ͔Λ ςετ͢Δ

  24. ֎෦αʔϏεͷελϒͷαϯϓϧίʔυ ֤ςετέʔε͔Βࢦఆͨ͠σʔλͷ ύεʹஔ͖׵͑ΒΕΔ

  25. Ϋϩʔϥʔͷςετ͕͋Δͱ Կ͕͏Ε͍͠ͷʁ

  26. TDD ͕Ͱ͖Δʂ

  27. scouty Ϋϩʔϥʔͷ CI/CD ύΠϓϥΠϯ Amazon ECS Docker compose ࣗಈςετ •

    ίʔυϑΥʔϚοτνΣοΫ • unittest ࣮ߦ • Integration test ࣮ߦ • ΫϩʔϧઌαʔϏεͷߏ଄มԽݕ஌ $ git push git push ΛτϦΨʔʹ ࣗಈςετΛ࣮ߦ ࣗಈίʔυϨϏϡʔ $ ecs-goploy HJUQVTIͷ౓ʹࣗಈςετ͕࣮ߦ͞Ε͓ͯΓɺΫϩʔϥʔΛյͨ࣌͠ʹ͙͢ʹؾ͚ͮΔ ΫϩʔϥʔʹݶΒͣTDPVUZͷશͯͷαʔϏεʹಉ༷ͷ$*$%ύΠϓϥΠϯ͕੔උ͞Ε͍ͯΔ
  28. scouty Ϋϩʔϥʔͷ ChatOps σϓϩΠ࡞ۀ͸CPUʹΑΓࣗಈԽ͞Ε͍ͯΔͷͰ͍ͭͰ΋୭Ͱ΋࣮ߦͰ͖Δ

  29. scouty Ϋϩʔϥʔͷ؂ࢹ Ϋϩʔϥʔͷ֤TUBUTΛऩू͠ಈ࡞ঢ়گΛμογϡϘʔυͰৗʹ֬ೝͰ͖ΔΑ͏ʹ͍ͯ͠Δ

  30. ʮࠓޙͷల๬ʯ

  31. ʮੈͷதͷϛεϚονΛແ͘͢ʯ

  32. ਓʹؔ͢Δ͋ΒΏΔ৘ใΛ஝ੵ͠ɺ࠷ߴͷબ୒ࢶΛఏڙ͢Δɻ
 γεςϜʹΑͬͯϛεϚον͕ແ͍ੈքΛ࣮ݱ͢Δɻ scoutyͷ໨ࢦ͢ະདྷɾϏδϣϯ 1ਓ1ݸɺ
 scoutyΞΧ΢ϯτΛ
 ͍࣋ͬͯΔ ࠃ಺
 176Ґ ࠃ಺
 176Ґ

    ࣗࣾͷਓࣄ ଞࣾͷਓࣄ ໘ ஊ ධ Ձ ࣾ ಺ ධ Ձ ೥ ऩ ৘ ใ ͕̋̋ ޷͖ U X ৬ɾαʔϏεͷఏڙऀ ΋ͬͱ೥ऩͷߴ͍࢓ࣄ ΋ͬͱ΍Γ͕͍ͷ͋Δ࢓ࣄ ࣗ෼ʹ͔͠Ͱ͖ͳ͍࢓ࣄ ຊਓ ࣗݾਃࠂ
  33. ᅂ޷ੑ৘ใ ʮ͕̋̋޷͖ʯ ೳྗ৘ใ ʮࠃ಺̋̋Ґʯ ৬຿৘ใ ʮ೥ऩ̋̋ສԁʯ ʮೖ͔ࣾΒ̋೥ʯ ߦಈ৘ใ ʮϝοηʔδฦ৴཰̋ˋʯ ʮυλΩϟϯ཰̋ˋʯ

    ༩৴৘ใ ʮ೥ऩ̋̋ԁʯ ʮ࠴຿ͳ͠ʯ ઐ໳ܥSNS ݸਓܥSNS ࣾ಺ਓࣄ
 ͔Βͷ৘ใ ϏδωεSNS ಉ྅͔Βͷ
 ϨϑΝϨϯε ΠϕϯτSNS 1ਓ1ݸscoutyΞΧ΢ϯτΛ࣋ͪɺ
 ৘ใ͕ϥΠϑϩάͷΑ͏ʹ஝ੵ͢Δ ຊਓ Ӿཡ ৘ใฤू ৬ɾαʔϏε
 ͷఏڙऀ ݸਓʹύʔιφϥΠζͨ͠
 αʔϏεͷఏڙ Ӿཡ ৽نࣄۀ
  34. Ϋϩʔϥʔ։ൃऀϩʔϧͷࠓޙͷల๬ w Ϋϩʔϥʔͷ௥Ճɾӡ༻Λۃݶ·Ͱ؆қԽɾࣗಈԽ w σʔλΛར༻ͨ͠ԾઆݕূΛߴ଎Խ

  35. ࠷ޙʹ

  36. ͜ͷ৔ͰͲ͏ͯ͠΋ օ͞Μʹ͓఻͍͑ͨ͜͠ͱ͕͋Γ·͢

  37. https://scouty.co.jp scouty ͷ s ͸খจࣈͰ͢ʂ (Scouty → scouty)

  38. ʮੈͷதͷϛεϚονΛແ͘͢ʯ