私は定期的にニュースサイトの記事をスクラップし、それらをデータベース[MYSQL]に保存します。 掻き取りの仕方は、最も古い記事が最初に掻き出された後、もっと最近の記事に移動することです。例えば月の1日に書かれた記事について時間に基づいて動的データを取得するためのAPIエンドポイントを作成
は、第掻き取りIDを有するであろうID 1とJanの2に掻き取られた記事を与えられる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をフェッチするだけです。したがって、データは失われます。
http://mysql.rjweb.org/doc.php/paginationはい、最初にその問題を修正する場合は、あなたのDBに重複記事を持っています。 – urfusion
記事は重複していません。同時に投稿された記事のみです。 –
IDで注文してみませんか? –