広島の民泊データを分析しよう!
ౡͷຽധσʔλΛੳ͠Α͏ʂ2016/11/12 ؔࠜ༟لPyCon mini Hiroshima 2016
View Slide
ࣗݾհ• ؔࠜ༟لʢ͖ͤͶ ͻΖͷΓʣ• גࣜձࣾSQUEEZE• Twitter: @checkpoint
PythonͱͷؔΘΓʢ̍ʣ• PyCon JP 2014 ελοϑ• PyCon JP 2015 ෭࠲ʢϓϩάϥϜʣ• PyCon jp 2016 ελοϑ• Python͘͘ձʢओ࠵ʣ
PythonͱͷؔΘΓʢ̎ʣ• LLDiver• PyCon JP 2014• Phone Symposium Tokyo 2015• PyCon mini Hiroshima 2015• PyCon mini Hiroshima 2016• PythonΤϯδχΞཆಡຊʢڞஶʣ
ۀͰͷPython• ຽധ݅Λཧɺӡ༻͢ΔͨΊͷαʔϏε
ۀͰͷPython• ຽധ݅Λੳ͢ΔͨΊͷαʔϏε
༻ͯ͠Δٕज़
ΞδΣϯμ• ౡݝͷຽധʹ͍ͭͯ• PythonͰͷσʔλऩू• PythonͰͷσʔλੳ
ຽധͱҰൠͷຽՈʹ॓ധ͢Δ͜ͱʢ༷ʑͳܗଶʣ
ϓϥοτϑΥʔϜCOPYRIGHT (C) 2014-2016 SQUEEZE Inc.ALL RIGHTS RESERVED.
ϓϥοτϑΥʔϜʢຊʣ
ౡݝͷຽധ• தࠃɾ࢛ࠃํͰҰ൪େ͖ͳࢢʢౡࢢʣ• ੈքҨ࢈ΛؚΉ๛͔ͳ؍ޫࢿݯ• ΦόϚถେ౷ྖͷ๚• ౡΧʔϓͷηϦʔά༏উ• ຽധΓ্͕͖͍ͬͯͯΔͣʂ
ຽധσʔλͷੳ• σʔλͷऩू• σʔλͷੳ• σʔλͷදࣔ
σʔλͷऩू• ΫϩʔϦϯά• εΫϨΠϐϯά• ౷ܭσʔλ• ૯ল౷ܭہ• σʔλΧλϩάαΠτ
ΫϩʔϦϯά• ӳޠͷҙຯɺ[͏ɺΏͬ͘ΓਐΉ]• WebϖʔδͷϦϯΫͷ༰ΛͨͲΔ• Webϖʔδͷ༰Λμϯϩʔυͯ͠ऩू• Web APIͷσʔλΛऔΔ߹͋Δ
εΫϨΠϐϯά• ӳޠͷҙຯɺ[ Δ͜ͱ ]• ϖʔδͷ༰͔ΒඞཁͳใΛநग़
όοςϦʔଐݴޠʴڧྗͳαʔυύʔςΟϥΠϒϥϦ
ศརͳϥΠϒϥϦ• ඪ४ϥΠϒϥϦ• requests• BeautifulSoup• Scrapy• Selenium
ඪ४ϥΠϒϥϦ• Pythonͷඪ४ϥΠϒϥϦͱͯॆ࣮• ωοτϫʔΫɺਖ਼نදݱɺetc• Pythonͷॲཧܥ͚ͩ͋Εྑ͍• ؆୯ͳεΫϨΠϐϯάͰ͋Εे࣮༻త
αϯϓϧ
Requests• PythonͷHTTP Client• ਓؒʹ༏͍͠ΠϯλʔϑΣʔε• ͱʹ͔͘Θ͔Γ͍͢• γϯϓϧ͔ͭڧྗ
ެࣜαΠταϯϓϧ
αϯϓϧ(requests൛ʣ
Beautiful Soup• 2004Ґ͔Βଘࡏ͢ΔϥΠϒϥϦ• HTMLXML͔ΒσʔλΛநग़ͯ͠औಘ• ࠷৽όʔγϣϯBeautiful Soup 4ܥ• Python 2.7ɺPython 3.2ʹରԠ
ScrapyScarpyͯ͘ɺϋΠϨϕϧͳεΫϨΠϐϯάΫϩʔϥʔͷϑϨʔϜϫʔΫɻWebαΠτͷΫϩʔϧͱɺߏԽ͞ΕͨσʔλΛऔΓग़͢ͷʹ༻͢Δɻ෯͍తʹ༻Ͱ͖ΔɻσʔλϚΠχϯά͔ΒɺϞχλϦϯάɺࣗಈςετͳͲ
Scrapyͷಛ• ΫϩʔϦϯάɺεΫϨΠϐϯάϑϨʔϜϫʔΫ• DjangoʹӨڹ͞Ε͍ͯΔʢMiddlewareͳͲʣ• εΫϨΠϐϯάʹඞཁͳػೳ͕ͦΖ͍ͬͯΔ• υΩϡϝϯτ͕ॆ࣮͍ͯ͠Δ
Scrapyͷओͳػೳ• μϯϩʔυɺநग़ɺอଘ• μϯϩʔυͨ͠υΩϡϝϯτͷΩϟογϡ• ڧྗͳίϚϯυϥΠϯγΣϧ• Robots.txtͷύʔε• ඇಉظɺฒߦμϯϩʔυʢTwistedΛ༻ʣ• υϝΠϯɺIPΞυϨε୯ҐͷΫϩʔϧִؒௐ• Τϥʔ࣌ͷϦτϥΠ• ϩάग़ྗ
։ൃखॱ• ScrapyϓϩδΣΫτͷ࡞• SpiderΛ࡞ʢϦϯΫநग़ɺμϯϩʔυʣ• ItemύΠϓϥΠϯͰσʔλΛอଘ
ϓϩδΣΫτͷ࡞$ scrapy startproject scrapy_sample
Spider࡞ʢެࣜαΠτΑΓʣ
࣮ߦ$ scrapy crawl dmoz_spider -o scraped_data.json
ৄࡉ• Scrapyೖʢ̍ʣ• Scrapyೖʢ̎ʣ
αϯϓϧʢ̍ʣ
αϯϓϧʢ̎ʣ
࣮ࡍͷࣄྫͷհ• ౡݝͷຽധσʔλΛੳ• ݅ใ• Ձ֨ใ
݅ใʢαΠτʣ
։ൃͷྲྀΕ• ݅ɺՁ֨ใऔಘ༻ͷεύΠμʔΛ࡞• εύΠμʔ͕Ұ࣌σʔλΛอଘʢJSONʣ• όονॲཧʹͯ݅ɺՁ֨ΛอଘʢΫϨϯδϯάʣ• ूܭόονʹͯσʔλΛੳͯ͠DBʹอଘ• ूܭσʔλΛදࣔ
σϞ
݅0501001502002503003504004505002016/2/152016/2/222016/2/292016/3/72016/3/142016/3/212016/3/282016/4/42016/4/112016/4/182016/4/252016/5/22016/5/92016/5/162016/5/232016/5/302016/6/62016/6/132016/6/202016/6/272016/7/42016/7/112016/7/182016/7/252016/8/12016/8/82016/8/152016/8/222016/8/292016/9/52016/9/122016/9/192016/9/262016/10/32016/10…2016/10…2016/10…2016/10…2016/11/72016/11…2016/11…2016/11…2016/12/52016/12…2016/12…2016/12…
݅• ݅ 461݅• 1Ͱ2ഒʢ240݅ => 461݅)• શࠃͰ10൪ʹଟ͍• ౦ژ, େࡕ, ژ, ԭೄ݅, ւಓ, Ԭ݅ɺਆಸ݅, ݅, Ѫ݅, ઍ༿ݝ, ౡݝ
ฏۉՁ֨020004000600080001000012000
ฏۉՁ֨• ౙฏۉՁ͕͍֨ʢ5000ԁʣ• 8݄, 10݄, 11݄ͷि͕ߴ͍ʢ8000ʣ• ɺ͓ਖ਼݄͕ϐʔΫʢ10000ԁʣ
Քಇ0102030405060708090100
Քಇ• Նͷγʔζϯ͕ϐʔΫʢ80%ऑʣ• 10݄, 11݄ͷिߴ͍ʢ70%Ҏ্ʣ• ౙͷγʔζϯ͍ʢ40%ҎԼʣ• 10/15ʢ), 10/29ʢʣ͕ߴ͔ͬͨ
·ͱΊ• PythonͰεΫϨΠϐϯάΛߦ͏߹ɺ৭ʑͳΞϓϩʔν͕͋Δɻ• Scrapy໘ͳॲཧΛߦͬͯ͘ΕΔͷͰΦεεϝ• ౡͷຽധ͜Ε͔ΒΓ্͕Δͣʂ
͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