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

前回まででカントリーガールズ公式ブログから嗣永桃子が投稿した全写真をDLすることができました。 今回はそのコードに回前回DL時からの差分を取得するコードを追加します。 環境等 win 10 python2.7 python lib: 前回までで使用したもの python lib: ConfigParser google chrome 前回までのまとめ 追加するコード 基本的な考えかたはTwitterのときと同じです。 追加が必要となる処理は、以下の通りです。 最新記事のURLを変数に保持する プログラム終了時に外部ファイルに最新記事URLを書き込む プログラム開始時に外部ファイルから前回の最新記事URLを読み込む 処理する記事URLと読み込んだ前回の最新記事URLを照合し、一致した時点でプログラムを終了 追加したものがこちらです(……) ほとんど一緒の処理になるので、端折ってしまいました。 上記の完成したソースに、上に列挙した4つの処理が注釈付きで追加されています。 前回までのまとめ(差分取得なしバージョンと比べてみていただければと思います。 これは動作テストしていませんが動くはずです。はずです! 終わり!

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

前回は記事一覧ページに次ページが存在するかどうか判定するコードを書きました。 ここまでのコードで、画像の掲載されているページ全てにアクセスする準備が整いました。 今回はその個別ページから画像URLその他必要な情報を取得する方法について書こうと思います。 環境等 win 10 python2.7 python lib: BeautifulSoup python lib: urllib2 python lib: re google chrome 個別ページから画像URLリストを取得 個別ページの中からひとつをピックアップし、そのソースを見ながら、必要な情報がどこにあるか探っていきます。 今回はライブ&バスツアー(ももち)というタイトルの記事をもとに、コードを書いていくことにしました。 ページを見ると、取得したい画像以外にもたくさんの画像(赤矢印)が使われています。 今は記事本文内のデータだけが必要なのでまず最初に黄色の枠の中だけを取り出します。 ソースで言うとclass=”skin-entryBody”というdiv要素の中身になります。 さらにdiv要素の中を見ていくと、本文中に貼られている写真のオリジナルURL(縮小されていないもの)が以下の通り記述してあることがわかります。 (ちょっと調べてみたところ「…/oXXXXXX.jpg」というのがアメブロのユーザー投稿画像のオリジナルURLなんだそうです。 参考・アメブロ記事内の縮小画像ではなく元画像(縮小前)のURLを知る方法) では、a要素の中にあるURLを全て取得すればいいでしょうか? 正解は否、この記事にはありませんが、記事によっては、a要素を使って画像ではなくイベントページなどへリンクしている場合があると想定されます。 無駄なURLを排除するため「本文中の、a要素の、末尾.jpgのURLのみ」を取得するようにコードを書いていくと良さそうです。 では実際に書いてみます。これは前回の記事のスニペットの17行目、#ここにページごとの処理を書く の部分に入る処理です。 記事によっては、画像がない場合もあるので、その場合の処理も加えて書きました。 これで画像をDLするためのURLリストができました。 URLリストから画像をDLする DL方法はTwitterの時と全く同じです。ということは、画像URLリストの他に、 保存ディレクトリ ファイル名 をあらかじめ定義しておく必要があるということですね。 今回は保存ディレクトリを「momochi/」、 画像ファイル名を「記事の投稿日_記事タイトル_{連番}」 にしてみたいと思います。 #タイトルから記号などを削除 ももち(嗣永桃子)はタイトルに「♡」などの記号を使っていることが多いですが、そのままだとファイル名に使用できないので、記号をタイトルから削除しています。 #画像DL これ以下のコードはすべて{Tech}自分のTLの画像を保存する(3)で書いたものと同じです。 他との兼ね合いで多少変数名が変更されています。 これで実行して… 無事全ての画像をDLすることができました! 次のエントリで、前回DL時からの差分を取得するコードを追加してみようと思います。 (ももちのブログはこれ以上更新されることがないけどTT)

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

前回の記事で、DLしたい画像の掲載されている個別ページのURLリストを取得しましたが、記事一覧ページの最後を判定する処理がまだ書かれていません。 今回はその条件を考えてみようと思います。 次ページの有無を確認する 前にし取得したデータと一件目の記事名が同じとか、ページ番号が同じとか、判定条件はなんでもいいんですが、 次のページが存在しない場合、以下の画像のようにページネーションの「次へ」ボタン(左の矢印)の表示が消えます。 このボタンの有無で判定するのが定石だし他にも応用が効くと思うので、それでいきます。 では、どこでボタンの有無を判定できるか、chrome developerツールを使って、3ページ目と7ページ目(最終)のページネーション部分のソースを比較しながら探っていきます。 (developerツールは該当するHTML部分が分かりづらいときに便利です。) 3ページ。「data-uranus-component=”paginationNext”」という記述を持つa要素のclassに「skin-paginationNext skin-btnIndex js-paginationNext」と書かれています。 7ページ(最終)。classに「is-disabled」という記述が加えられています。 このclassの値の数で、現在参照しているページが最終ページか否かを判断できることが分かりました。 では前回書いたコードにその記述を追加してみます。 最後のページで処理を終了するようになりました。 次のエントリで個別ページのスクレイピングにはいります。

{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に書いておきましょう。 #もし前ページと同じページなら繰り返しを終了 ページ内の何かの要素を判断基準とします。… Continue Reading {Python}ウェブサイトやブログの画像を保存する(1)