Slide 1

Slide 1 text

1ZUIPOͰ࢝ΊΔ εΫϨΠϐϯά 1 ߴڮ ׮࣏ !LBOKJUS

Slide 2

Slide 2 text

1 ※掲載されている内容等は発表時点の情報です。 ※公開に当たり、 資料の一部を変更・削除している場合があります。

Slide 3

Slide 3 text

2 ࠓ೔ͷ͓͸ͳ͠ 8FCΫϩʔϦϯάˍ εΫϨΠϐϯάͷ֓ཁ ֓೦ͷ೺Ѳ 1ZUIPOͰͷ؆୯ͳྫ ࣮ફͰͷٕज़ɾϚφʔ 4DSBQZϑϨʔϜϫʔΫ ͷ঺հ ϔουϨεϒϥ΢β Ϛφʔ εΫϨΠϐϯά ϋϯζΦϯ (PPHMF$PMBCPSBUPSZ Λ࢖ͬͯɺεΫϨΠϐ ϯάΛମݧ͢Δ 自由自在にHTMLから情報抽出する 10分 20分 40分 【こんな方にオススメ】 ・スクレイピングを始めたい、始めたばかり ・機械学習やWebサイト構築のために自分でデ ータを集めたい

Slide 4

Slide 4 text

8FCΫϩʔϦϯάˍ εΫϨΠϐϯάͷ֓ཁ 3

Slide 5

Slide 5 text

8FCΫϩʔϦϯάͱεΫϨΠϐϯά ΫϩʔϦϯά 8FCαΠτ͔Β)5.-ͳͲΛऔಘ 4 εΫϨΠϐϯά )5.-͔Β৘ใநग़ サイト サイト サイト サイト HTML HTML Hoge

Fuga

タイトル:Hoge 見出し1:Fuga クローラ

Slide 6

Slide 6 text

)5.- )ZQFS5FYU.BSLVQ-BOHVBHF ˓ ॻମɾαΠζɾߏ଄ͳͲΛهड़͢Δݴޠ ˔ ྫɿ5F9 9.- 47( ˓)5.-ͷྫ 5

見出し1

これが本文です

見出し1.1

リンク

Slide 7

Slide 7 text

)5.-ͷऔಘ Ϋϩʔϧ ਓؒͷͨΊͷ)551ϥΠϒϥϦ SFRVFTUTϥΠϒϥϦΛར༻ ͜Ε͚ͩͰ)5.-औಘՄೳ 6 >>> import requests >>> r = requests.get("https://supporterzcolab.com/event/555/") >>> r.text '¥n

Slide 8

Slide 8 text

৘ใநग़ʢεΫϨΠϐϯάʣ ਖ਼نදݱͰ·ͣ͸औಘ ࣮ࡍ͸όάͷԹচͳͷͰϑϨʔϜϫʔΫΛ࢖͏ ྫ QSFUJUMF΄͛UJUMFQSF 7 >>> import re >>> re.search(r"(.*?)", r.text).group(1) '【サポーターズCoLab勉強会】Pythonで始めるスクレイピング - サポーターズCoLab'

Slide 9

Slide 9 text

#FBVUJGVM4PVQ )5.-΍9.-͔Β৘ใநग़͢ΔͨΊͷϥΠϒϥϦ ͓खܰʹཁૉΛநग़Ͱ͖Δ 8 >>> import requests >>> from bs4 import BeautifulSoup >>> r = requests.get("https://supporterzcolab.com/event/555/") >>> soup = BeautifulSoup(r.content, "lxml") >>> soup.find("title") 【サポーターズCoLab勉強会】Pythonで始めるスクレイピング - サポーターズCoLab

Slide 10

Slide 10 text

#FBVUJGVM4PVQ $44ηϨΫλ ͓खܰʹཁૉΛநग़Ͱ͖Δ 9 >>> soup.select("title") [【サポーターズCoLab勉強会】Pythonで始めるスクレイピング - サポーターズCoLab]

Slide 11

Slide 11 text

ྫɿษڧձϖʔδ͔Β։࠵೔Λநग़  σϕϩούʔπʔϧͰཁૉΛΫϦοΫ  )5.-ΛݟͯɺಛఆʹඞཁͳཁૉΛ֬ೝ  ίʔυΛॻ͘ 10 >>> soup.find("span", class_="dtstart").find("p", class_="ymd").text  ਫ 

Slide 12

Slide 12 text

