LoginSignup
MindZanmai
@MindZanmai

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Webスクレイピング

解決したいこと

@killy さんに質問いたします。
Pythonの入門書を読んでいました。その最後の章で「Webスクレイピング」が取り上げられていました。
いわゆるWebクローリングのことですね。

Pythonでは、requestsというパッケージとBeautifulSoupというサードパーティ製のパッケージを利用します。

@killy さんの記事をどこかで読んだのですが思い出せません。クローラの便利な使い方だったと思います。Mindでクローラを作成するのではなく、便利な他言語製ツールの出力結果をMindで料理するような主旨だったと思います。

よろしくお願いします。

1

3Answer

説明が悪かったです。ここに投稿しているのだから「Mindのクローラ希望」というように解釈されたのかと思いますが、そうそのwgetのkillyさんのノウハウをどこかで読んだので、それがどこだったかを教えて欲しいという質問の主旨です。

書くのが面倒くさい処理は、Mindから既存のツールを呼び出して使用しています。
よろしくお願いします。

1

そういう趣旨でしたか。分かりました。
私はwgetオンリーなので他のツールは知らないのですが、ネットでの情報と実験を合わせて学習ししていきました。とにかく実験は大切です。

wget付属のマニュアルのほかでは「このサイトを読めばいい」みたいなのがあるといいのですが今となってはよく覚えていません。
wgetのバージョンによってサポートされない機能があったり挙動が変わるのもありました。

業務で使うものはwgetのソースからダウンロードして少し調整して自分でコンパイルするやりかたをとっていました。業務では細かなことが問題になったりします。

 (以下は最新のwgetではOKなのかも知れません。あくまで少し前でのことです)

たとえば、

 http://DOMAIN/DIR/

のようなURLが指定された場合、ファイル名が省略されているのでクローラに限らずブラウザなどはいったんエラー(404)を引き取ってから改めて、

 http://DOMAIN/DIR/index.htm
 http://DOMAIN/DIR/index.html

などリトライして取得します。当時のwgetはデフォルトでは "/止めURL" に対して index.htm を強制的にローカルファイル生成していました。このあと、業務のサイト内検索で検索結果のページにURLを付加するときに index.htm を使うことになり、収集ターゲットサイトが "/止めURL" に対して index.html で統一している場合には検索結果から飛べないことになります。(多くのサイトでは index.html が多い)
 このため、wgetをソース修正して、デフォルトの/止めURLの生成を index.html にする調整をおこないました。

 その他、手持ちメモからざっと書いてみます。

 --timeout オプションが古いwgetでは効かない

 同じく、このデフォルトが長すぎるため(60秒とか)、大規模サイトで異常があったときに、1ページ毎に60秒待つことになりちっとも終わらないので実務ではこんなに長いのは駄目、

 httpsのサイトから収集するのに、普通にクローリングかけるのだと認証エラーになるので --no-check-certificate を付加する(認証を甘くする)とか、あるいはそもそもSSL使わずにあえてhttpで取得しに行く(wgetのソースからのメイクが必要)とか、

 ディレクトリ除外というのがあります。たとえば i-mode用のコンテンツやスマホ用コンテンツが別にあるとき、そこまで取りに行くと重複が多くなってしまうので除外したいわけです。その除外ディレクトリの指定で、たとえば、

 --exclude-directories=mind

とやったときに、mind/ のほか mindsearch/ は除外されるのか?とか、このあたりはやってみないと分からないことがあって、しかもwgetのバージョンによって挙動が違うことがありました。

 ファイル名の除外では、ちまたのwgetの解説ではあいまいなことが多かったですね。
たとえば、イメージファイルを取らないようにするため、

 -R

というオプションを使うことがありますが、-R .jpg をサンプルとするサイトがあったり、-R jpg をサンプルとするサイトがあったりしてまちまちでした。結果的にはどちらでもOKですが、はっきりした理由は「末尾一致」だっということで、厳密には前者が正しいです。

あとは、解説書などでは、

 --wait

オプションを指定しないものが多いのですが、これで全ページダウロードするとき待ち時間を入れないと絨毯爆撃になってしまいターゲットサイトから怒られるので --wait=2 とかは必須になります。もっというと、古い wget では 1.5 秒という小数による指定ができませんでした。

 逆にごく初歩的な知識としては、

 -l N (どこまで深く取得するかの指定)

で N=1 はどこまで取得するのか実験して確認するとか(n=1は起点およびその直下まで)、

こんな感じでしょうか。

1

Comments

  1. @MindZanmai

    Questioner

    お手間をおかけしお忙しいところ申し訳ございませんでした。

    昔どこかで(掲示板かメール?)、クローラの話になったのか気になっていました。便利なのでどうぞという感じでしたがちゃんと理解していなかったので質問いたしました。

  2. そうでしたか。
    Mindのプログラムで・・ではないようでしたでwgetのご説明をしましたが、Mindで作ったクローラも社内にはあります。そっちの話ではないですかね。ではまた後日ということで(^^;

  3. @MindZanmai

    Questioner

    Mind製クローラ、それは初耳です。
    お時間ができましたらまたの機会によろしくお願いします。

    Pythonの入門書を調べていたら脱線してしまいました。
    プログラミングで大切なのは、「実験」してめげてあきらめないこと。

  4. うちでやっているサイト内検索サービスの社内ツールです。
    先のコメントで書きましたように、wgetでクローリングしているのですがとあるお客様(住宅関係)でちょっと凝ったクローリングをする必要がありwgetではできずやむを得ず自作しました。
    wgetでリカーシブ取得するモードでは通常はリンク先をすべて、あるいは除外ディレクトリや除外ファイル名などを加味してすべて取得しに行くのですが、もっと細かな処理が必要でした。リンク先のURLのわずかな特徴を検査するとかです。
    最終的にはその案件は没になったので、それっきり使ってもいません(^^;
    また機会がありましたら情報公開します。
    実験は大切ですね。

  5. @MindZanmai

    Questioner

    「既存のツールではかゆいところに手が届かないので自作してしまいました」というのはいつもながら凄い話ですね。

     Pythonではユーザ提供、サードパーティ製のライブラリが山ほどあるようです。

    来年のMindは数値計算ライブラリとGUIライブラリを試用してみたいと思っています。

  6. 本当は「wgetもどき」みたいなのは作りたくなかったのですが(^^;
    自家製クローラはいつか役に立つだろうと思っています。

  7. @MindZanmai

    Questioner

    プログラミング言語って武器なんですね。その気になればなんだって作れる。
    他人に踊らされるようなツールは嫌いです。
    それがなんだとは言いませんが。

はい、昔はクローリングと呼んでいましたが、最近はスクレイピングと呼ぶようですね。

私は長いことサイト内検索を業としてやってきましたので、クローラも長く使っています。
サーバで動かすので環境はLinuxで、そっち系で有名なwgetを使っています。
wgetも使い込むと奥が深くて多少ノウハウもたまりました。

逆に質問で申し訳ありませんが、wgetのような既存のツールではなくて、Mindのクローラを希望される理由はどういったものでしょうか?(それによりお答えも変わるかと思いまして)

0

Your answer might help someone💌