NISHIO Hirokazu[Translate]
速習スクレイピング
「Web上で公開されているデータを集めたい」というニーズ
試行錯誤してものづくりをできるスキルのある人を想定
知識のポインタを示す

「集めるフェーズ」と「集めたものから必要なデータだけ抜き出すフェーズ」を分けて考える

集めるフェーズ

データがHTMLに載っているのか、HTMLをロードした後JavaScriptが別途データをダウンロードして表示しているのか
後者は上級編
見分け方は必要があれば書く

データがHTMLに載っている場合
要はHTMLファイルをダウンロードすればよい
目的のHTMLはGETで得られるのかPOSTが必要なのかを区別する
前者が初級編で、後者が中級編
ブラウザのURLをコピペして別のブラウザに張り付けた時に同じものが表示されるならGET
あー、ログインが必要なページって言う別の中級編もあるな
GETなら
wget を使うことを検討
wget -r -l N URL で指定したURLからN回のリンクをたどって到達できるページを根こそぎダウンロードする
たとえばこれを見て、このコンテンツを手元に保存したいと思ったら
えたいコンテンツの一覧ページがあるか探す
あった 一覧
リンク1回でコンテンツにたどりつけそうだから wget -r -l 1 http://1000ya.isis.ne.jp/souran/index.php?vol=102 でよさそう

抜き出すフェーズ
正規表現で切り出す
「同じフォーマットで書かれたHTMLをかき集めて来た」はずなので枯れたツールである正規表現で切るのは手
Python3でBeautifulSoup4を使う
HTMLの構造として、たとえば「id=contentなdivの中に本文が入っている」みたいなきれいなHTMLだったらこれでサクッといく
逆に「div?何それ?brで改行するよ!」みたいなページだとあんまりメリットがないw
HTMLタグ交じりのものをプレーンテキストにする機能はニーズありそう
python
import requests from bs4 import BeautifulSoup r = requests.get("https://www.crummy.com/software/BeautifulSoup/bs4/doc/") print(r.content) # 取得したHTMLが表示される s = BeautifulSoup(r.content, "lxml") q = s.find(id="quick-start") # idが"quick-start"なものを取り出す print(q.find("p")) # <p>Here’s an HTML document ... # quickstartの最初のpタグを取りだしている print(q.find("p").getText()) # Here’s an HTML document ... # HTMLタグを取り除いたプレーンテキストになっている
この説明ではrequestsを直接使ってプログラム中で直接インターネットに取りに行ってるけど、ローカルファイルに保存してから解析する方が実行時間も短いし相手のサーバにも優しい
その他


その他
情報収集という意味で「スクレイピング」とは一般的には言わないんだけど色々なニーズがあるのでメモしておく。
「スクレイピングという単語の定義は~」とか議論しても無益だからね。

ブラウザ上で画像は表示されているがCSSで背景画像として読まれてて右クリックからの保存ができない、なんとかならないか?
ブラウザキャッシュから取ればよい
画面全体のスクリーンショットを取る

動的なページのスクレイピングに関しては、基本的にはブラウザ自動化を使うことになる
Seleniumと、たとえばChromeのHeadlessモード(画面を表示しない)を使う方法とがある
前者は多くのブラウザに対応していて、後者はChromeなど特定のブラウザだけ
ソフトウェアテストの文脈では一つのコードで多くのブラウザをサポートしたいから前者を選ぶことになるが、スクレイピングの文脈ではその必要はない
"Engineer's way of creating knowledge" the English version of my book is now available on [Engineer's way of creating knowledge]

(C)NISHIO Hirokazu / Converted from [Scrapbox] at [Edit]