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

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

さくらサーバーのレスポンスが遅い件

掲題の通りです。 sakura.ne.jpのドメインからまるわかりの通り、さくらレンタルサーバーを利用しています。 これまでレンタルサーバーはロリポップを使ってきましたが、今回初めてさくらを使いました。 理由としては今後Everykey関連の内部的なシステム(画像収集のために動いてるシステム)をすべてサーバーに移管しCronで実行することを考えていて、その上でpythonの動くサーバー最安ということ、そしてなんとなくロリポップ…というか母体のGMOインターネットという会社(グループ)に対して…思うところがあった…(…)ために、深く考えずに老舗であるさくらにしてみました。 プランはライトです。WordPressは使えないみたいに書いてあるんですけど、MySQLが使えないだけなので、SQLliteを使ってこのブログを運用しています。 WordPressを作る前から本体(動的ページで構成されている)のレスポンスが遅い…遅すぎる…ことがかなり気になっていましたが、自分のコーディングの問題だろうと自責ですませていました…。もしくは自宅のネット環境か。 WordPressを導入してみてわかりました。 これはサーバーのせいですね。 レスポンス測定してくれてるページを色々見ましたが、かなり遅いみたいです。 実際何度タイムアウトになったかわかりません。実用に耐えないと思います。スタンダードプランにしたら改善されるのか?というとそうも思えないのでサーバー移転したい…でも最低契約期間は三ヶ月で、それ以降のお金しかかえって来ないんですって。 三ヶ月後移転を想定しながら色々整えてどこかに引っ越したいです。どこがいいかなぁ。 という愚痴。 契約する前に色々下調べするべきだと学びました。が!どこのサーバーにはいるかにもよると思うし運かもしれない。 まあどうせCronもSSH接続も使えないからそのうちスタンダードに上げるつもりだったけれど。 Cron、ライトプランでも使えるかと思ってた。 しばらくまたサーバー難民です。 参考:さくらインターネットのレスポンス(応答速度)と安定性を評価しよう hostingstock.net/article/sakura_ne_jp/performance2/

{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)

{Tech}python開発環境「IDLE」の使い方

{Tech}python2.7のインストールで、pythonを自分のPCにインスト―ルし、pythonファイル(.py)を実行することができるようになりました。 自分で新しくコードを書くためには、pythonインストーラに同梱されている、GUI開発アプリケーション「IDLE」を使うのが簡単です。 今回はその「IDLE」について書きます。 環境等 win 10 python2.7 IDLEの起動 pythonをインストールするとIDLEも同時にインストールされているはずです。 「全てのプログラム」メニューから「python」を選択し、IDLE(python GUI)を起動します。 IDLEが起動します。 この「>>>」のあとにpythonコマンドを入力するだけで動きます。 試しにprint ‘hello world’と入力してEnterを押してみます。 命令の通り「hello world」という文字列が表示されました。 ただ、1行書いたら消えてしまうので、これだけではpythonファイルを作っていくことができません。 実際に開発するときはFile > New Fileをクリックして、別画面を開き、そこで開発していきます。 新たに開いた画面(右ウィンドウ)にコードを書き、さっきの画面(左ウィンドウ)に結果が表示されるようになりました。 画像では「’hello world’と表示しろ」「’5かける10は→’という文字列のあとに「5*10の値」を表示しろ」という二つの命令を書き、test.pyという名前で保存したところです。 [F5]キーを押してこのコードを実行します。 左ウィンドウに上記の通り処理結果が表示されました。 このようにしてpythonプログラムを開発していくことができます。 {Tech}python2.7のインストールで書いたように、pythonファイルはコマンドプロンプトからも実行できますが、実際の開発ではこのようにIDLEを使ってソースコードをいじりながら、実行していくことが多いです。 IDLEは気軽に開発できてとてもいいGUIですが、ただ一つ欠点があります。行表示ができません。 表示できるように変えられないか調べたんですが、やっぱりできないようです。 そこはどうにか工夫していかないとだめですね。 以上、終わりです。

{Python}python2.7のインストール