#FBVUJGVM4PVQͷࢦఆํ๏ ެࣜϚχϡΞϧΛҰಡ͢Δͱྑ͍ ˓ϑΟϧλʔʹ౉ͤΔ΋ͷ 11 >>> soup.find_all("title") # 文字列 [【サポーターズCoLab勉強会】Pythonで始めるスクレイピング - サポーターズCoLab] >>> soup.find_all(re.compile(r”tle$”)) # 正規表現 [【サポーターズCoLab勉強会】Pythonで始めるスクレイピング - サポーターズCoLab] >>> soup.find_all(["title", "a"]) # リスト [【サポーターズCoLab勉強会】Pythonで始めるスクレイピング - サポーターズCoLab, >> soup.find_all(True) # すべて ... >>> soup.find_all(lambda tag: "ymd" in tag.get("class", "")) # 関数 [

2018/10/10(水)

]

Slide 13

Slide 13 text

ද͸QBOEBT ϖʔδ಺ͷ5BCMF܈Λ%BUB'SBNFͷϦετͰ ฦ͢ 12 >>> import pandas as pd >>> dfs = pd.read_html("http://www.htmq.com/html/table.shtml") >>> dfs[0]

Slide 14

Slide 14 text

࣮ફͰͷٕज़ɾϚφʔ 13

Slide 15

Slide 15 text

࣮ફͰͷٕज़ͷॳาͷॳาΛ঺հ େن໛ʹؤ݈ʹ৘ใΛऔಘ ˠ4DSBQZΛ࢖͏ KBWBTDSJQUʹΑΔಈతϨϯμϦϯάʹରԠ ˠϔουϨεϒϥ΢βΛ࢖͏ ຊจͷཁૉࢦఆΛࣗಈԽ͢Δ 14

Slide 16

Slide 16 text

4DSBQZ ˓ΫϩʔϧˍεΫϨΠϐϯάͷॲཧΛखܰʹ ॻ͚ΔϑϨʔϜϫʔΫ ˔ 63-ͱऔಘ͍߲ͨ͠໨ JUFN Λهड़͢Δ ˔ "844΍.POHP%#΁ͷอଘͳͲɺεΫϨΠϐ ϯάޙͷॲཧ͕؆୯ ˓࣮ӡ༻͸͍Ζ͍Ζߟ͑Δ͜ͱΞϦ ˔ ΫϩʔϧͱεΫϨΠϐϯά͕ಉ࣌ਐߦ 15

Slide 17

Slide 17 text

4DSBQZͷ%BUBGMPX֓؍ େࣄͳͷ͸&OHJOF͕ԿΛ͍ͯ͠Δ͔Λ஌Δ͜ͱ 16 図は公式サイトより 1. EngineがSpiderから1発目の Requestsを受け取る 2. EngineがRequestsをSchedulerに 送る 3. Schedulerは次のRequestsを受け 取る 4. EngineはRequestsをDownloader に送る 5. ResponseをDownloaderが生成 6. EngineがResponseを受け取り Spiderに渡す 7. Spiderはスクレイプしたアイテム と新しいリクエスト先を送る 8. Engineは受け取ったアイテムを ITEM Pipelinesに送ると同時に、 次のリクエストをSchedulerに送る 9. ステップ1に戻る

Slide 18

Slide 18 text

4DSBQZͷ࢝Ίํ ˓ϓϩδΣΫτΛ࡞੒ ˔ Ұͭͷ໨తͷͨΊͷΫϩʔϥˍεΫϨΠύʔ܈ ˓4DSBQZTIFMMͰࢼ࡞ ˔ εΫϨΠϐϯά෦෼Λࢼ࡞ ˓4QJEFSΛ࡞੒ ˔ ϦϯΫղੳ͓Αͼϖʔδ৘ใͷεΫϨΠϐϯάํ ๏ QBSTFϝιου Λهड़ ˓4QJEFSͷ࣮ߦ 17 $ scrapy startproject hoge_project $ scrapy shell “URL” $ scrapy crawl hoge_spider

Slide 19

Slide 19 text

ྫɿ4DSBQZͰ$PMBCΛऔಘ  ৽ணΠϕϯτϖʔδΛ଍͕͔Γʹ͢Δ  ษڧձҰཡΛऔಘ  औಘͨ͠ษڧձͷ಺༰ΛεΫϨΠϓ εϥΠυͰίʔυྫΛઆ໌Ͱ͖ΔྔͰ͸ ͳ͍ͷͰׂѪ 18

Slide 20

Slide 20 text

