Webページ用の簡単なパーサーを作成する

こんにちは。 私の名前はセリョーザです。 最も簡単なWebスパイダーの作成方法についてお話したいと思います。

画像

これは私の熱意だけで作成された非営利プロジェクトであるため、作業中は次のように導かれました。



1.最低限必要な機能(Webスキャン、データベースへの必要な保存、アクセスのためのシンプルなUI)

2. 0財務コスト:

-ネットブックをサーバーとして使用します。これは、エイサーaspare ONE KAV60を勉強するために一度購入したもので、購入時(2008年)でもかなり予算でした。

-インターネット-有線ホーム。 IPの利点は半年間変わっていません。静的を注文する必要はありませんでした

3.最小時間コスト。 プロジェクトは仕事と寄付の後に行われました。



使用ソフトウェアとして:





RuNetには人気のあるエンターテインメントリソースがあります(ピカブと呼びましょう-広告とは見なされないように、リンクは付けません)。 ユーザーとコメントによって投稿された面白い投稿です。 リソースモデレーターは、コメントの内容を厳しく監視します(私の意見では、場合によっては多すぎることもあります)。 彼らの仕事の結果として、しばしばコメントの代わりに以下を見ることができます:



画像



ロボットは、データベースに追加される新しいコメントを検索するために特定の間隔でリソースをスキャンし、モデレーターが気に入らないことを常に確認できるようにします。



次のモジュールが必要です。



var jsdom = require("jsdom"); var mysql = require('mysql'); var CronJob = require('cron').CronJob;
      
      





ロボットの中心には、2つの機能があります。



 // * * *     function get_links(){ jsdom.env('http://pikabu.ru',function(err, window){ if (err) return false; var page = window.document.getElementsByClassName('to-comments') for (var i=0; i<page.length; i+=2) get_comments(page[i].getAttribute('href')); }) }
      
      





この関数を使用して、リソースのメインページをリクエストし、クラス「.to-comments」を持つ要素を探します。 コメントページへのリンクを保存します。 これらの要素はペアになっているため、必要なのは1秒ごとです。



jsdomモジュールは、この機能で非常に役立ちます。 htmlコードをDOMツリーに変換し、目的の要素を簡単に見つけることができます。



ご覧のとおり、この関数はget_comments()を呼び出します



 function get_comments(link){ jsdom.env(link,function(err, window){ if (err) return false; var comment = window.document.getElementsByClassName('comment') for (var i=0; i<comment.length; i++){ var id = comment[i].getAttribute('data-id'); var author = comment[i].getElementsByClassName('post_author')[0].textContent; //    var block = comment[i].getElementsByClassName('comment_text')[0].getElementsByTagName('span'); if (block.length > 0 && block[0].textContent.substr(0,11)==''){ console.log(block[0].baseURI+'#comment_'+id); continue} var com = comment[i].getElementsByClassName('comment_text')[0].outerHTML.replace(/"/g, '"').replace(/\n|\t/g, '').replace('previews_gif_comm', 'big_size_comm_an'); var query = 'INSERT IGNORE comments (id, user, comment) VALUES ('+id+', "'+author+'", "'+com+'")'; DBconnection.query(query, function(err, rows, fields) { if (err) throw err; }); } console.log(new Date()+' DATA ADDED...'); }); }
      
      





ここでは、ツリーを調べて、「コメント」クラスの要素を探し、それらから必要な要素を選択します:コメントID、作成者ID、削除されたコメントのフィルター、特殊文字の削除、コードを少しやり直し(サムネイルを削除)、すべてをデータベースに入れます。 コメントテーブルでは、idフィールドは一意であるため、mySQL自体によってコメントが重複しないことが保証されます。



5分ごとにロボットを起動するタイマーを開始することは残ります。 node.JSでは、これはcroneJobモジュールを使用して実装できます。これは、 Linuxのcroneスケジューラに類似しています。



  var job = new CronJob('*/5 * * * *', function(){ get_links(); }); job.start();
      
      





今のところすべてです。 私たちのクモはリソースを登ってコメントを保存することを学びました。 必要に応じて、このロボットへのWebインターフェイスまたはこのロボットのchromeプラグインに関する記事を書くことができます。



All Articles