Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

2017/12/21 虎の穴 Python勉強会

3,215 views

Published on

他言語エンジニアのためのPython入門&クローリング&スクレイピング入門

Published in: Engineering
  • Hi there! I just wanted to share a list of sites that helped me a lot during my studies: .................................................................................................................................... www.EssayWrite.best - Write an essay .................................................................................................................................... www.LitReview.xyz - Summary of books .................................................................................................................................... www.Coursework.best - Online coursework .................................................................................................................................... www.Dissertations.me - proquest dissertations .................................................................................................................................... www.ReMovie.club - Movies reviews .................................................................................................................................... www.WebSlides.vip - Best powerpoint presentations .................................................................................................................................... www.WritePaper.info - Write a research paper .................................................................................................................................... www.EddyHelp.com - Homework help online .................................................................................................................................... www.MyResumeHelp.net - Professional resume writing service .................................................................................................................................. www.HelpWriting.net - Help with writing any papers ......................................................................................................................................... Save so as not to lose
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Writing good research paper is quite easy and very difficult simultaneously. It depends on the individual skill set also. You can get help from research paper writing. Check out, please HelpWriting.net
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Be the first to like this

2017/12/21 虎の穴 Python勉強会

  1. 1. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 他言語エンジニアの ためのPython入門 虎の穴 開発室 白井 尊昭
  2. 2. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. タイムテーブル 時刻 内容 19:00 開場・受付 19:30 開会案内・会場説明 19:35 発表者: 開発室 白井 他言語エンジニアのためのPython入門 (スライド発表+ハンズオン+演習) 2. Pythonではじめるオタク向けサービス 開発(クローリング&スクレイピング) 21:05 休憩&LT準備 21:15 LT×3名→1名 21:30 終了 1
  3. 3. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 目次 • はじめに • Pythonとは • Pythonことはじめ – インストール+環境構築からデータ構造・制御構造ま で一通り紹介 • Pythonによるクローリング&スクレイピング入 門 • その他のトピック 2
  4. 4. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 自己紹介 白井 尊昭 所属: 開発室(エンジニアとデザイナが在籍) • 2014年4月〜(株)ブレインパッド エンジニ ア 広告系のASPサービス開発 • 2017年10月〜(株)虎の穴 エンジニア 新規サービスの開発 • 好きなアニメ: 攻殻機動隊、PSYCHO-PASS (最近は) Just Because • 好きな漫画: (最近は) ヒナまつり 3
  5. 5. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 勉強会の目的 • 他のオブジェクト指向言語(Java, Ruby, …) は使えるがPythonはよく知らないので 概要を知りたい方向け – 基本的なデータ構造や制御構造だけでなく 学習方法やIDEなど自学するための入り口も紹介 • オタクアプリなど、好きなサービスを自分で Pythonで作るためのきっかけ作り – 今回はクローリング&スクレイピングまで – Webアプリの作り方は範囲外(今後予定) 4
  6. 6. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 虎の穴とPython • 株式会社虎の穴では言語はRubyを主に採用 – RubyWorld Conference 2017や福岡RubyKaigi 02出展 • Pythonに興味はあるがサービスで 使ったことのないエンジニアが社内では多い • Ruby以外の言語も選択肢として増やしておきた い 5 社内でPython勉強会を開催&社外にも共有
  7. 7. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 勉強会の進め方 • 発表聴講+ハンズオン形式 –ときどき軽い演習 • 質問あれば随時受け付けます! 6
  8. 8. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. Pythonとは • いわゆるLL言語 (軽量プログラミング言語) • オブジェクト指向言語 • なぜPythonという名前? × Python (ニシキヘビ) ◯ Monty Python‘s Flying Circus (空飛ぶモンティ・パイソン、 イギリスのコメディ番組) 7 https://docs.python.jp/3/faq/general.html#why-is-it-called-python
  9. 9. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. Pythonの特徴 • 動的で強い型付け – (動的)プログラム実行時にデータ型が見いだされる – (強い)型付けが常に強制 例: 整数型を文字列型のように扱うには 明示的に変換 • バッテリー同梱(batteries included) – 標準で様々な機能を利用できる。 例: emailパッケージで電子メール向けのメッセージデコー ドなど • 機械学習やデータ分析の用途に適している(後述) 8
  10. 10. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 用途 • 機械学習 – データから学習してモデルをつくること 例: 人の顔を判別するモデル – ライブラリが豊富 • TensorFlow, Chainer, scikit-learn, PySpark, … – 機械学習向けの環境構築が楽(Minicondaなど) • データ分析 – PandasやJupyter • Webアプリケーション – フレームワークはDjangoやFlaskが有名 9 参考: https://www.python.org/about/apps/
  11. 11. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. The Zen of Python (Pythonの禅) “Python を理解し利用する上での導きとなる、 Python の設計原則と哲学をリストにしたもの” 対話プロンプトで”import this”とすると… >>> import this The Zen of Python, by Tim Peters Beautiful is better than ugly. … (略) 10 参考: https://docs.python.jp/3/glossary.html
  12. 12. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 例: Explicit is better than implicit. 訳: 暗黙よりも明示(的に書くこと)の方が良い。 ※配下の全モジュールをimportするのでなく、 必要なものを直指定すべき、など from os import * print(getcwd()) ↓ import os print(os.getcwd()) 11 https://qiita.com/IshitaTakeshi/items/e4145921c8dbf7ba57ef
  13. 13. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. Pythonの歴史(2系と3系が共存) リリース 西暦年 備考 0.9.0 1991 Guido van RossumがABC言語の後継として生み出す 2.0 2000 Python 2.x系リリース 3.0 2008 Python 3.x系リリース 2.7 2010 Python 2.xの最後のメジャーリリース 2017 Python 3.6.3リリース(最新版) 2020 Python 2.xのサポート(セキュリティアップデートや バグフィックス)終了 12 http://docs.python.jp
  14. 14. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. Python3.xを利用しよう • 結論: Python2.xでなくPython3.xでほぼ問題なし • 主要ライブラリの対応状況: ほぼPython3.x対応 – https://python3wos.appspot.com/ • Google App Engineを使う場合は注意 – Standard environmentはPython 2.7のみ • ネット上の情報はバージョンに注意 ライブラリの利用方法が違ったりするため 13
  15. 15. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. Pythonのトレンド 各種プログラミング言語ランキングでは上位常連 (例) PYPL: PopularitY of Programming Language – Pythonは常に上昇傾向(そろそろ首位) – チュートリアルの検索回数をもとに作られたイン デックス(シェア) 14 http://pypl.github.io/PYPL.html
  16. 16. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. Pythonことはじめ 15
  17. 17. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 内容 • インストール(事前にお願いしました) • (仮想)環境構築 • Hello, world! • データ型 • 制御構造(if, while, for) • 関数・クラス • ファイル入出力 16
  18. 18. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. Python3のインストール • Windows – https://www.python.org/ > Downloads > Windows > 3.6.4 – https://qiita.com/taiponrock/items/f574dd2cddf8851fb02c • Mac – 2.xは標準でインストール済 – https://qiita.com/1000ch/items/93841f76ea52551b6a97 • ※pyenvは複数バージョンのインストールに利用。3.6.3をイン ストール – (homebrewでも可) brew install python3 • これのみだとpython3と毎回打つ必要 17
  19. 19. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. venvで仮想的にPythonの環境を構築 • 仮想的にPythonの環境を構築できる 標準パッケージ • ディレクトリごとに、異なるPythonバージョン やパッケージの環境を利用可能 – 同一バージョンを複数使い分けることも可能 • Python3.3以上でのみ利用可、 それ以前ならvirtualenvをインストールして利用 が一般的 18
  20. 20. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. venvの使い方 $ cd ~/projects $ python -m venv py # 仮想環境の作成 $ cd py $ source bin/activate # 仮想環境を有効化 (py) $ which python /Users/xxx/projects/py/bin/python(py) (py) $ deactivate # 仮想環境を無効化 $ which python /Users/xxx/.pyenv/shims/python #環境による 19 注意: 以降、仮想環境での実行を想定
  21. 21. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 開発環境 • PyCharm(パイチャーム)またはIntelliJ IDEA + Python plugin – PyCharm: JetBrainsが開発したPython用のIDE。 無償版でも十分(有償は高め) – IntelliJ IDEA + Python plugin: PyCharmと基本的に Pythonの機能は同じ →HTMLやCSSなどWeb開発も便利にしたいならこちら – この環境がオススメ • Jupyter Notebook – ブラウザでかんたんに試行錯誤しながらコーディングして実行 結果を保存したりできる • 各エディタ – AtomやEmacsなど 20
  22. 22. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. PEP8: スタイルガイド • PEP8: Pythonコードのスタイルガイド(ペップエイト) • Pythonのコードを読みやすく、スタイル統一するための規約 • PEP: Python Enhancement Proposal(Python拡張提案) • 新機能の提案やガイドラインの説明などをするためのドキュメント • https://www.python.org/dev/peps/pep-0008/ • (個人による日本語訳の例: https://github.com/mumumu/pep8-ja) • PEP8の例 • 1段階のインデントには4つのスペースを使う • クラス内のメソッド定義は空白行1つで区切る • 関数名は小文字で、可読性のために必要とされる場合に単語を アンダースコアで区切る • PEP8 チェックツール: flake8(フレークエイト) がおすすめ(コードのエラーチェックなどもできる) 21
  23. 23. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. Hello, world! 1. コンソールで実行 $ python … >>> print(“Hello, Akihabara!”) Hello, Akihabara! >>> exit() # 終了 2. ファイルを指定して実行 (ファイルhello.pyに同じ内容を記述) $ python hello.py Hello, world! 22
  24. 24. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. ブロック Pythonではブロックはインデントで記述し、 括弧は用いない PEP8ではスペース4つが推奨 if x == 0: print(“hoge”) else: print(“fuga”) 23 Python Ruby Java インデント end { … }
  25. 25. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. データ型 • 整数型、文字列型、リスト型、辞書型… • 整数型と文字列型を+で演算はできない、 などの制限が存在(強い型付け) • 型を調べるには組み込み関数typeを利用 >>> type(123) <type ‘int’> ※プリミティブ型は存在しない ※Javaでいうプリミティブ型: byte, int, float, … Pythonでは全てがオブジェクトであり型をもつ 24
  26. 26. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 変数 • 宣言不要 • 「x = 3」で代入可、「x + 10」などでxを参照可 能 • 「x = “aaa”」などとすると新たなxを作成し代入 (「3」は破棄) • 定数は存在しない ※PEP8では定数的扱いをするものの命名は HOGE_FUGAを推奨 25 Python Ruby Java 変数宣言 不要 不要 型宣言 定数 なし あり あり
  27. 27. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 数値 • 整数型、実数型、複素数型、ブール型が存在 • 算術演算(四則演算や剰余算など)ができる >>> type(1) # 整数型 <type 'int'> >>> type(1.1) # 実数型 <type 'float'> >>> type(1+2j) # 複素数型 <type 'complex'> >>> type(True) #ブール型 <type 'bool'> 26 Python Ruby Java 整数 int Integer short int long 小数 点数 float decimal Float float double 複素 数 complex Complex × ブー ル bool Boolean boolean
  28. 28. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. Tips: 厳密な計算が必要ならDecimal • floatは浮動小数点数のため10進数の演算ではない >>> 1.1 + 2.2 3.3000000000000003 • 任意の数を10進数で正確に表すには固定小数点数型 >>> from decimal import Decimal >>> decimal.Decimal('0.1') + decimal.Decimal('0.2’) Decimal('0.3') • 決済などお金を扱うのに便利 • 標準モジュールには含まれるが広く使われる型ではない • 注意: 以下は無意味(もとの値が浮動小数点数なら意図 しない値に) >>> decimal.Decimal(0.1) 27
  29. 29. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 文字列型 • 文字を扱うための型。他言語でいう文字型charは存 在しない – ‘あいうえお’や’hogehoge’など • 非可変(変更不可) • できること – 文字列と文字列を結合して 新たな文字列を作成 – 文字列の一部分を切り出して 新たな文字列を作成 – など 28 Python Ruby Java string str String String char × × char
  30. 30. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 文字列型の記述方法と補足 • 記述方法は3つ • 「’hoge’」シングルクォーテーション • 「”hoge”」ダブルクォーテーション • 「’’’hoge’’’」トリプルクォーテーション(シングル 又はダブルを3つ) • プログラム中での改行を文字列中での改行とみなす • unicode型とstr型が存在 – (Python 3.xはデフォルトでunicode型なので特に気 にしなくて良い) 29
  31. 31. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 文字列操作 # 文字列の連結 >>> 'hoge' + 'fuga' 'hogefuga' # 文字列の長さを取得 >>> len('hoge') 4 # 文字の先頭が~であればTrue >>> 'hoge'.startswith('ho') True >>> 'hoge'.startswith('a') False 30
  32. 32. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 文字列操作2 # replaceにより文字を置換できる >>> 'hogefuga'.replace('hoge', ’piyo') ‘piyofuga’ # 前後の空白を取り除く(全角も可能) >>> ‘ hogefuga ‘.strip() ‘hogefuga’ 31
  33. 33. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 部分文字列の取得 インデックスによるアクセスが可能 >>> s = 'hogefuga' >>> s[0] 'h' >>> s[:3] #0文字目から3文字目の”直前”まで 'hoge' >>> s[2:4] 'ge' 32
  34. 34. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. リスト型 リストは角括弧の中にカンマで区切られた式を並べて 作る ※柔軟で便利な操作が可能(後述) 数値、文字列、式を混ぜたリスト >>> [1, 2+3, ‘hoge’, ‘fuga’, 1.1] [1, 5, 'hoge', 'fuga', 1.1] インデックスアクセス >>> x = [1, 2, 3] >>> x[1] = 100 >>> x [1, 100, 3] 33 Python Ruby Java リスト list Array [] 型の 制約 なし なし あり
  35. 35. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. リスト型に対する操作の例 >>> x = [‘hoge’, ‘fuga’, ‘piyo’] # リストの作成 >>> x ['hoge', 'fuga', 'piyo'] >>> x[0] # 0番目の要素を取得(最初の要素は0番目) 'hoge' >>> len(x) # リストの長さを取得 3 >>> x.append(1) # リストに1を追加 >>> x ['hoge', 'fuga', 'piyo', 1] >>> ‘hoge’ in x # ‘hoge’がリストに存在する場合True、そう でない場合False True 34
  36. 36. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. タプル型 タプルは丸括弧の中にカンマで区切られた式を並べて作る。リストと は違い、要素は変更不可能 >>> (1, 2+3, ‘hoge’, ‘fuga’, 1.1) # 数値、文字列、式を混ぜたタプル (1, 5, ‘hoge’, ‘fuga’, 1.1) >>> (1, ) # 要素が1個のタプル。式をくくるときも丸括弧を使うため、 カンマをつけて区別する (1,) >>> () # 要素が0個のタプル () >>> a = (1, 2, 3) >>> a[0] = 4 # これはエラー Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment 35 Python Ruby Java タプル tuple (近い)Arrayを freezeする なし 型の 制約 なし なし -
  37. 37. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. set型(集合型) • 順序のないユニークなオブジェクトの集合 • 数学的な集合演算が可能(和集合を求めるなど) >>> {1, 2+3, ‘hoge’, ‘fuga’, 1.1} # 数値、文字列、式を混ぜ た集合 set([1, 2, 3]) >>> set([1, 2, 3]) # set()でリストをくくってもsetを生成で きる set([1, 2, 3]) >>> {1, 2} & {2, 3} # 共通集合 set([2]) >>> a = {1, 2} >>> {1, 2, 2, 3} {1, 2, 3} 36 ※要素の追加ができない、変更不可能なflozenset型もある。 Python Ruby Java set tuple Set HashSet 型の 制約 なし なし あり
  38. 38. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 辞書型 • RubyでいうHash, JavaでいうHashMap • 辞書に格納された要素に順序は存在しない • リストのように、インデックスではアクセス出来ない >>> d = {‘hoge’: 1, ‘fuga’: 2, ‘piyo’: 2} # キー:値という ペアを要素とする >>> d[‘fuga’] # ‘fuga’は辞書に存在するので、その値を 取得できる 2 >>> d[‘xxx’] # 存在しない … KeyError: 'xxx' 37 Python Ruby Java 辞書 dict Hash HashMap 型の 制約 なし なし あり
  39. 39. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 辞書型 >>> d = {'fuga': 2, 'piyo': 2, 'hoge': 1} >>> d[‘aaa’] = 3 # 辞書への要素追加 >>> d {'fuga': 2, 'aaa': 3, 'piyo': 2, 'hoge': 1} >>> d[10] = (1, 2, 3) # いろいろな値を追加できる >>> d {10: (1, 2, 3), 'fuga': 2, 'aaa': 3, 'piyo': 2, 'hoge': 1} >>> del d[‘hoge’] # 辞書から要素を削除 >>> d.keys() # 辞書に含まれるキーのリスト [10, 'fuga', 'aaa', 'piyo'] >>> d.values() #辞書に含まれる値のリスト [(1, 2, 3), 2, 3, 2] 38
  40. 40. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 制御フロー 39
  41. 41. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 制御フローは以下3つ • if(条件分岐) • while(繰り返し) • for(繰り返し) ※switchはなし 40 Python Ruby Java 条件 分岐 if if unless case if switch while while while until while do while for for for for 拡張for
  42. 42. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. if文 最初にマッチしたもののみ実行 if x < 0: print(“if”) elif x < 1: print(“elif”) else: print(“else”) 41
  43. 43. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. while文 式の値が真である間、繰り返し実行 x = 0 while x < 100: x += 1 print(x) 42
  44. 44. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. for文 シーケンス(文字列、タプル、リスト)などの要 素一つ一つに対して反復処理を行う for x in [“hoge”, “fuga”, “piyo”]: print(x) # “a”, “b”, “c”が出力 for x in “abc”: print(x) 43
  45. 45. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. for文: range()関数 • 0から99までの数値リストは、組み込み関数 rangeを用い、range(0,100)で作成できる • [0, 1, 2, 3, 4, …, 99]というリストを書く必要がない # 0から99までの数値が出力される for x in range(0, 100): print(x) 44
  46. 46. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 練習: FizzBuzz (5~10分くらい) • 1~50の数値を出力するfizzbuzz.py を作成して下さい。 – 3の倍数の時に文字列”Fizz” – 5の倍数の時に”Buzz” – 15の倍数の時に”FizzBuzz” – それ以外はその数 • 制限: print()関数の記述は1回のみ 45 $ python fizzbuzz.py 1 2 Fizz 4 Buzz Fizz …(略) 14 FizzBuzz …(略) 49 Buzz
  47. 47. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 解答例 for x in range(1, 51): if x % 15 == 0: print("FizzBuzz") elif x % 5 == 0: print("Buzz") elif x % 3 == 0: print("Fizz") else: print(x) 46
  48. 48. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 良くない解答例 for x in range(1, 51): if x == 3: print(“fizz”) if x == 5: print(“buzz”) if x == 6 print(“fizz”) … 47
  49. 49. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 関数定義 48
  50. 50. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 関数定義 # 引数に型制限はなし(演算不可の場合は実行時 エラー) def hoge(x): print(x) return x + x ※PEP8: 関数名はすべて小文字で単語の境界には アンダースコア「_」をつけるべき 49
  51. 51. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 組み込み関数 • 組み込み関数:type()やprint()など、 標準で組み込まれていていつでも利用できる関 数 • 使用するためにモジュールをimportなどする必要が ない • 組み込み関数の一覧 • http://docs.python.jp/2/library/functions.html >>> print('Hello, world!') Hello, world! 50
  52. 52. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 演習: 再帰的呼び出し(10分) 関数の中で関数を呼ぶことも可能。 そのような関数を定義し、nの階乗を求めて下さい。 例: 5の階乗 5! = 5 * 4 * 3 * 2 * 1 = 120 関数定義のヒント: def hoge(x): print(x) return x + x 51
  53. 53. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 解答例 def factorial(x): if x == 1: return x else: return x * factorial(x - 1) print(factorial(10)) 52
  54. 54. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. クラス定義 53
  55. 55. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. クラスの定義 多重継承も可能だが複雑なので避けるのが吉 class MyClass: """これはコメント""" i = 123 def __init__(self): print("コンストラクタ") def f(self): print("hoge") c = MyClass() c.f() print(c.i) # クラス変数 54 Python Ruby Java クラス ◯ ◯ ◯ 多重継承 ◯ × (Mix-in) × インタ フェース × × ◯
  56. 56. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. クラスのインスタンス化 クラスは通常、インスタンス化して使う – クラス名()でインスタンス化。 ただし、__init__にself以外の引数があるときは引 数を与える (ファイルの続き) x = MyClass() # インスタンス化 x.f() # ‘hoge’がprintされる 55
  57. 57. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. ファイル入出力 56
  58. 58. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. ファイル入出力について • ファイルオブジェクトを介して読み書きを行う • 組み込み関数のopen() でファイルオブジェクトを 生成できる • ファイルを開く際にはモードが存在 • 読み出し専用、書き込み専用、追記用、読み書き 両用 • さらに、テキストモードかバイナリモードか指定 57https://docs.python.jp/3/tutorial/inputoutput.html#reading-and-writing-files
  59. 59. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 読み込み # 事前に適当なファイルa.txtなどを作成 >>> f = open('a.txt', 'r') >>> f.read() # ファイルの最後まで読み、strとして返す 'aefan' >>> f.read() # 終端まで読んだので、空が返ってくる '' >>> f.read() '' >>> f.close() >>> f.read() # ファイルを閉じた後に読もうとするとエラー Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: I/O operation on closed file 58
  60. 60. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. ファイル読み込みの3つの方法 read(): ファイルの終端まで読む readlines(): ファイルの終端まで読み、 各行をリストの要素にして返す(改行コードは含まない) readline(): ファイルを1行分読む(改行コードも含む) >>> f = open('a.txt', 'r') >>> f.readlines() ['aefan'] >>> f.close() >>> >>> f = open('a.txt', 'r') >>> f.readline() 'aefan' >>> f.readline() 59
  61. 61. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. ファイルへの書き込み • write(s): 文字列sをファイルに書き込む • writelines(l): シーケンス型lをファイルに書き込む • 以下を追記モードでも試してみてください • open(file_name, ‘a’)でfile_nameを開く >>> f = open('a.txt', 'w') >>> f.write(‘abcde’) # 適当に >>> f.close() >>> f.write('abcde') # 例外発生 >>> f = open('a.txt', 'r') >>> f.read() 'abcde' 60
  62. 62. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. ファイルの読み込み(for文) for文により、ファイルの各行を簡単に読み込める $ cat a.txt aaa bbb ccc (読み込み。各行に含まれる改行も表示されている) >>> for l in open('a.txt', 'r'): ... print(l) ... aaa bbb 61
  63. 63. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. クローリング&スクレイピング 62
  64. 64. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. この章の内容 1. クローリング 2. スクレイピング 3. 注意事項 特にクローリングを行う際の注意や推奨事項 63
  65. 65. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 複数の書籍が刊行 64
  66. 66. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. クローリング&スクレイピング • クローリング: ハイパーリンクをたどりながら webページを収集 – 特に、Googleなどの検索エンジンが大規模に運用 • スクレイピング: webページをパースして 欲しい情報を抜き出す • UNIXコマンドでもOK – wget: 再帰的にwebページを取得できるオプション(-r)あり • 特定ページ取得/とにかく全部取得するならこれでもOK – スクレイピングはPythonが圧倒的に楽 • Pythonの場合は複数のライブラリを組み合わせて作成 (後述) – フレームワークscrapyが有名だが、学習コストの関係上省略 65
  67. 67. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. webページをたどる(クローリング) 本格的に行う場合はscrapyフレームワークを利用 →「Python クローリング&スクレイピング」6章 →本質的でない作業を肩代わりしてくれる • リンクの抽出 • (エラー時の)リトライ • 時間間隔の調整 … 今回は本格的なクローリングは割愛 66
  68. 68. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. webページの取得: requestsライブラリ requestsライブラリが標準のurllibより簡単 インストール: $ pip install requests >>> import requests >>> r = requests.get('http://qiita.com/advent- calendar/2014') >>> r.status_code 200 >>> r.text ‘<!DOCTYPE html> …’ ※今回は複雑な処理をしないためurllibを利用 67
  69. 69. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 例: Wikipediaからアニメ一覧を取得 from urllib.request import urlopen from bs4 import BeautifulSoup # 日本のテレビアニメ作品一覧 (2010年代 後半)) f = urlopen('https://goo.gl/vFjEp5’) soup = BeautifulSoup(f, "html.parser") # 今期(2017年 10月 - 12月)のアニメ一覧 table = soup.find_all('table', {'class': 'wikitable'})[11] for tr in table.find_all('tr'): a = tr.find('a') if a: print(a.text, a.get('href')) 68 ※DBPediaという構造化されたデータも存在するが割愛
  70. 70. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 結果(タイトルとリンク取得) THE IDOLM@STER Prologue SideM -Episode of Jupiter- /wiki/%E3%82%A2%E3%82%A4%E3%83%89%E3%83% AB%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%B C_SideM 銀魂. ポロリ篇 /wiki/%E9%8A%80%E9%AD%82_(%E3%82%A2%E3%83 %8B%E3%83%A1) お見合い相手は教え子、強気な、問題児。 /wiki/%E3%81%8A%E8%A6%8B%E5%90%88%E3%81% 84%E7%9B%B8%E6%89%8B%E3%81%AF%E6%95%99 %E3%81%88%E5%AD%90%E3%80%81%E5%BC%B7% E6%B0%97%E3%81%AA%E3%80%81%E5%95%8F%E9 %A1%8C%E5% 85%90%E3%80%82 … 69
  71. 71. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 各ページからジャンルを抽出 def get_genre(url): f = urlopen(url) soup = BeautifulSoup(f, "html.parser") table = soup.find("table", {"class": "infobox"}) if not table: return for tr in table.find_all("tr"): th = tr.find('th') if th and "ジャンル" in th: return tr.find('td').text.split("、") print(get_genre("https://ja.wikipedia.org/wiki/Just_Because!")) 70
  72. 72. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. アニメ一覧取得+ジャンル抽出 def get_genre_ranking(): f = urlopen('https://goo.gl/vFjEp5') soup = BeautifulSoup(f, "html.parser") # 今期(2017年 10月 - 12月)のアニメ一覧 genre_counts = defaultdict(int) table = soup.find_all('table', {'class': 'wikitable'})[11] for tr in table.find_all('tr'): a = tr.find('a') if a: genres = get_genre("https://ja.wikipedia.org" + a.get('href')) sleep(1) # 重要 if genres: for genre in genres: genre_counts[genre] += 1 return sorted(genre_counts.items(), key=lambda x: x[1]) 71
  73. 73. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. ジャンル集計結果(抜粋) 72 ジャンル 作品数 例 ファンタジー 9 このはな奇譚 学園 6 Just Because! SF 6 少女終末旅行 恋愛 5 Just Because! アイドル 5 ラブライブ!サンシャイン!! コメディ 5 銀魂. ポロリ篇
  74. 74. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. Google画像検索でアニメ画像取得 • Selenium + PhantomJSでGoogle画像検索の 結果をスクリーンショットで取得 – https://github.com/AKB428/selenium_sample/blob/ma ster/google_image_search.py – python google_image_search.py “チノ” – Selenium • WebアプリのUIテストツール。コンソールからブラウザ操作 が可能 – PhantomJS • wekitがベースのヘッドレスブラウザ • メンテナンス終了予定のためヘッドレスChromeなどでも可 73
  75. 75. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 結果 チノちゃんを画像検索した 結果のスクリーンショット 74
  76. 76. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. (紹介)自然言語処理 人間が日常的に使っている自然言語をコンピュー タに処理させる一連の技術であり、人工知能と言 語学の一分野 (Wikipedia) • 例 – Google検索、Google翻訳、自動要約など • スクレイピングと組み合わせると – あるアニメの記事に出現する単語(「スポーツ」な ど)のうち多く出現する上位の取得などができる 75
  77. 77. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 形態素解析器MeCab • 文を形態素に分割 – 形態素解析: 文を形態素に分割すること(単語よりも 細かい) • 専用”辞書”の利用が必要→Neologdがおすすめ – アニメやマンガのタイトルを含む新語・流行語が含 まれる – 「進撃 の 巨人」→「進撃の巨人」 – インストール(時間がかかるため割愛) • Python3からMeCabを使う https://qiita.com/taroc/items/b9afd914432da08d afc8 76
  78. 78. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 注意事項 1. クローリング対象のWebサービスへの負荷を考 慮する – シリアルアクセス • レスポンスが返ってきてから次のリクエストを行う – 1秒に1回程度 • 裏側の処理の重さなども考慮しておく – DoSアタックと誤認される事例が存在 • 岡崎市立中央図書館事件(Librahack) 2. 著作権やサイトの利用規約に注意する – そのまま公開するなどはNG 77
  79. 79. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. Tips • UserAgentに連絡先や自分のwebサイトのページ を載せる – サーバ管理者がクローラー作成者に連絡を取れるよ うになる • robots.txtを守る – やりすぎてBAN対象にされる場合を考え、同じサイ トでも定期的に取得 • サイトマップを起点にクローリングする 78
  80. 80. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 高度なクローリング&スクレイピング Pythonクローリング&スクレイピングがおすすめ • クローリングの高速化 • クローリングとスクレイピングの分離 • webページの自動操作 (selenium) など ※本スライドでは省略 79
  81. 81. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. その他のトピック Pythonistaになろう 80
  82. 82. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. さまざまなPythonコミュニティ • PyCon JP – 日本で毎年開催されるPythonのカンファレンス – 安いチケットはすぐに売り切れるので早めの申込がオスス メ – https://pycon.jp/2017/ja/ • Python Boot Camp – 初心者向けPythonチュートリアル。日本各地で開催 – https://www.pycon.jp/support/bootcamp.html • PyLadies Tokyo – 女性Pythonistaをつなぐために活動しているコミュニティ の日本?支部 – https://pyladies-tokyo.connpass.com/ • 他: https://www.python.jp/community/ 81
  83. 83. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. Easter egg(隠し機能) 標準機能としていくつかの隠し機能が存在 >>> import __hello__ Hello world... >>> ※普通はimportしても何も出力されない >>> import sys >>> 82 http://www.lifewithpython.com/2013/07/Python-easter-eggs.html
  84. 84. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 良記事 • Pythonを書き始める前に見るべきTips – https://qiita.com/icoxfog417/items/e8f97a6acad07903 b5b0 • 最強のPython開発環境 PyCharmのすゝめ – https://qiita.com/pashango2/items/de342abc10722ed 7a569 83
  85. 85. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 学習コンテンツ • 公式チュートリアルはオススメ – 一通りの主要な機能を身につけられる – https://docs.python.jp/3/tutorial/index.html • PyQ(有償) – 2,980円/月~ – https://pyq.jp/quests/ – 西尾泰和氏が監修 84

×