エンジニアステップ

初心者エンジニア(1年目~3年目くらい)のための技術ブログ

pythonクローリングスクレイピング感想とメモ(実践編)。ライブラリ活用など

pythonクローリングスクレイピング感想とメモ(実践編)です。

ライブラリ活用などを中心に書いていきます。

 

 前編はこちら。

www.engineer-step.com

 

第3章「強力なライブラリの活用」

第3章「強力なライブラリの活用」についてです。

 

スクレイピングのためのライブラリ紹介

PythonのパッケージリポジトリはPyPI(Python Package Index)。

※Node.jsにおけるnpmのようなもの

 

ライブラリのインストールにはpipが良い

※easy_installはアンインストールが出来ないなどの弱点があるため、使われていない

 

スクレイピングに使うライブラリとしてはCSSセレクターを学習するのが良いようです。

  • XPath:細かな条件を指定可能(複雑)
  • CSSセレクター:細かな指定は出来ない。1つだけ習得ならこちらが良い(簡単)

Beautiful SoupなどのサードパーティではXPathをサポートしていないことを考えると、余計にCSSセレクターを勉強するほうが良さそうです。

 

ブラウザでCSSセレクターを取得するには開発者向けツールから、右クリックしてCopy -> Copy selectorでOK。

※XPathならCopy XPath

 

DBへの保存

DBへの保存では、MySQLへの保存、MongoDBへの保存が紹介されています。

MongoDBとはNoSQLの一種です。

  • ドキュメント型
  • オープンソース
  • 1つのDBは複数のコレクションを持つ
  • 1つのコレクションは複数のドキュメントを持つ
  • ドキュメントはBSON(JSONのバイナリ版形式)で扱われる
  • DBへの書き込み速度が早い

 

ちなみにDB格納時には、プライマリーキーはサロゲートキー(自動生成されるキー)を使うほうが良い。

※URLは変更しうる(リダイレクトなどされるる)

 

クローラーの作成

クローラーの作成です

サンプルが本に載っているので、それを見ればOK(コレが本当に役立ちますね…)

基本的には

  • 対象ページの構造を事前に知っておく
  • データを取得する
  • 空白文字を消したり整形する
  • DBに格納する

という流れ。

 

第4章「実用のためのメソッド」

第4章は「実用のためのメソッド」です。

 

状態を保つ場合

状態を持つ(ステートフル)なクローラーを作る場合は、HTTP上で状態を保持する必要があります。

  • Cookieを使う。Requestsで、Sessionオブジェクトを使う
  • HTTPヘッダにRefererを使う。1つ前に閲覧したページのURLをサーバーに送る

 

JavaScriptを解釈する場合

JavaScriptを解釈する場合には、Seleniumというプログラムからブラウザを自動操縦するツールを使うのが良いです。

ヘッドレスブラウザーも操作可能です(GUI、画面がないブラウザ)。

代表的なヘッドレスブラウザーはPhantomJSです。

 

迷惑をかけないクローラーの作り方

迷惑をかけないクローラーを作りましょう、というお話。

クローラー作成者が知っておくべき法律は3つあります。

  1. 複製権:収集したWebページを保存する権利
  2. 翻案権:収集したWebページから新たな著作物を想像する権利
  3. 公衆送信権:収集したWebページをサーバーから公開する権利

 

これらの法律を侵さないようにしましょう。

また、クロール先に負荷をかける事で、業務妨害になることを避けるように。

※1秒に1回のクロールでも、岡崎市立中央図書館へアクセスした、偽計業務執行妨害罪で逮捕されました

 

基本的には

  • クロールの感覚は1秒以上開けること
  • HTTPステータスコードが408,500,502,503,504エラーの場合は、指数関数的にリトライすること(1秒、2秒、4秒、8秒…)

が大事です。

 

第5章「実践とデータ活用」

第5章は「実践とデータ活用」です。

 

Wikipediaのデータセットを扱う

Wikipediaのデータセットダウンロードに関しては、以下からダウンロード可能。

Latest(最新)から落とすのが良いでしょう。

Index of /jawiki/

 

Wikiの中は見れば分かるのですが、XMLファイルです。

PythonのWikiextractorというライブラリを使って読み込みのが良いでしょう。

GitHub - attardi/wikiextractor: A tool for extracting plain text from Wikipedia dumps

Module:If empty

 

 

自然減処理技術(MeCab)を使う

自然減処理技術(MeCab)を使う話もありました。

書籍ではMacやUnix用の方法が載っています。

私はWindows環境で構築しているので、こちらのサイトを参考にしました。

PythonとMeCabで形態素解析(on Windows)

 

Web上の新しい単語を取り込むためには、最新のデータセットを扱うようにしましょう。

ここのリンクに色々あります。

情報学研究データリポジトリ ニコニコデータセット

GitHub - neologd/mecab-ipadic-neologd: Neologism dictionary based on the language resources on the Web for mecab-ipadic

 

Webサービスからデータを取得する方法

Webサービスからデータを取得する方法については、各サービスごとのAPIを使う必要があります。

  • Twitter(REST APIとStreaming API)
  • Amazon(Product Advertising API)
  • Youtube(Youtube Data API)

その他、時系列情報を取得する方法などもありましたが、割愛します。

 

 

オススメライブラリ

オススメライブラリまとめ

スクレイピング、クローリング関係のライブラリ

  • Requests:人間のためのHTTPというキャッチフレーズの使いやすいライブラリ。HTTPメソッドのPOST, PUT, DELETE, HEAD, OPTIONS相応のものが使える。HTTPヘッダの追加、Basic認証も可能。HTTPKeep-Aliveも可能
  • lxml:C言語のXML処理ライブラリ(libml2,libxslt)のpythonバインディング。C言語拡張であるため、他のライブラリより軽いのが特徴(高速処理可能)。いわゆるパーサー
  • Beautiful Soup:シンプルにデータを取り出せる。
  • pyquery:javascriptライブラリのjQueryと似たインタフェースでスクレイピング出来る
  • XPath(XML Path Language):XML特定要素を指定するための言語
  • CSSセレクター:CSSで装飾する要素を指定するための表記方法
  • feedparser:ElementTreeより簡単にRSSフィードからスクレイピング可能(バージョン、仕様の違いを気にせずに使用可能)

 

MySQL関連のライブラリ

MySQL関連のライブラリはこちら

  • mysqlclient:MySQLのクライアントライブラリ「libmysqlclient」を使ったC拡張ライブラリ
  • MySQL Connector/Python:
  • PyMySQL

 

その他のライブラリ

その他のライブラリで使えそうなものをまとめました。

  • Voluptuous:スキーマ(ルールの集合)を簡単に定義できる

 

クローリングとスクレイピングの概要を知れて良い本です、本当。