2017-07-05 12 views
4

私は定期的にニュースサイトの記事をスクラップし、それらをデータベース[MYSQL]に保存します。 掻き取りの仕方は、最も古い記事が最初に掻き出された後、もっと最近の記事に移動することです。例えば月の1日に書かれた記事について時間に基づいて動的データを取得するためのAPIエンドポイントを作成

は、第掻き取りIDを有するであろうID 1とJan2に掻き取られた記事を与えられる2

したがって、最近の記事は古い記事と比較してIDが高くなります。

複数のスクレーパーが同時に実行されています。

私は記事のタイムスタンプに基づいて問い合わせることができるエンドポイントが必要です。また、各フェッチでは10件の制限があります。私はのタイムスタンプを持つエンドポイントを照会するとき

問題がのタイムスタンプで投稿した20の記事ががある場合、たとえば発生し、チェックが私にあるすべての記事を与えるために作られています> = 1499241705この場合、毎回同じ記事を10件ずつ取得し、条件を>に変更すると、11-20の記事を読み飛ばすことになります。 idにチェックする別のwhere句を追加すると、スクレイパーが同時に実行されているときに記事が正しい日付順に挿入されないことがあるため、失敗します。

このエンドポイントを照会する方法はありますか。最新の記事と最初の記事とそれ以降の記事との整合性のあるデータを常に得ることができます。

EDIT:

+-----------------------+ 
    | id | unix_timestamp | 
    +-----------------------+ 
    | 1 | 1000   | 
    | 2 | 1001   | 
    | 3 | 1002   | 
    | 4 | 1003   | 
    | 11 | 1000   | 
    | 12 | 1001   | 
    | 13 | 1002   | 
    | 14 | 1003   | 
    +-----------------------+ 

最後のタイムスタンプとIDが句を介して送信されています。

など。 $this->db->where('unix_timestamp <=', $timestamp); $this->db->where('id <', $offset); $this->db->order_by('unix_timestamp ', 'DESC'); $this->db->order_by('id', 'DESC');

タイムスタンプ1003で照会すると、ids 14と4がフェッチされます。しかし、次の呼び出しでは、id 4がオフセットとなり、id 13をフェッチせず、次回にid 3をフェッチするだけです。したがって、データは失われます。

+0

http://mysql.rjweb.org/doc.php/paginationはい、最初にその問題を修正する場合は、あなたのDBに重複記事を持っています。 – urfusion

+0

記事は重複していません。同時に投稿された記事のみです。 –

+1

IDで注文してみませんか? –

答えて

2

2つの部分:タイムスタンプとID。

WHERE timestamp <= $ts_leftoff 
    AND (timestamp < $ts_leftoff 
      OR id <= $id_leftoff) 
ORDER BY (timestamp DESC, id DESC) 

ので、行の多くは同じtimestampを持っている場合idが一意であると仮定すると、それは問題ではありません、順序が完全に決定論的です。

があり、このための構文ですが、残念ながらそれは十分に最適化されていません。

WHERE (timestamp, id) <= ($ts_leftoff, $id_leftoff) 

だから、私はそれを使用しないことをお勧めします。 「オフ左」の概念に

より:

+0

idは一意ですが、シーケンスに含まれていない可能性がありますので、問題の例に示すようにデータがスキップされる可能性があります。 –

+0

'id'は' AUTO_INCREMENT'です。順不同の行を挿入することができれば(タイムスタンプの順序から外れる)、問題は本当に厄介です。解決策は、ユーザーに「過去数秒以内に到着したアイテムがまだデータベースに入っていない可能性がある」と「私たちが撤去したニュースのみを見ることができます。つまり、コードが動作するのに十分な期待値を設定します。 –

+0

私はニューススクレイピングをしました。私はその問題が深刻だとは思わない。 –

関連する問題