ಈతʹੜ੒͞ΕΔϖʔδ΁ͷରॲ (&5ϦΫΤετ͚ͩͩͱϖʔδ͕ੜ੒͞Εͳ ͍ͨΊɺϔουϨεϒϥ΢β IFBEMFTT DISPNFͳͲ ʹΑΓϨϯμϦϯά 3FRVFTUT)5.-Λར༻ ʼϔουϨεϒϥ΢βΛϥοϐϯά 19

Slide 21

Slide 21 text

3FRVFTUT)5.- ਓؒͷͨΊͷ)5.-ύʔε 20 >>> from requests_html import HTMLSession >>> session = HTMLSession() >>> r = session.get("https://supporterzcolab.com/event/555/") >>> r.html.render() # 初回時は自動でヘッドレスブラウザをダウンロード >>> r.html.find("title", first=True).text # CSSセレクタが利用可能 '【サポーターズCoLab勉強会】Pythonで始めるスクレイピング - サポーターズCoLab'

Slide 22

Slide 22 text

ຊจࢦఆΛࣗಈԽ ˓ຊจநग़ΞϧΰϦζϜΛ࢖͏ ˔ SFBEBCJMJUZMYNM ˔ FYUSBDUDPOUFOU ͲͷαΠτ΋͏·͍͘͘Θ͚Ͱ͸ͳ͍͕ ϝϯςφϯείετΛݮΒͤΔ 21 >>> from extractcontent3 import ExtractContent >>> extractor = ExtractContent() >>> html = open("target.html").read() >>> extractor.analyse(html) >>> text, title = extractor.as_text()

Slide 23

Slide 23 text

ͦͷଞ ˓ܧଓతͳΫϩʔϦϯά ˔ DSPO΍όονδϣϒͱͯ͠ఆظ࣮ߦ ˔ ϦΫΤετࡁΈ63-ʹ͸ΞΫηε͠ͳ͍ ˓ೝূ SFRVFTUT ˔ CBTJDೝূ͸ɺ*%ͱ18ΛҾ਺ʹ౉͚ͩ͢ ˔ 0"VUIೝূ͸एׯखॱ͕૿͑Δ͕ɺ౉͚ͩ͢ ˓SFRVFTUTͷจࣈίʔυ ˔ SFTQPOTFFODPEJOHSFTQPOTFBQQBSFOU@FODPEJOH ˓ྫ֎ॲཧ ˔ ύʔεΤϥʔɺೝূΤϥʔɺλΠϜΞ΢τŋŋŋ ˔ ཁ݅ʹ߹Θͤͯઃܭ͕ඞཁ 22

Slide 24

Slide 24 text

“ ๏ྩ९क͸΋ͪΖΜ Ϛφʔ͕େࣄ 23

Slide 25

Slide 25 text

SPCPUTUYUͱαΠτϚοϓΛ֬ೝ͢Δ ϧʔτ௚ԼͷSPCPUTUYUʹΫϩʔϧͷՄ൱΍ αΠτϚοϓͷYNM΁ͷύε͕هࡌ ྫɿ͸ͯͳϒϩάIUUQTLBOKJIBUFOBCMPHKQSPCPUTUYU 24 6TFSBHFOU 4JUFNBQIUUQTLBOKJIBUFOBCMPHKQTJUFNBQ@JOEFYYNM %JTBMMPXBQJ %JTBMMPXESBGU

Slide 26

Slide 26 text

6TFS"HFOUʹ࿈བྷઌΛ໌ه Կ͔͋ͬͨࡍʹɺαʔό؅ཧऀ͕ϩάΛݟͯ ࿈བྷͰ͖Δ SFRVFTUTͷྫ 25 >>> headers = {'User-Agent': 'Hoge Crawler/0.1 (http://hoge.com)'} >>> response = requests.get(url, headers=headers)

Slide 27

Slide 27 text

୹࣌ؒͷେྔͷΞΫηε͸ආ͚Δ ૬खαʔόʹෛՙΛ͔͚ͳ͍ 26 >>> import time >>> for url in urls: r = requests.get(url) time.sleep(3)

Slide 28

Slide 28 text

εΫϨΠϐϯάϋϯζΦϯ 復習することで理解する https://colab.research.google.com/drive/18akzlJ_poblm9T_rsMDAhrT YOZse4IEK 27

Slide 29

Slide 29 text

͓ΘΓʹ ·ͱΊ ˓ 8FCΫϩʔϦϯάͱεΫϨΠϐϯάͷ֓ཁ঺հ ˓ 1ZUIPOͰͷ࣮ફɾϚφʔ ˓ ϋϯζΦϯͰೖ໳ ࣭໰͸ؾܰʹͲ͏ͧ !LBOKJUS 28