Slide 1

Slide 1 text

ボク 惡い クローラーじゃないよ 色々作ったクローラーからの知見

Slide 2

Slide 2 text

自己紹介 ● 伊藤正訓(まさくに) ● 1982/10/19 37歳 ● 静岡生まれ 静岡育ち そして静岡へ ● バックエンドユニットリーダー ● 三大聖典 ○ ドラえもん / ラピュタ / ONE PIECE ● 好きなテレビ番組 ○ 世界ふしぎ発見! ● 娘が一人、モルモット飼ってます ● Twitter: @masakuni_ito

Slide 3

Slide 3 text

目次 ● クローラーとは ● 法律とマナー ● 使えるライブラリ ● 実装のコツ

Slide 4

Slide 4 text

クローラーとは

Slide 5

Slide 5 text

クローラーとは ● crawl(腹ばっていく) ● Web上のデータを周期的に取得する ○ 普通Htmlを取得する ● リンクをたどったりページを類推して、 Web上のデータを取得すること ● 当然検索エンジンは我が物顔でやってる

Slide 6

Slide 6 text

ところでスクレイパーって? ● scrape(削り取る) ● 取得したデータを解析、分解して 自分好みに収集、フォーマッティングすること ● 当然悪用できる ○ データを売るとか、メアド集めるとか ● クローリングとスクレイピングは ほぼ同じように扱われることが多い

Slide 7

Slide 7 text

法律とマナーの話

Slide 8

Slide 8 text

法律とマナーの話 ● 誰かの大切なデータを集めて操作するので、 権利と義務と、社会的なマナーが発生する ● 法律的な前例は不明瞭で怖いものが多い(後述) ● マナーは自己解釈と雰囲気にあふれ、あいまい(後述) ● エンジニアルール(科学的、原理的)と、 通念ルール(非科学的、通例、雰囲気)が違いすぎる分野 ● 色々怖いから今までLIGブログで書けていない

Slide 9

Slide 9 text

クローラーと法律 ● 著作権法 ○ 知的財産権の一つ ○ 著作者が著作物を創作した段階で発生 ■ Webサイトの記事とかも当てはまる ○ 保護期間は著作者の死後50年 ● そのサイトの規約違反(民法の不法行為) ○ C、S禁止されてたら、当然だめ ● 偽計業務妨害罪、動産不法侵入罪 ○ サーバーに負荷をかけたとか(後述)

Slide 10

Slide 10 text

著作権をもう少し ● 著作物たるには独創性があること ○ Webに公開してある電話番号とかは違う ● ただし著作物であっても、公開されていて、 情報解析の場合、取得、保持は問題ない ○ 譲渡、売却とかはだめ ○ だから日本のWebはAI市場の価値は高い(らしい) ● 日本の著作権等侵害罪は親告罪 ○ ただし条件付きで非親告罪になる(TPP関連) ■ 基本的に著作権を犯して金儲けした場合

Slide 11

Slide 11 text

クローラーとマナー ● 前提、法律的にクローラーは禁止されていない ● 前述のとおり、クローリングでアクセスかけすぎるとだめ ○ 営業妨害とか不法侵入とかになる可能性がある ○ 言いたいことはよく分かるし実感はある ● 技術的根拠をサーバー、クライアントが説明しづらい ○ クライアントはサーバーの設定を知らない ○ サーバーはアクセス数を予測不可能

Slide 12

Slide 12 text

どうする?

Slide 13

Slide 13 text

sleep(1)

Slide 14

Slide 14 text

sleep(1)しとけば平気では? ● クローリング1ページごとに1秒寝る ○ 言いたいことはよく分かる ○ エンジニア的には、これは品がいいクローラー ○ 1秒1アクセス耐えられないサーバーはそもそもさ

Slide 15

Slide 15 text

岡崎市立中央図書館事件 ● とても有名なクローリングの事件 ● ちゃんと1秒していにも関わらず、 図書館のサイトをクローリングしていたとして、 男性が逮捕された。 ● 一時間に400アクセスあると落ちるソフトウェアが原因 ● 技術的根拠の難解さ、社会通念との落差が浮き彫り

Slide 16

Slide 16 text

最低限する(できる)こと ● サイト規約に従う ● robots.txtに従う ● X-Robots-Tagを従う ● meta、aタグのnofollowは辿らない

Slide 17

Slide 17 text

サイトの意思に沿い、 サーバーの声を聞くこと

Slide 18

Slide 18 text

難しいところ サーバーの声

Slide 19

Slide 19 text

どうすればいいか?

Slide 20

Slide 20 text

Slide 21

Slide 21 text

参考 ● Webスクレイピングする際のルールとPythonによる規約の読み込み ○ https://vaaaaaanquish.hatenablog.com/entry/2017/12/01/064227 ○ 天才 ● 文化庁:著作物が自由に使える場合 ○ http://www.bunka.go.jp/seisaku/chosakuken/seidokaisetsu/gaiyo/chosakub utsu_jiyu.html ● Librahack ○ http://librahack.jp/ ○ 事件詳細

Slide 22

Slide 22 text

使えるライブラリ

Slide 23

Slide 23 text

言語ごと使えるライブラリ ● クローラー、httpリクエスト、htmlパーサーに使えるライブラリ ● 基本的にだいたい使える(暴論) ● パーサーはXPathよりセレクタの方が好み ○ XPath ■ XML Path Language ■ 構造や属性からDomをたどる ○ セレクタ ■ 要するにjQuery

