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

Pythonで始めるスクレイピング / Starting scraping in Python

Pythonで始めるスクレイピング / Starting scraping in Python

■イベント 

「技育祭(開催延期)」

https://talent.supporterz.jp/geeksai/2020/

■登壇概要

タイトル:Pythonで始めるスクレイピング

発表者: 
DSOC 研究開発部 Data Analysis Group 高橋 寛治

▼Sansan R&D Twitter
https://twitter.com/SansanRandD

Sansan DSOC

March 15, 2020
Tweet

More Decks by Sansan DSOC

Other Decks in Technology

Transcript

  1. 2 ࠓ೔ͷ͓͸ͳ͠ 8FCΫϩʔϦϯάˍ εΫϨΠϐϯάͷ֓ཁ ֓೦ͷ೺Ѳ 1ZUIPOͰͷ؆୯ͳྫ ࣮ફͰͷٕज़ɾϚφʔ 4DSBQZϑϨʔϜϫʔΫ ͷ঺հ ϔουϨεϒϥ΢β

    Ϛφʔ εΫϨΠϐϯά ϋϯζΦϯ (PPHMF$PMBCPSBUPSZ Λ࢖ͬͯɺεΫϨΠϐ ϯάΛମݧ͢Δ 自由自在にHTMLから情報抽出する 10分 20分 40分 【こんな方にオススメ】 ・スクレイピングを始めたい、始めたばかり ・機械学習やWebサイト構築のために自分でデ ータを集めたい
  2. 8FCΫϩʔϦϯάͱεΫϨΠϐϯά ΫϩʔϦϯά 8FCαΠτ͔Β)5.-ͳͲΛऔಘ 4 εΫϨΠϐϯά )5.-͔Β৘ใநग़ サイト サイト サイト サイト

    HTML HTML <head> <title>Hoge</title> </head> <body> <h1>Fuga</h1> </body> タイトル:Hoge 見出し1:Fuga クローラ
  3. )5.- )ZQFS5FYU.BSLVQ-BOHVBHF ˓ ॻମɾαΠζɾߏ଄ͳͲΛهड़͢Δݴޠ ˔ ྫɿ5F9 9.- 47( ˓)5.-ͷྫ 5

    <body> <h1>見出し1</h1> <p>これが本文です</p> <h2>見出し1.1</h2> <a href="url/to/hoge">リンク</a> </body>
  4. )5.-ͷऔಘ Ϋϩʔϧ ਓؒͷͨΊͷ)551ϥΠϒϥϦ SFRVFTUTϥΠϒϥϦΛར༻ ͜Ε͚ͩͰ)5.-औಘՄೳ 6 >>> import requests >>>

    r = requests.get("https://supporterzcolab.com/event/555/") >>> r.text '<!DOCTYPE html>¥n<html lang="ja" xmlns...
  5. ৘ใநग़ʢεΫϨΠϐϯάʣ ਖ਼نදݱͰ·ͣ͸औಘ ࣮ࡍ͸όάͷԹচͳͷͰϑϨʔϜϫʔΫΛ࢖͏ ྫ QSFUJUMF΄͛UJUMFQSF 7 >>> import re >>>

    re.search(r"<title>(.*?)</title>", r.text).group(1) '【サポーターズCoLab勉強会】Pythonで始めるスクレイピング - サポーターズCoLab'
  6. #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") <title>【サポーターズCoLab勉強会】Pythonで始めるスクレイピング - サポーターズCoLab</title>
  7. #FBVUJGVM4PVQͷࢦఆํ๏ ެࣜϚχϡΞϧΛҰಡ͢Δͱྑ͍ ˓ϑΟϧλʔʹ౉ͤΔ΋ͷ 11 >>> soup.find_all("title") # 文字列 [<title>【サポーターズCoLab勉強会】Pythonで始めるスクレイピング -

    サポーターズCoLab</title>] >>> soup.find_all(re.compile(r”tle$”)) # 正規表現 [<title>【サポーターズCoLab勉強会】Pythonで始めるスクレイピング - サポーターズCoLab</title>] >>> soup.find_all(["title", "a"]) # リスト [<title>【サポーターズCoLab勉強会】Pythonで始めるスクレイピング - サポーターズCoLab</title>, <a ...] >>> soup.find_all(True) # すべて ... >>> soup.find_all(lambda tag: "ymd" in tag.get("class", "")) # 関数 [<p class="ymd">2018/10/10(水)</p>]
  8. ද͸QBOEBT ϖʔδ಺ͷ5BCMF܈Λ%BUB'SBNFͷϦετͰ ฦ͢ 12 >>> import pandas as pd >>>

    dfs = pd.read_html("http://www.htmq.com/html/table.shtml") >>> dfs[0]
  9. 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に戻る
  10. 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'
  11. ຊจࢦఆΛࣗಈԽ ˓ຊจநग़ΞϧΰϦζϜΛ࢖͏ ˔ SFBEBCJMJUZMYNM ˔ FYUSBDUDPOUFOU ͲͷαΠτ΋͏·͍͘͘Θ͚Ͱ͸ͳ͍͕ ϝϯςφϯείετΛݮΒͤΔ 21 >>>

    from extractcontent3 import ExtractContent >>> extractor = ExtractContent() >>> html = open("target.html").read() >>> extractor.analyse(html) >>> text, title = extractor.as_text()
  12. ͦͷଞ ˓ܧଓతͳΫϩʔϦϯά ˔ DSPO΍όονδϣϒͱͯ͠ఆظ࣮ߦ ˔ ϦΫΤετࡁΈ63-ʹ͸ΞΫηε͠ͳ͍ ˓ೝূ SFRVFTUT ˔ CBTJDೝূ͸ɺ*%ͱ18ΛҾ਺ʹ౉͚ͩ͢

    ˔ 0"VUIೝূ͸एׯखॱ͕૿͑Δ͕ɺ౉͚ͩ͢ ˓SFRVFTUTͷจࣈίʔυ ˔ SFTQPOTFFODPEJOHSFTQPOTFBQQBSFOU@FODPEJOH ˓ྫ֎ॲཧ ˔ ύʔεΤϥʔɺೝূΤϥʔɺλΠϜΞ΢τŋŋŋ ˔ ཁ݅ʹ߹Θͤͯઃܭ͕ඞཁ 22