2019年は、ちょうど学校の外に、最初の会社に来て、最大の成果は、データをフェッチするグローバルシステムの完成です!簡単に言えば、プロジェクトやアイデアの実現を説明避けるために、将来の試みを自分自身に任意の時点で、プロジェクト内のピットを強化しました!
複数の日半、そして最後にテスト提供することで、続きました!世界中からのプロジェクト、サーバが特に良好ではないため、Google、Bingの、ヤフー、してデータをキャプチャする、と考慮しては、ダーティデータの多くを持って、我々は時間の実現にデータストレージを持っていない、あなたがしたいですデータの永続性を使用すると、スプレッドシートを案内する方法としてエクスポートデータを使用することができ、保存しました!
難易度:
プロセス全体をクロールします大幅な改訂を経験したプロジェクトは、多くの変更を行いました。我々はデータをクロールする場合、必要性は、対応するインタフェースにスプライシングされたダイナミック後のデータをつかむキーワードで対応するウェブページのURLリンクを検索し、私たちが望むデータをクロールするために深く行くために公式サイトへのリンクにアクセスするにはURLリンクの背後にあります。データが永続ストレージのためにデータベースに保存することはできませんので、そのURLへのクロールは、コレクションですので、どのようにデータをフェッチしようとした後、URLのクロールの内側へのディープリンクができ困難な問題となっています!
ダニエルの助けを借りて、私たちはアイデアの実現を見つけます:
スタートボタンページでは、サーバーへのAjaxリクエストデータをクロール開始の送信、データの完了をフェッチした後、データを結合インタフェースに戻され、所定のURLのそれぞれに固有の識別子が、すぐに第二サイクルのAJAXを呼び出しますデータは、バックURLに対応する識別子に係るスプライスさフェッチクロールを完了するために戻された後深さを把持キャプチャデータ送信要求を横切ります。
難しII:
まず、このようなA困難な問題は、この問題が解決されているが、解決するために、私たちは途中で停止したい場合はどのように行うには?結局のところ、このサイトでは、データをクロールするとき、私はそれについてのデータの量を感じるとき、私は私がしたい、私は既存のデータを引き出したい、追いつくためにしたくない、このサイトのすべての時間を開く必要がありますクロールを停止した後、データをエクスポートし、その後、どのように私はそれを止めるのですか?これは、第二の出会い難しい問題です!
なぜこれが難しい問題でしょうか?1時間なので、私はバーの数を送信するために、どのように多くのURL AJAXリクエストによって実現ループ内のすべてのURLを超える横断する必要があります。Ajaxは非同期であるため、インターフェイスがアヤックス出現スタック状態の多くを送信しませんが、私は、要求を介して送信されてきたが、次のデータは、私が介入することができませんでしたが返され、そう、これは問題の嘘です。返されるデータは、隠されたとき、私はまた、最初の検索が終了しないため、一見クロール操作は、ユーザが第2の検索操作を行った場合、しかし、閉鎖された、ストップボタンをクリックしようとしました、2回目の検索が非常に遅くなります。これは、良い解決策ではありません。
その後、ブラウザのネットワークを介して要求がname属性を持っているので、私は、各要求、それにname属性によって得ることができない、それを発見しましたか?成功したステータスコードが200であるので、私は、ブラウザを介してサーバに伝えることができ、そして、あなたは私のデータをバックアップし、私はしたくない与えることはありません。答えはAコースです。
<スクリプトSRC = "jquery.js"> </ SCRIPT> <スクリプト> VAR XHR = $アヤックス({タイプ: 'POST' 、 URL: 'b.php' 、 データ: '' 、 成功:関数(){ 警告( 'OK' ); } }) 警告(XHR)。 console.log(XHR)。 </ SCRIPT> <ボタンID = "歌">中止</ボタン> <スクリプト> $(関数(){ $( "#song")。(クリック機能を(){ 警告(「クリック」)。 xhr.abort(); }) }) </ SCRIPT>
我々は、我々は、この変数を使用し、あなたがabortメソッドがない応答(パディング)が出て閉じているん呼び出すことができ、必要に応じなり、要求された時間内にアヤックスの要求、変数に割り当てられ、このAJAXを作成します。
もちろん、このようなアプローチだけ近いのAjaxリクエストすることができ、我々は閉じられ、どのような方法の大部分を必要としますか?
はい、配列、すべてのAJAX、内側に押し込み、その後、停止をクリックの定義は、配列を通じて、すべての要求を遮断しました!
// AJAXアレイ定義 VAR ajaxArr = []と、 // デプスインタビュー関数 関数requestPlus(上記ID上記URL){ // インターフェイス上のIDとURLを取得 // 1. TRの全ての取得 // Ajaxの詳細な検索を IF(typeof演算(URL)!= 未定義){ REQ ++ ; $(「.Logo_div」;).SHOW() // 非同期要求になるための同期要求の後に、すべてのAjaxは、非同期のリクエストになります後、後で同期をクリックし、同期防ぐための非同期が存在しますので、この目標は設定この機能は同期になりません、スピードに影響 $ = .ajaxSettings.asyncをtrueに。 currentAjax = $アヤックス({ キャッシュ:偽、 // キャッシュ データ型: 'JSON' 、 :タイプの「ポスト」、 // パラメータ渡しモード URL:「/ホーム/ DepthQuery」、 // どこで過去にパラメータを渡すバックグラウンドプログラムを呼び出して、広がりを行く、の形で通過した経路 データ:{「ID」:ID 、 'URL' :URL}、 成功:機能(データ){ IF(データ== nullの)リターン; VAR _data = data.Msg; // VAR HTML = "<表>"; VAR HTML = "" ; IF(_data.length> 0 ){ のために(VAR私は= 0; I <_data.length; I ++ ){ //は同上IDを取り出すことになるが、検索ページと一致し、直接にIDスプライシング VAR状態は$( "#のHIDを" = ).val (); IF!(ステート= "false"に){ // HTML + = "<TD>" + _data [0] .facebook + "</ TD>" + "<TD>" + _data [0] .twitter + "</ TD>"。 // 获取到facebookで、和さえずり VARログインfacebook = _data [0 ] .facebook。 VARさえずり= _data [0 ] .twitter。 VaRのメール= _data [0 ] .Email。 VaRの電話= _data [0 ] .TEL $( "#" + _data [0] .Num + "").children(」facebook1" 。)の.text(Facebookの); $( "#" + _data [0] .Num + "").children(」mailbox1" 。)の.text(メール); もし(メール){ // typeof演算(メール)!=未定義 ( "#メール")$。アペンド(メール+ "" ) } $( "#" + _data [0] .Num + "").children(」Recom_num1" 。)の.text(ツイッター); $( "#" + _data [0] .Num + "").children(」phone_num1" 。)の.text(電話); } } } REQ - ; // 識別し保存 }、 エラー:関数(){ REQ - ; } }); ajaxArr.push(currentAjax)。 } } // クローズ要求 関数abortAjax(){ $ .each(ajaxArr、関数(I、A){ a.abort(); }); }
閉じられたバッチリクエストのこの実現。これは、フルクロールプロセスは、しかし、これはまだ問題が完了する。
一つの問題:遅い応答時間
この機能を実現しますが、測定されているが、我々は、特に低速データの復帰は、前回のデータの一部は、1506年分を返すことができることを見つけて下さい!これは、最も困難なプロジェクト、速度が上がるためにどのようにですか?はい、はい、あなたがスレッドを使用することができ、および改訂の大きな理由がある理由です。
私はこの実装上の理由についてお話しましょうことは遅いです、そしてそれは私が最も記録したいです。
私たちは遅く、全体的な結果として、インターフェースはリターンに低速であることを疑うようになったが、我々はそれが疑問ので、ストレステスト、速度が遅いではないインタフェースリターンを渡しますか?アヤックスは右、ちょうどそれは問題ではない要求を送信した後に終了しましたか?Ajaxは非同期要求である、そして、問題の嘘、ページデータ速度に結果を互いに独立している返しますか?
我々は、JSのスクリプト言語を知っている必要があります、それはシングルスレッドで、どのように非同期シングルスレッドすることができますか?論理的に言えば、非同期達成するために、マルチスレッド、なぜjsがシングルスレッドであるが、それは非同期に基づいて達成することができますか?
情報へのアクセスを通じ、私が学んだ:Ajaxの非同期の方法は、タイマーキューの実装を追加することです。つまり、Ajaxは(タイマ非同期により実現)を達成シングルスレッドまたは非同期、各送信非同期要求は、要求がキューに追加され、非同期データ戻り複数のリターンに依存して、ありますデータは最初のキュー内に配置されるデータを取得し、そのデータをデータが遅いバインディング、完全なデータを把握していない、遅い現れる理由は追従動作を行うのを待っている間、スレッドがアイドル状態にあります。次のリビジョンは非常に単純で、そしてその上にマルチスレッド処理を行うための要求の背後にあるコードに投げ込ま。次の再記録タスク(テスク)関連の要約。
参考ブログます。https://www.cnblogs.com/hutuzhu/p/4301751.html