python2系のインストール、ローカル環境での開発環境構築について書きます。 python2.x(2系)と3.x(3系) 現在使用されているpythonはバージョン2系と3系の二つがあります。 もちろん3系のほうが新しいわけですが、 2系と3系は文法が異なるところが多く移管が難しい、 3系に未対応のライブラリもある(主要なライブラリは対応済だが) という理由でまだ2系も現役です。 私の場合は正直単に慣れているからという理由だけですが、Everykeyに関するものは今のところすべてpython2.7を使って書いています。 今まで書いたコードを動かすために、ここではとりあえず、python2.7のインストール方法を紹介します。 python3系との共存の方法についてはまた違うエントリで書こうと思います。 環境等 windows 10 64bit os python2.7のインストール 環境の確認 まずは、コントロールパネル\システムとセキュリティ\システム から自分のosの種類を確認しておきます。 (win10では、コントロールパネルはwinキー+R > ‘control’で検索 で開けます) 私のPCは64bitOSです。 インストーラのDL&インストール 公式のpython2.7.14インストーラ配布ページから自分の環境にあったインストーラをダウンロードして、インストーラ―の案内に従って任意のディレクトリにインストールします。 私の場合、windows 64bit osなので、「Windows x86-64 MSI installer」をダウンロードし、Cドライブ直下にインストールました。 環境変数PATHの設定 環境変数PATHとは pythonプログラムをコマンドプロンプトで動かすには環境変数というのを設定してあげる必要があります。 環境変数とはパソコンが持っている変数で、全てのプログラムが参照し利用できるものです。 本来コマンドプロンプトでpythonプログラムを動かすには、 $ C:\Python27\python.exe <動かしたいpythonファイル名> という命令が必要になります。(C直下にインストールした場合) しかし、毎回フルパスを書くのは面倒ですし、そんなことをしてる人はいません。 通常は、以下のように記述してプログラムを動かしていきます。 $ python <動かしたいpythonファイル名> このようにするために、「プログラムの検索先」一覧を保持する変数である「PATH変数」にpython.exeの格納場所である「C:\Python27\」を登録し、「python」と入力するだけでC:\Python27\python.exeを自動で見つけて実行してくれるようにするというわけです。 環境変数PATHの設定 では実際にC直下にpythonをインストールしたという想定でPATHを設定していきます。 (自分のインストール場所に適宜置き換えてください) コントロールパネル\システムとセキュリティ\システム > システムの詳細設定 > システムのプロパティ > 「詳細設定」タブ下部の「環境変数」… Continue Reading {Python}python2.7のインストール

{Python}instagramの画像を保存する

