###### tags: `読書` # クローラ ## 1. クローリング・スクレイピングとは何か ### クローリング Webページのハイパーリングをたどって次々にWebページをダウンロードする作業 ### スクレイピング ダウンロードしたWebページから必要な情報を抜き出す作業 ## 2. Pythonではじめるクローリング・スクレイピング ### スクレイピング - beatifulsoup - pyquery - lxml - elementtree ### データの保存 - sqlite - mysql - mongodb ### XPATHとCSSセレクター #### XPATH XMLの特定の要素を指定するための言語。`//body/h1`という表記で、body要素下のh1要素を指定できる。 #### CSSセレクター CSSで装飾する要素を指定するための表記方法。`body > h1`という表記で、body要素下のh1要素を指定できる。 #### どっちが良いの? - XPathのほうが多機能。 - CSSセレクタの方が簡潔に書ける。 - Pythonによる後処理も可能なため、CSSセレクタの表現力が問題となることは少ない。どちらかだけを学習するのであればCSSセレクタが推奨される。 ### クローラとURL ## 3. ライブラリによる高度なクローリング・スクレイピング ## 4. 実用のためのメソッド ### Cookie - HTTPリクエスト・レスポンスに小さなデータを付加して送受信 ### JavaScriptを解釈するクローラ - chromeやFirefoxなどのブラウザをプログラムから自動操作する - SeleniumやPuppeteer(python版のpyppeteer) ### クローラで収集したデータについて - 著作権 - 利用規約 ### クローラ時の注意 - クロール間隔は1秒以上(間隔(秒数)をrobots.txtに指定できる) - 一度クロールしたページはキャッシュすべき - HTTP通信エラーについて対処しておくことが望ましい ### XMLサイトマップ - Webサイトの管理者がクローラに対してクロールしてほしいURLのリスト クロールが必要なページ数が少なくて済む ### クローラ設計 - クローラ作成の際には、繰り返し実行することを念頭において作成することが重要 - 更新されたデータだけを取得できるようにするため - エラーなどで停止した後に途中から再開できるようにするため ## 5. クローリング・スクレイピングの実践とデータの活用 ### API ウェブサイトがプログラムからデータを取得しやすいように提供している ### 秘密にすべき認証情報の取り扱い - 秘密のキーなどは公開しないようにする - スクリプトに秘密のキーを書かないようにする - foregoなどのツールで環境変数をツールに渡す ### PDFファイル PDFファイルからテキスト抽出するためのサードパーティライブラリは存在する ### RDF リソースについて記述するための枠組み。 データを主語、述語、目的語の3組で表現し、これをトリプルと呼ぶ。 ### Webページの自動操作 ブラウザを操作するように実際にWebページに対する操作を支持し、クローリングする。 MechanicalSoupなどのライブラリを使える。 ### BigQuery Googleのクラウドサービスの一種。GCP上で提供される。数GB〜数PBという規模の大量データに対してSQLクエリを実行できる。 ## 6. フレームワークScrapy ### Scrapyとは クローリング・スクレイピングのためのPython FW。以下のような特徴がある。 - Webページからのリンクの抽出 - robots.txtの取得と拒否されているページのクロール防止 - XMLサイトマップの取得とリンクの抽出 - ドメインごと/IPアドレスごとのダウンロード間隔の調整 - 複数のクロール先の並行処理 - 重複するURLのクロール防止 - エラー時の回数制限付きのリトライクローラーのジョブの管理 ### Spider Scrapy使用時に主に作成するクラス。対象のWebサイトごとにSpiderを作成する。 ### Scrapyプロジェクト 以下をまとめて管理するPJ。 - 複数のSpider - 関連するクラス #### Item Spiderが抜き出したデータを格納しておくためのオブジェクト - 定義済フィールドにしか値を代入できないため、フィールド名の間違いを回避できる - 複数種類のデータを抜き出したときにクラスで判別できる - 自分で新しいメソッドを定義できる ### Scrapy Shell Scrapyのインタラクティブシェル。CSSセレクタやXPathによる抽出を簡単に試せる。 ### ScrapyのアーキテクチャとSpider実行の流れ 図6.4参照 ### クローリングでリンクをたどる 以下のユースケースではCrawlSpiderが便利。 ただし`rules`(辿りたいリンクを正規表現で記述)を指定する必要がある。 - Webページからリンクを抽出 - 抽出したリンクからスクレイピング ### XMLサイトマップを使ったクローリング SitemapSpiderを使うと手軽にクロールできる ### Item Pipeline Spiderが抜き出したItemに対して、Itemのフィールド値の検証、 DBへの保存などができる。 ### Scrapyの拡張 - DL Middleware(WebページのDL処理を拡張) - Spider Middleware(Spiderのコールバック関数の処理を拡張) - Extension(イベントに応じて上記2つにとらわれない任意の処理) ### JSページのスクレイピング Splashを使用するとJSページに対応できる ### Webページからの本文の抽出 Webページの本文を抜き出すためのライブラリ ### OpenGraphProtocol Facebookによって作られたWebページが表すオブジェクトの情報をシンプルに記述するためのプロトコル。HTMLに決められたmetaタグを書くことで、FacebookなどのSNSでシェアされた時に目を引く形で表示される。 ## 7. クローラの継続的な運用・管理 ### 仮想サーバ作成(AWS) - AWSアカウントの作成 - IAMユーザの作成 - キーペアの作成 - 仮想サーバの作成・起動 ### Scrapy Cloud Scrapinghub社が提供するPaaS。ScrapyのSpiderをデプロイしてクラウド環境で実行できる。 #### Scrapy Cloud:使い勝手のイメージ - (Webから)Scrapy Cloudでプロジェクトを作成 - Scrapyプロジェクトを実装 - デプロイ - (Webから)クローラの実行 ### 定期的なクローラの実行 - systemd - Cron ### メールによる更新の通知 クローラを定期的に実行し、変化があった場合に通知できると便利。 ### クローリングとスクレイピング 両者を分離すると運用が楽。例えば以下の仕様にする。 - (クローリング )HTMLファイルをDBに保存 - (スクレイピング)HTMLからデータを抜き出す このようにすると、以下のメリットがある。 - 再クロールが不要 - 一方の処理を止めても、もう一方の処理を継続できる - コードの見通しが良くなる - スケールさせやすくなる #### 2つの処理の連携 メッセージキューを使うと効率よく処理できる。(Amazon SQSなど) ### クローリングの高速化・非同期化 並行して実行できる部分をなるべく並行処理する。 - マルチプロセス:同時に複数のプロセスを使う - 非同期I/O :1つのプロセスで同時に複数のI/Oを行う ### クラウドを使うメリット - リソースのスケール - 運用を任せられる - クラウドサービスをAPIで操作 - 異なるIPアドレスのサーバを利用しやすい
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up