Webアプリケーション、Webサービスを開発・運用する
エンジニアは、HTML/HTTPやWebサーバなどWeb技術の
仕組みや基礎的な知識をおさえておかなければなりません。
本書では、実サービスでの大規模なWebクローラーの
開発・運用経験をもとに、クローラーを支える、HTTP、
文字コード、HTML、認証、Ajax/JSONなど、Webエンジニアが
おさえておくべきポイントやテクニックを学びます。
クローラーから見たWebサイトの仕組みとその実情に加えて、
現実に即した実践的かつ効率的なクローリングの方法論に
ついても解説します。
○実例をもとにHTTPやHTMLなどWebの仕組みを深く知ることができる
○大規模なクローラーの開発・運用ノウハウを知ることができる
○Webサイトの運営者(クロールされる側)もクローラーに関する知見を得ることができる
【対象読者】
本書はWebクローラーを題材としていますが、クローリングのために
必要なWeb技術の解説に重点を置いており、
主に次のような方々に読んでいただけるよう執筆しました。
● 正しい知識を身につけたいWeb開発者
● クローラビリティの高いWebサイトを作成したいWebサイト運営者
また、HTMLやCSSなど、Webサイトの作成に関わる最低限の知識、
およびサンプルコードを読解するためのプログラミングに関する基礎知識を
前提としています。サンプルコードはJavaで記述していますが、
Java固有のセマンティクスやプログラミングテクニックは可能な限り
避けていますので、Javaに対する深い理解は必要ありません。
■Chapter 1 クローラーを支える技術
1-1 そもそもクローラーってなに?
1-2 クローラーの仕組み
クローリング
スクレイピング
データの保存
1-3 クローラーとWeb技術
Webクローラーが守るべきルール
クロール先のサーバに負荷をかけすぎない
取得したコンテンツの著作権を守る
拒否されたWebサイトやWebページはクロールしない
クローラーが直面する課題
1-4 クローラーを作ってみよう
Javaによるシンプルなクローラーの実装
Jsoup
crawler4j
クローリング・スクレイピング用のサービスやツールを利用する
import.io
scraper
1-5 開発をサポートするツール
curl
リクエストを送信する
HTTPヘッダを表示する
リクエストヘッダを指定する
リクエストボディで送信する内容を指定する
ブラウザの開発者向けツール
■Chapter 2 HTTPをより深く理解する
2-1 HTTPの概要
HTTPの通信内容を覗いてみる
2-2 HTTPメソッドの使い分け
一部のメソッドがサポートされていない場合がある
メソッドの使い方が適切ではない場合がある
GETではなくPOSTメソッドで画面遷移している
GETメソッドで更新処理をしている
URLエンコードの方式の違いによるトラブル
URLの構造
URLエンコード
半角スペースのエンコード方法の違い
2-3 信用できないレスポンスステータス
ステータスコードに応じて適切な処理をする
エラーが発生しているのに200が返ってくる
ページが存在しない場合にリダイレクトされる
そもそもサーバに接続できない
サーバエラー時の一般的な対処法
400 Bad Request
401 Unauthrorized
403 Forbidden
404 Not Found
405 Method Not Allowed
406 Not Acceptable
408 Request Timeout
500 Internal Server Error
501 Not Implemented
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
リダイレクトの微妙な意味の違い
一時的な移動と恒久的な移動
メソッドの変更が許されているかどうか
クローラーでのリダイレクトの扱い方
metaタグによるリダイレクト
canonicalが示す本来のURL
2-4 HTTPヘッダの調整
クローラーのユーザーエージェント
サーバサイドでクローラーかどうかを判定する
クッキーを引き継がないとクロールできないWebサイト
クッキーを引き継ぐ
国際化されたWebサイトをクロールする
地域や言語ごとに異なるドメインやURLで提供されている場合
Accept-Languageヘッダで切り替えられている場合
2-5 プロキシ経由でのクロール
プロキシ使用時のHTTP通信の内容
クローラーでプロキシを使用する
2-6 SSL通信時のエラー
SSLのバージョン
SSL対応サイトのクロール
JavaのAESのキー長の問題
2-7 HTTP/2
JavaでのHTTP/2の取り扱い
2-8 まとめ
■Chapter 3 文字化けと戦う
3-1 クローリングと文字コード
3-2 どうして文字は化けるのか?
コンピュータと文字
文字化けとマルチバイト文字
3-3 クライアントとサーバと文字化け
文字コードはどこで化ける?
クライアント・サーバ間
Content-Typeヘッダで文字コードが指定されている場合
metaタグで文字コードが指定されている場合
アプリケーション・データベース間
テキストファイルの読み書き
3-4 文字コードを適切に扱う
クローリングと文字コード
インデキシングと文字コード
正規化
危険なデータは消毒(サニタイズ)!
3-5 代表的な文字コード
UTF-8
Shift_JIS
EUC-JP
ISO-2022-JP
3-6 文字コードにまつわる落とし穴
文字コード名を信じるな
原因
対策
Shift_JISじゃないShift_JIS
原因
対策
データベースと寿司の受難(1)――消える寿司
原因
対策
データベースと寿司の受難(2)――絵文字で検索できない問題
原因
対策
嘘みたいなフォントの話
原因
対策
トラブルシューティングのためのTips
テキストエンコーディング――Google Chromeでエンコーディングを切り替える拡張機能
hexdump――16進ダンプでバイト列を確認する
バイナリエディタ――ファイルを16進ダンプする
3-7 文字コードを推定するには?
juniversalchardet
ICU4J
Java以外の言語での実装
文字コード判定用バイト列の長さと判定精度
3-8 まとめ
■Chapter 4 スクレイピングの極意
4-1 HTMLからデータを取得する
正規表現
XPath
CSSセレクタ
HTML以外のデータ
4-2 CSSセレクタを使いこなす
指定した位置の要素を取得する――nth-child()
テキストノードを文字列で検索する――contains()
テキストノードを正規表現で検索する――matches()
子孫の要素を含めずに検索する――containsOwn()とmatchesOwn()
属性で検索する
属性の有無による検索
属性値での検索
属性値の部分一致検索
前方一致検索――[attr^=val]
後方一致検索――[attr$=val]
部分一致検索――[attr*=val]
言語コードでの検索――[attr|=val]
属性値に特定の文字を含まないものを検索する
4-3 スクレイピングしたデータの加工
例1 alt属性からデータを取得する
例2 金額の抽出
例3 住所の抽出
4-4 メタデータを活用しよう
Webページのメタデータ
metaタグ
PageMap
OGP
基本的なメタデータ
任意のメタデータ
構造化プロパティ
複数設定
Twitter Card
構造化マークアップ
Microformats
Microdata
itemscope属性
itemtype属性
itemprop属性
itemref属性
RDFa/RDFa Lite
vocab属性、typeof属性、property属性
resource属性
prefix属性
JSON-LD
構造化データテストツールを活用しよう
検索結果表示時の構造化データの利用
パンくずリスト
検索ボックス
ナレッジグラフパネルへの情報の追加
ファクトチェック
4-5 まとめ
■Chapter 5 認証を突破せよ!
5-1 認証が必要なページをクロールする理由
認証の必要なWebサイトのクロールはマナーを守って
プライバシーに注意
トラブルにならないために、しっかりとした規約を
セキュリティは厳重に
できる限りAPIを使った連携を
5-2 様々な認証方式とクローリング方法
HTTP認証
フォームベース認証
ログインフォームのHTMLと通信内容を分析してみよう
クロスサイトリクエストフォージェリ(CSRF)
フォームベース認証のプログラム例
セッション管理の仕組み
URLにセッションIDを含めるアプリケーションも
セッションハイジャック
HTTPSかつクッキーにsecure属性とhttpOnly属性を指定する
適切な強度のセッションIDを使用する
2段階認証
CAPTCHAによるBOT対策
5-3 Web APIを使って情報を取得しよう
アクセスキーによる認証
OAuth 2.0
OAuthの処理フロー
Authorization Code(認可コード)
Implicit Grant
Resource Owner Password Credentials
Client Credentials
Authorization Codeのフロー
アクセストークンとリフレッシュトークン
認証と認可
pac4jでGitHubのOAuthを利用してみる
5-4 まとめ
■Chapter 6 クローリングの応用テクニック
6-1 クローラーが守るべきマナー
リクエスト数、リクエスト間隔の制限
クロールしてもよいページの制限
robots.txt――サイト単位の設定
自分のクローラーはどれに従えばよいのか?
アクセス制限はDisallowとAllowを見るべし
例1 Disallowになにも記述がない場合
例2 ディレクトリ末尾の/の有無による違い
例3 DisallowやAllowの優先順位
robots metaタグ――ページごとの設定
微妙に意味が異なる2つのnofollow
X-Robots-Tagヘッダ――HTML以外のファイルの場合
6-2 必要なページのみクロールしよう
どこまでページングをたどるか
まずはたどれるリンクを探そう
新着アイコンを探せ
まさかの無限ループ
意外と使えない!? サイトマップXML
テキストファイルのサイトマップ
サイトマップインデックスファイル
gzip形式
RSSやAtomからサイトの更新情報を取得する
RSS 1.0 / 2.0
Atom
PubSubHubbub
コンテンツをキャッシュして通信を減らす
gzip圧縮でレスポンスを高速化
6-3 削除されたコンテンツを判定する
コンテンツに記載された終了期限を使用する
対象サイトを定期的にクロールする
インデックス済みのURLを定期的にチェックする
一覧ページにURLが存在しなければ削除されたものとみなす
残る問題
6-4 Webサイトの更新日時、更新頻度を学習する
明記されている更新日時を探す
エラー日時を把握しその日時を避ける
更新頻度に応じてクロール頻度を調整する
クロール所要時間からクローラーのリソース使用量を平準化する
6-5 究極の効率化=クロールしない
6-6 まとめ
■Chapter 7 JavaScriptと戯れる
7-1 AjaxやSPAの流行による苦悩
AjaxによるJavaScriptの復権、そしてSPAの登場
JavaScriptを使ったWebページの実例
確認ダイアログやフォームの入力補助
画面遷移をJavaScriptで行う
HTMLを動的に生成する
Ajaxを使って非同期通信を行う
クローラーから見たJavaScript
7-2 JavaScriptとの戦いを避ける
JavaScriptの動作を再現する
クローラー向けの情報を探せ
モバイルサイトを狙え
Chromeでスマートフォン向けサイトを確認する
スマートフォンのユーザーエージェント
7-3 ブラウザを操作するツールを活用する
Selenium WebDriverを使ってみよう
WebDriverのセットアップ
WebDriverでクロールしてみる
要素の選択
ダイアログの操作
非同期に更新される画面の表示を待つ
要素が見つかるまで自動的にウェイトする
指定した条件を満たすまでウェイトする
7-4 まとめ
書籍の購入や、商用利用・教育利用を検討されている法人のお客様はこちら
図書館での貸し出しに関するお問い合わせはよくあるお問い合わせをご確認ください。
利用許諾に関するお問い合わせ
本書の書影(表紙画像)をご利用になりたい場合は書影許諾申請フォームから申請をお願いいたします。
書影(表紙画像)以外のご利用については、こちらからお問い合わせください。
お問い合わせ
内容についてのお問い合わせは、正誤表、追加情報をご確認後に、お送りいただくようお願いいたします。
正誤表、追加情報に掲載されていない書籍内容へのお問い合わせや
その他書籍に関するお問い合わせは、書籍のお問い合わせフォームからお送りください。
追加情報はありません。
この商品の「よくある質問」はありません。
正誤表の登録はありません。