今回はinstagramの画像(動画)を保存する方法について書いていきたいと思います。 保存だけに至っては、全く難しいことはありません(笑) すでに完成されたinstagram-scraperという素晴らしいライプラリがあるからです。 そのライブラリの使い方だけではなんなので、複数アカウントの画像を取得するためのバッチファイルでも書きます。 (DLだけなら手動でいい気がしますが、私は同時にflickrに投稿するプログラムも動かしたいので必須です) 環境等 win 10 python2.x python lib: instagram-scraper instagram-scraperのインストール コマンドプロンプトを開きます。 pipを使ってインストール&最新版にアップグレードします。 $ pip install instagram-scraper $ pip install instagram-scraper –upgrade これでインストールは完了です。このままコマンドプロンプトで以下のように打つともうDLが始まります。 $ instagram-scraper <target user id> (衝撃の簡単さ!) オプションの設定 一番簡単にはこれで動くのですが、色々なオプションを指定することができますので、適宜設定していきましょう。 主なオプションは以下のようなものがあります。 名前 略形 説明 初期値 –login-user -u ログインユーザーのIDを指定します。storyを取得したいとき必要 –login-pass -p ログインユーザーのPWを指定します。storyを取得したいとき必要 –destination -d DLしたファイルを保存するディレクトリを指定 ./<target username> –media-types -t 取得したいメディアのタイプを指定します。image, video, story (story-image… Continue Reading {Python}instagramの画像を保存する

{Python}自分のTLの画像を保存する(4)

前回までで、200までの任意の数を指定しツイート情報を取得し、そのなかの画像をDLすることができました。 今回は、 200件以降3200件までのツイートの取得 前回DL以降増えたツイートのみを取得 する機能を追加していこうを思います。 環境等 win 10 python2.x python lib: これまで登場したもの python lib: ConfigParser   前回までのコードまとめ 前回までのコードをまとめると今はこうなっています。 このコードはまるごとコピペすればすぐに動きます。 しかし、これは一回きりのDLしかできないので、実用的ではありません。少し改良する必要がありますね。 200件以降のツイートを取得 ツイッターでは無料のAPIで遡れるツイートは3200件までらしいです。 ただこれは一人のユーザーのツイート(プロフィール画面から見られるやつ)を遡るときであって、検索なら100件7日以内? 自分のフォロイーのツイートが混在するhome timelineについては800件までという噂。 私もよく分かりません(このプログラムでは3200件まで試したことがないので) とりあえず、最大まで遡る機能を実装してみましょう。 方法は簡単です。 APIを叩いて処理する部分(上のスニペットでは18~66行)をパラメータ’page’の数を増やしながら繰り返せばいいだけです。 200ツイート * 16ページ = 3,200ツイート なので16ページまで繰り返すようにし、ツイートの取得ができなかった時点で繰り返しを終了します。 前回DL以降増えたツイートのみを取得 これで過去のタイムラインについては取得できる限り取得することができました。 こうして一度DLのプログラムを動かした数日後に、新しく増えた画像だけDLするにはどうすればいいでしょうか。 これをうまく行うためには、プログラムを動かした時点で、次回のために「ここまで取得した」という値を保持しておくのがいいです。 27行目’for i, tweet in enumerate(timeline):’の直後に以下のように加え、1ページ目の1ツイート目(=プログラムを動かした時点の最新ツイート)のIDを$last_idに格納します。 全てのダウンロードが終わった時点で$last_idに保持していた値を外部ファイルに書き込んで記録します。 まず書き込む用として、予めpythonファイルと同じディレクトリに、以下のようなlast_update.iniファイルを作っておいてください。 次に書き込むためのコードです。 68行目”print ‘All tweet media downloaded.’”の直後あたりに以下のように記述します。 このコードで、先ほどのiniファイルのNone部分が最新のツイートIDに上書きされます。 次のDL時は、このツイートIDを読み込み、ツイートを取得する範囲を決めます。 というわけでプログラムの頭に戻って、このIDを読み込むコードを書き足してみましょう。… Continue Reading {Python}自分のTLの画像を保存する(4)

{Python}自分のTLの画像を保存する(3)

前回までで、自分のタイムラインの情報を取得し、必要なツイートのみを選別することができました。 いよいよDLするコードを書いていこうと思います。 以下の処理はすべて前回の記事の最後のスニペット内「#このあとにDL処理を書く」に書きます。 環境等 win 10 python2.x python lib: os python lib: requests DL対象のURLリストを作成 データの中からDLするコンテンツのURLを取得し、配列に格納します。 動画の場合はURLの格納されている場所が違うので、場合分けをして取得します。 保存ディレクトリとファイル名の設定 DLする前に画像を保存するディレクトリと個々の画像のファイル名の定義をする必要があります。 ファイル名は被ってしまうと上書きされてしまうので、必ず一意になるものを考えます。 #ディレクトリ設定 すべて同じフォルダに保存してもいいのですが、ここでは、このpythonプログラムが入っているディレクトリに「」のフォルダを作って、ユーザーごとにフォルダを振り分けて保存してみます。 #ベース画像ファイル名(これに連番を付ける) 画像ファイル名は、$dateと$url_idをアンダーバーで繋いだものにしました。 さらに、この末尾に後ほど書くDL処理のなかで1~4の連番を振ることで一意のファイル名となります。 $dateは、本文中に書かれたyymmdd形式の日付をyyyy-mm-ddに変換したもの、 $url_idはツイートの短縮URLの末尾の英数字、 1~4の連番はツイート中の何枚目の添付画像かを表したものです。 画像のダウンロード 上記で用意した変数を使って、「人間のためのHTTP」という売りで分かりやすい?requestsというHTTPライブラリを使ってURLから画像を取得していきます。 ツイッターではなかなかないですが、画像のDLは画像が削除されていたりしてできないときもあるのでtry~exceptで、失敗した時の処理も記述しておきます。 さて、これで、このpythonプログラムが置いてあるのと同じディレクトリにuser_idごとのフォルダが生成され、そのなかに画像や動画が保存されているはずです。 次のエントリでは、 一度に取得できる200件よりもさらに古いツイートを取得するコード、 継続的に使用するために、前回保存時以降のツイートのみを取得するコード を書き足していきたいと思います。