Slide 24

Slide 24 text

PHP ● phpQuery ○ 情報多いけどたぶんメンテされてない ○ セレクタでfindする ● Goutte ○ https://github.com/FriendsOfPHP/Goutte ○ セレクタ、XPathでfindする ○ Clickとかもそこそこできる ○ Guzzleのラッパー

Slide 25

Slide 25 text

PHP ● PHP Simple HTML DOM Parser ○ https://simplehtmldom.sourceforge.io/ ○ セレクタでfindする ○ シンプルすぎる ● file_get_contetents() + preg_match() ○ 全然アリ、全然好き ○ 限界は近い

Slide 26

Slide 26 text

Python ● pyquery ○ https://pythonhosted.org/pyquery/ ○ セレクタでfindする ● Scrapy ○ https://scrapy.org/ ○ ライブラリというかクローラーフレームワーク ○ セレクタ、XPathでfindする

Slide 27

Slide 27 text

Python ● aiohttp ○ https://github.com/aio-libs/aiohttp ○ 使ったことない ○ httpクライアント ○ 非同期でのリクエストに長けているという ● scrapelib ○ https://pypi.org/project/scrapelib/ ○ httpクライアント ○ 使ったことない ● requests、urllib.request、html.parser ○ 全然アリ、全然好き ○ Pythonすごいな

Slide 28

Slide 28 text

Ruby ● Nokogiri ○ https://nokogiri.org/ ○ セレクタ、XPathでfindする ○ 数年前はrails new するとき、なんかだいたいこれで落ちてた ● Mechanize ○ https://github.com/sparklemotion/mechanize ○ セレクタ、XPathでfindする ○ Nokogiriのラッパー ● net/http、Regex ○ 全然アリ、全然好き ○ 限界は近い

Slide 29

Slide 29 text

GAS ● Paser ○ https://www.kutil.org/2016/01/easy-data-scrapping-with-google-apps.html ○ セレクタでもXPathでもない。 ○ 抽出する文字列のfromとtoを指定。癖が強い。

Slide 30

Slide 30 text

実装のコツ

Slide 31

Slide 31 text

時間を短縮しろ

Slide 32

Slide 32 text

いっぱい集めろ

Slide 33

Slide 33 text

取得時間を考える ● 仕事なのでしめきりがあるし、依頼者はいきり立ってる しかしクローラーは思ってるより全然時間がかかる ● いつ終わるかの目算を掛け算して求めて伝えること まず全取得の件数を確認、推定すること ● (レスポンス取得3秒 + パース1秒 + sleep(1)件数) × 50万件

Slide 34

Slide 34 text

取得時間を考える ● 仕事なのでしめきりがあるし、依頼者はいきり立ってる しかしクローラーは思ってるより全然時間がかかる ● いつ終わるかの目算を掛け算して求めて伝えること まず全取得の件数を確認、推定すること ● (レスポンス取得3秒 + パース1秒 + sleep(1)件数) × 50万件 ≒29日

Slide 35

Slide 35 text

いきなり作り始めない ● クローリングするサイトをよく観察すること ● できるだけシンプルに、 シンプルに目的のデータへアクセスするルートを考える ● 1秒の削減は取得時間を半分以下にするかもしれない

Slide 36

Slide 36 text

まずアタックリストを作る ● 基本的に欲しいのは一覧ページじゃなくて詳細ページのデータのはず ● それを一つ一つ一覧ページから取得して移動を繰り返しちゃだめ ● まず一覧をなめてURLのリストを作り、出力しておき、 詳細ページを舐めるようにすること ● できるだけダイレクトのアクセスをおこなう ○ このリストを作っておけば、 途中でサーバーが落ちてもレジュームできる ● よってできるだけステートレスで

Slide 37

Slide 37 text

アウトプットは一つずつ ● 一つのデータができあがったら、CSVなりDBになりに吐き出す ● 一見パフォーマンス落ちる気もするが、 処理が落ちて全部失ってレジュームもできないだけまし ● また依頼者が途中でもアウトプットを欲しがるかもしれない ● できるだけカテゴリで分けて出力する レジュームや処理落ちのリスク回避のため

Slide 38

Slide 38 text

要素はないものとして考える ● 落ちないために ● Divやらaやらでスクレイピングするが、 それがない場合は空白文字を出力した方がいい ● 絶対に必要なDomがないことが発生するので、 findをしたときはしつこいほど要素数チェックを入れる 出力するときはデフォルト値を設定できるなら入れる

Slide 39

Slide 39 text

絶対に迷惑をかけない ● どうしても時短のために、同時接続を考えたくなるが、 相手サーバーにはたまったものではない 処理も複雑になるので、よく考える ● クローリングは下っ端に任されがちな仕事かもしれないけど 会社の信用を著しく下げる可能性がある ● 法律、マナー、技術者としてのモラルを守ること

Slide 40

Slide 40 text

クローラーは楽しい

Slide 41

Slide 41 text

クローラーのデータ すなわちWeb

Slide 42

Slide 42 text

よいWeb Lifeを。

Slide 43

Slide 43 text

No content

Slide 44

Slide 44 text

ご清聴ありがとうございました。 Life is Good