{Python}ウェブサイトやブログの画像を保存する(1)

今回はツイッターやインスタグラム等のSNSではなく、ウェブサイトやブログの画像を収集する方法について書きます。
スクレイピングとはWebページのHTMLデータからデータを抽出し収集することです。
このスクレイピングはサイトによっては禁止されていたり、よく思わない管理者もいるので、気を付けましょう。
今回収集する画像収集程度のスクレイピングでサーバーに負担がかかることはないですが、
サーバーが落ちるような負担がかかると思っていたり、なんとなくイヤっていう人は多いみたいです。
管理者の意見は尊重し、禁止の場合は潔く諦めましょう。

環境等

  • win 10
  • python2.7
  • python lib: BeautifulSoup
  • python lib: urllib2
  • google chrome

  • サイトスクレイピングの基本的な流れ

    スクレイピングプログラムですが、SNSはすべてのアカウントが同じ作りでできているので、ひとつのSNSにつきひとつのプログラムを書けば全ユーザーに対応できます。一方で公式サイトや個人サイト、ブログなどは個別にプログラムを書いていく必要があります。
    とは言っても基本的にやることはどのサイトでも同じなので、今回例にあげる方法を見ればたいていのサイトに応用できると思います。

    基本的な流れ
    ※flickrに画像を日付やイベント名等のデータを同時に収集し、紐づけて投稿することを想定した方法です。
    単に画像だけがほしい場合はもっとシンプルな方法でいいと思います。

  • DLしたいデータの掲載ページのURLリストを作成
  • 収集したURLに順番にアクセス
  • アクセスしたページ内の画像URLを全て取得
  • 画像URLから画像をDLする(これはツイッターTLの画像DL時と同じです)
  • それでは、例としてハロプロのきゃわいい解体鬱グループ・カントリーガールズの公式ブログから、「嗣永桃子」が投稿した全ての写真をDLしていきましょう。

    DLしたいデータの掲載ページのURLリストを作成

    この例ではそれぞれ以下のようになります。

  • DLしたいデータ=嗣永桃子投稿記事内の画像
  • DLしたいデータの掲載ページのURLリスト=嗣永桃子投稿記事URLリスト
  • 「嗣永桃子」の投稿した記事URLリストを取得するにはどうすればいいでしょうか。
    個別記事へのリンクがなるべく多く載っているページを探します。
    このブログの場合 記事一覧 > テーマ別 > 嗣永桃子 が最適のようです。

    このページのリンクのURLを集めていけばいいわけです。
    ただ、たいてい記事一覧ページは1ページにおさまることはありません。
    次のようにページネーションされ、分割されています。

    「記事URLリストを」収集するために「記事一覧ページのURLリスト」を最初に作る必要があるということです。

    記事一覧ページのURLリスト作成

    記事一覧はたいていURL末尾の数字がページ数となっていますので、
    実際にページ遷移しながらURLがどのように変化しているか確認していきます。

    記事一覧1ページ目のURLです。

    記事一覧2ページ目のURLです。末尾に「-2」が加わっています。

    記事一覧5ページ目のURLです。末尾に「-5」が加わっています。

    今度はURL末尾に「-100」を加えてアクセスしてみます。
    100ページ目は存在しないので、最後のページ(7ページ)表示されます。

    記事一覧ページのURLリストは、「https://ameblo.jp/countrygirls/themeentrylist-10087903784-{ページ番号}」の{ページ番号}部分を、新しいページがでなくなるまでインクリメントすることで取得できることが分かりました。

    では、「すべての記事一覧ページにアクセスするためのコード」をpythonに書いておきましょう。

    #もし前ページと同じページなら繰り返しを終了

    ページ内の何かの要素を判断基準とします。
    ページを実際に見て、のちほど条件を書き足すことにします。

    個別記事URLリスト作成

    次に記事一覧ページの中身(HTMLソース)を見ながら、記事URLリストを取得するコードを書きます。
    記事一覧ページを右クリックしてソースを表示してみてください。(chromeの場合)

    このようにページのソースコードが表示されたと思います。
    今、$soupの中にはこれと同じものが格納されています。この中から、個別記事のURLを収集していくことになります。
    試しに個別記事URLの一つをコピペして検索してみます。


    検索すると一つの記事に対して5つのリンクが貼られていたことが分かりました。
    どこからURLを取得してもいいのですが、ここは正攻法で、記事タイトルに貼られたURLを取得していきましょう。
    URLのすぐ上、「data-uranus-component=”entryItemTitle”」という記述のあるh2要素に注目します。
    この要素は1ページ内に20個あり、それぞれの中に記事URLが入っているようです。

    20個の「h2 data-uranus-component=”entryItemTitle”」(赤枠内)の要素をページから取り出してみましょう。]

    これで$h2sの中に赤枠内(<h2 data-uranus-component=”entryItemTitle”>~</h2>)が20個の配列として格納されました。
    次に一つ一つのh2要素から、url部分だけを取り出して、個別記事URLリストとして配列に格納します。

    記事リスト1ページ分のURLリストができました。
    やっている内容はそんなに多くないのですが、どんな風に考えてスクレイピングをしているかを書きたかったので長くなってしまいました。
    ので、次のエントリで、同じページかどうか(次のページが存在するかどうか)を判定する条件を考えた後、個別ページのスクレイピングに映りたいと思います!

    Leave a Reply

    Your email address will not be published. Required fields are marked *