【技術本】PythonによるWebスクレイピング
https://amzn.to/3UhJ0a0
【技術本】PythonによるWebスクレイピング
へポスト
Python3環境(Mac)にてプログラムを動作検証済み。
膨大なウェブサイトから情報を抽出するコンピュータソフトウェア技術を記載した本書だが、以下の事を学ぶことができる。
・BeautifulSoupライブラリを利用してhtmlを字句解析
・必要データを永続化(download, csv, MySQL)
・様々な文章形式(各種文字コード, csv, PDF, Word)の読み込み
・文字のフィルタリング、クリーニングして体系化の方法
・フォーム入力、Cookie、認証が必要なページの読み込み方法
・JavaScript使用ページもJS実行後の画面として解析する方法
・画像に記載されているテキストを解析する方法
・bot(scraping)対策をしているサイトの回避策
・Web画面の各種入力動作をunittest+Seleniumで再現する方法
・リモート(主にTOR)からの実行する方法
様々なフォーマットファイルや、JavaScriptの実行やCookie、認証が必要なサイトでの情報の入手方法は実践的で、実装例も載っているので即座に役に立つ。
ただ、7~8章の取得したデータを文章整形やクリーニングして体系化したり、要約した内容を抽出する場合は、本書では自然言語としての観点から見た英語(単語ごとに空白が入る英語だから通用する部分もあり)の文章に対するスクレイプ方法としての見解であるため、日本語では別途考察が必要だと感じた。
内容はWeb関連技術者には既知の内容も多いかもれしないが、良書の部類に入ると感じた。
作業環境:mac, linux(unix)
対応バーション:Python 2.x,3.x
注意事項:
・筆者のサイトからソース等入手できるが、日本語版書籍の方が新しく刷新されている模様
※それでもバグはあり、下記の章項目ごとに記載あり
・解析のための実データが必要な場合(OpenRefine用のデータ(7章.p119)、TIFFデータ(11章.p170)など)があるが用意されていないので自力で用意が必要(ダウンロードできるようにして欲しかった)
記載されている概要及び補足メモは以下の様です。
-----------------------------------------------
[第1部]スクレイパーを作る
-----------------------------------------------
1.最初のwebスクレイパー
初歩としてBeautifulSoup4ライブラリを使用してhtmlをタグ単位で解析して取得する例を紹介。
※仮想環境でプロジェクトごと、ライブラリごとですっきりさせる
訳注通り、virtualenvよりpyvenvの方が良い。理由:現在のPython3の標準ライブラリ。インストール不要。
詳しくは参考書[Effective Python]参照。
pyvenvの使い方:(メモ)
pyvenv ~/webscraping_project
cd ~/webscraping_project
source bin/activate
これで一つの仮想環境ができて実行状態となる。
他の環境に影響せずPythonのバージョンを切り替えたりライブラリバージョンを変えたり色々できる。
正誤表:(BeautifulSoup実行時の警告文回避方法)
p9, p12
bsObj = BeautifulSoup(html.read())
=>
bsObj = BeautifulSoup(html.read(),"html.parser")
※以降同様の実装時に留意
-----------------------------------------------
2.高度なHTMLパーシング
BeautifulSoup4を使用して取得したHTMLの検索方法の紹介
・タグの子や子孫を扱う
・タグの兄弟を扱う
・タグの親を扱う
・正規表現を踏まえた応用
・ラムダ式:他の関数へ引数として渡される関数による記述方式
・他のライブラリの紹介
lxmlパーサ:HTML,XML用。低レベルでCの機能に依存
HTMLパーサ:Python組み込みライブラリ
-----------------------------------------------
3.クローリングを開始する
サイトの内部リンクを辿り、外部リンクを収集するプログラム等の紹介
注意事項:
※紹介されるプログラムは、例外発生時に処理を飛ばして復帰するなどのエラーハンドリングは実装されていないので注意
※3.4章 Scrapyは現状(2016年4月)ではPython 2.7のみ対応なので注意。
正誤表:
p43
import datetime
=>
from datetime import datetime
-----------------------------------------------
4.APIを使う
下記サービスを利用してAPI呼び出しによるJSONデータの検証やデータの加工整形
・Echo Nest
・Twitter
・Google Api
正誤表:
p70
random.seed(datetime.datetime.now())
=>
random.seed(datetime.now())
注意事項:
p72の実装
※p70のimport文、関数実装を流用する必要あり
※2016年4月現在、freegeoip.netに接続できなかっため国別表記の再現不能
-----------------------------------------------
5.データを格納する
ファイルのダウンロード方法:urlretrieve関数
CSVへデータを格納する実装
MySQLへデータを格納する実装
-インストール、テーブル定義も紹介
-Python PyMySQLライブラリによるDB接続
-try~finaly句によるカーネル、コネクションのクローズ方法
サイト更新通知をメールで行う実装例
-----------------------------------------------
6.文章を読む
下記種別の文章の読み込み方法の実装例を紹介。
・テキスト:文字コード種別も踏まえた正確な読み込み方法
・CSV
・PDF:pdfminer3kライブラリを使用
・Word:Wordドキュメントフォーマットのタグ構造解析を踏まえ紹介
-----------------------------------------------
[第2部]高度なスクレイピング
-----------------------------------------------
7.汚れたデータをクリーニング
nグラム法という自然言語解析で使われる手法でデータをクリーニングする。
本章では2個の語の列で分割し、正規表現などで不要文字列をフィルタリングしながらデータの正規化を行う。
・OpenRefine
オープンソースのWebベースのデータクリーニングツール。
注意事項:
※2.6以降でないとOpenRefineはMac EL Capitanでは動作せず
※操作記載が省略されているが、アプリ起動後はブラウザでlocalhost:3333にて操作可能
※p119以降、データを加工手順が記載されているが、自分でスクレイピングしたデータを用意する必要があるので注意。
-----------------------------------------------
8.自然言語の読み書き
データ要約手法の一つとして前置詞、冠詞など注目すべきでない単語、興味を持つべきでない頻出語をフィルタリングする。
※研究者によるリストを無料で入手できるので、そのリストをPythonに実装する
自然言語文章の書き出しとして、マルコフモデルを使ったランダムな単語の生成の実装を紹介。
wikiの特定項目に関連するページの探索を、マルコフ連鎖を見るける有向グラフにならった実装で紹介。
NLTK(Natural Language Toolkit)
-自然英語の品詞をタグ付けするツールの紹介。
-字句解析方法をPython実装で紹介。
NLTKインストールメモ:
sudo pip install -U nltk
-----------------------------------------------
9.フォームとログインでクロール
PythonのHTTPリクエストライブラリを使用して、下記Webページの情報も取得できるようにする。
・フォーム入力が必要なページ
-各種GUIボタン値、FILEアップロードなども対応
・クッキー値を認証などで必要とするページ
・BASIC認証が必要なページ
-----------------------------------------------
10.JavaScriptのスクレイピング
表示がJavaScriptに依存するページもスクレイピングする。
PhantomJSブラウザと連携し、Cookie,JavaScript,HTTPヘッダなど全て扱えるWebスクレイパーの実装例紹介。
ページのリダイレクトも検知して対処できる。
Selenium(Webスクレイピングツール)インストールメモ:
pip install -U selenium
注意事項:
p159
例:/Users/hoge/phantomjs-2.1.1-macosx/bin/phantomjs
-----------------------------------------------
11.画像処理とテキスト認識
画像ファイル化されたテキストを読む方法
・Pillowライブラリによる画像の加工
・Tesseract(OCRライブラリ)によるテキスト画像解析
-どのような加工により解析が困難になるかの考察
-Tesseractの精度向上方法
・CAPTCHA(ボット登録防止施策)を突破する試みの実装例
※p170 tesseractを使用したtiffファイルの読み込みは自分でtiffファイルを用意する必要あり
-----------------------------------------------
12.スクレイピングの落とし穴を避ける
プログラムによる巡回を排除する仕組みを回避する方法
・HTTPヘッダを調整する
・Cookieの扱い方法(新たなコネクションでCookieを受け継ぐ方法など)
・人間の動作を超えるスピードでのフォーム入力移動などに注意(sleep機能)
・ハニーポッドに注意(botを検知するトラップに嵌らないように)
-ブラウザ上で人間には見えない位置や、表示していない入力項目、リンクに注意
-Seleniumライブラリの実装で回避方法の実装例の紹介
-----------------------------------------------
13.Webサイトをスクレイパーでテストする
unittest,Seleniumライブラリを使用して、Webの動作テスト自動化を行う。
それぞれケースによって連携したり使い分ける方法がベスト
・unittest
項目にあった文字列、タグがあるかのテスト
・Selenium
-フォームボタン等を操作(クリック、ダブルクリック、リリースなど)した際のアクションを登録流用できる。
-ドラッグ&ドロップ操作も行うことができる
-実行結果をスクリーンショットに取ることも可能
-----------------------------------------------
14.リモートでスクレイピング
・Torと連携して実行する方法の紹介(実装あり)
・Webサイトホスティングサービスやクラウドサービスから実行の紹介(文章紹介のみ)
-----------------------------------------------
付録A
Python入門
-----------------------------------------------
付録B
インターネット入門
-----------------------------------------------
付録C
Webスクレイピングの適法性と倫理
法的見解と規約などを紹介
以上。
へポスト