質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.49%

  • API

    1554questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

  • データベース

    715questions

    データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

  • teratail

    415questions

    teratail(テラテイル)は、プログラミングに特化した日本語Q&Aサイトです。

teratailのスクレイピング結果をDBに保存する際の更新目安

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 639

mitsuru793

score 149

teratailで欲しい機能が色々と出てきたので自分で作ろうと思います。そこで質問があります。
ページを更新するたびに、全質問をAPIで取得するのはteratailのサーバーに負荷がかかるのと、表示に時間がかかると思います。そこで、予め定期的にAPIを実行しておくスクリプトを用意しておいて結果を自前のDBに保存し、そのDBからデータを取得して表示させようと考えています。

例として、下記のはてなブックマークランキングサイトでは、2005年からのデータを検索することができます。
歴代はてブ多い順 / 年ごとのランキング 2015年 1位~50位

これだけの量を、ページを表示するたびに全記事取得のAPIを叩いているとは思えません。おそらく定期的にAPIを叩いて自前のDBに保存していると思えます。しかし毎日データを更新しようにも、これだけの記事量となるとAPIを叩くのにも制限がかかるのではないかと思います。

上記サイトの場合、記事ごとにブックマーク数は常に変動すると思うので定期的にデータを更新する必要があると思います。このチェックを行うには、APIを叩いて全記事を取得してチェックして方法がいいのでしょうか?

また、DBに保存する方法以外にもこういうのがあるよ。向いているよ。というのがあればぜひ教えていただきたいです。
ご回答、よろしくお願い致します。

teratailのapi紹介サイト
teratail API v1.0 · Apiary
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

 ... APIを叩いて全記事を取得..

現状だと、https://teratail.com/api/v1/questions?limit=100 とすると
全 163 ページのうちの1ページ目 100 件 (2015-02-20 .. 2014-08-18) の質問を取得できます。

1時間で300回まではリクエストできるようなので、つぎのような更新スケジュールはいかがでしょう。

* 日中は 10分.. 30 分毎に
最新の一覧 20件 1 ページ分を取得して、DB を更新する。
最新の質問 20件を取得して DB を更新する。

* 夜中 (朝の3時頃) に 100件毎に全ページを取得して、DB を更新する。(160 アクセス)
一覧は上のようなスケジュールで、全件をDBに保持することができそうです。

* 質問については 全部で2万件あるとすると, 300 件/ 時間をおこなったとしても、70時間 (3日間)かかってしまいます。
 最初は3日 .. 1週間かけて、全件を取得して DB に保存するしかありません。
 あたらしい質問(直近 100件)は↑のような更新スケジュルで日々更新できますが, 
古い質問は更新できません。
週に1度ぐらいの頻度で、全質問の情報の再取得をします。

提案;
  teratail 様側で、質問全件データを csv とか json 形式で1ファイルでダウンロードできるようにしていただけると、この質問のようなケースだと初期データの構築が楽になるのですが。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/20 23:21

    ご回答、ありがとうございます。

    > 最新の一覧 20件 1 ページ分を取得して、DB を更新する。
    これだと次の取得までに21件以上新規質問があれば取りこぼしてしまうと思ったのですが、全件ページ取得も別でスケージュルで組むのですね。
    もし、2万件あるとすると全ページ取得は毎日行うことは難しいので定期的に1週間近くかければ過去の情報の更新もできるとわかりました。

    参考に挙げた「はてなブックマークランキングサイト」のブックマーク数は、直近のブックマーク数ではなく古いものほどリアルタイム性が失われている可能性がありそうです。

    質問に対するコメント状況の監視も試みようと思っているので、なるべく負担のないスケジュールを考えたいと思います。

    結局は全件のデータ取得を定期的に続ける必要がありますね。確かに初期データのみは、運営側から提供してもらえば構築が楽になりますね。
    大変参考になりました!ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    teratail

    ♡o。.。o♡o。.。o♡o。.。o♡o。.。o♡o。.。o♡o。.。o♡o。.。o♡ アクセストークンって何ですか? 調べたのですがしっくりきません。 teratailのア

  • 解決済

    Ruby on railsについて教えてください

    下記の式を実行した際に、ActiveRecord::Relation []、とブラウザに表示されたのですが、これは何のデータ型なのでしょうか? またデータ型と異なる場合はどのよう

  • 受付中

    全ブログ記事のフッターに固定記事一覧を出力したい

    bloggerというサイトを利用していますが、各記事のフッターの部分、出来ればコメントと記事の文末の間くらいに固定リンクの一覧を表示させたいのですがどうすれば良いでしょうか?

  • 受付中

    掲示板の投稿内容をAPIで取得したい

    2chなどの掲示板の投稿されている内容をAPIで取得する、ということをしたいのですが、 可能でしょうか? 2chでなくてもよいのですが、何か特定の掲示板から投稿内容を引っ張

  • 解決済

    wordpressプラグインEvents Managerで地図を表示させたい

    wordpressのプラグインEvents Managerを使用しております。 今まで無事に動いており、便利に使用していたのですが、サーバーを引っ越したところGoogleマップが

  • 解決済

    ajax送信時の文字化け

    入力フォームの値を変数に格納後、PHPにajax送信して登録する処理の際、 dataが「data: {name:○○}」の形式では正しく登録されますが FormDataオブジェ

  • 解決済

    Wordpressサイトのグローバルナビをクリックしたときに人気記事の投稿一覧を表示させたい

    Wordpressのグローバルメニューの「人気ランキング」をクリックすると、見た目上デザインは投稿記事一覧表示で、ビュー順で記事をランキング表示させたいと思っています。 使用テ

  • 解決済

    ue4 set game pausedについて

    私は、画面を停止させるのにset game pausedを使っているのですが、 set game pausedの解除し再び動かせる方法が知りたいです。 どうやら、set gam

同じタグがついた質問を見る

  • API

    1554questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

  • データベース

    715questions

    データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

  • teratail

    415questions

    teratail(テラテイル)は、プログラミングに特化した日本語Q&Aサイトです。