blog

シンプルなNode.jsクローラーで、ウェブサイト一覧からタグの属性を取得する。

要件:キーワード検索によると、ウェブサイトリストジャンプリンクとタイトルをクロールし、インポートエクセル今回のアイデアは非常に正しいではありません通常のクローラの野生の道の個人的な理解の一種であるペー...

Jan 25, 2021 · 5 min. read
シェア

要件:キーワード検索に基づいてウェブサイトのジャンプリンクとタイトルのリストをクロールし、それらをエクセルにインポートします。

個人的には、通常のクローラーはページのコンテンツをクロールするものだと理解していますが、今回は直接インターフェイスを呼び出してデータを取得しました。 データを取得した後、インポートエクセルを整理するために、仕上げと最適化の余地がまだたくさんあると感じています。

コーディング

必要なモジュールのインポート
// まず、すべての必要なモジュールをインポートする const fs = require('fs'); //fsモジュールの導入は、読み取りと書き込み。 const xlsx = require('node-xlsx'); // エクセルを制御するモジュールを紹介する const superagent = require('superagent') // superagent-nodejsリクエストを処理するモジュール var request = require("request"); // リクエストモジュールの紹介 var Promise = require("bluebird"); require('superagent-proxy')(superagent);
グローバル変数の登録
// グローバル変数
// ビスケット。
var cookie; // ログインクッキーを保存しておくと、ipやアカウントを変更するたびに毎回クッキーを保存する必要があるので、クッキー付きのリクエストを取得する。
// すべてのキーワードを検索する 
var keyword = []
// すでにエクセルにあるデータを取得するのは、エクセルがあるかどうかを判断し、なければ新規作成し、あればデータを取得するように最適化できる。
var info = xlsx.parse("./resut.xlsx")
// キーワードを検索する このステップでは、最初のキーワードを検索する 全てのキーワードを検索し、得られたエクセルデータのエントリ数から最初のキーワードを検索するというものだ。
var searchString = keyword[info.length];
// すべてのアカウント 
var user = [17*******36, 17*******90, 17******72, 17******5, 17******40]
// 一度に1つのアカウントをランダム化する。
var username = user[Math.floor(Math.random() * user.length)];
// パスワードを固定した。 すべてのアカウントが同じパスワードを持っている。
var password = 'a123456';
// 取得したすべてのデータは、タイトルのリンクと手動スプライシングインターフェイスのためのリンクを必要とする唯一のdatainfoを返した
var addInfo = {
 name: searchString,
 data: [
 ['title', 'href', 'datainfo']
 ]
// ここでのんきなプロキシの注文番号を記入してください 有料ののんきなプロキシの欠点を使用するために、私は実際に戻って$ 11を置く 無料プロキシを見つけるために自分でそれを行うことができます アイデアは同じである。
var order = '';
// URLをテストする。
var targetURL = 'http://..com/.aspx';
// リクエストタイムアウト
var timeout = 8000;
// テスト
var testTime = 5;
// インターフェイスへの呼び出しの間に何ミリ秒?
var sleepTime = 5000;
//  
var apiURL = 'http://...com/dynamic/.html?order=' + order + '&sep=3';
プロキシのIPを取得
// プロキシのIPを取得する非同期メソッド function getProxyList() { return new Promise((resolve, reject) => { var options = { method: 'GET', url: apiURL, gzip: true, encoding: null, headers: {}, }; request(options, function (error, response, body) { try { if (error) throw error; var ret = (body + '').match(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d{1,5}/g); resolve(ret); } catch (e) { return reject(e); } }); });
プロキシのIPを取得し、速度が動作するかどうかをテストします。
function execute() { // プロキシipメソッドを呼び出し、プロキシの速度をテストする。 getProxyList().then(function (proxyList) { var targetOptions = { method: 'GET', url: targetURL, timeout: timeout, encoding: null, }; proxyList.forEach(function (proxyurl) { // グローバル変数プロキシipを変更する proxy = 'http://' + proxyurl console.log(proxy, 'ip') var startTimestamp = (new Date()).valueOf(); targetOptions.proxy = 'http://' + proxyurl; request(targetOptions, function (error, response, body) { try { if (error) throw error; body = body.toString(); var endTimestamp = (new Date()).valueOf(); var time = endTimestamp - startTimestamp getCookie(); } catch (e) { console.error(e); } }); }); }).catch(e => { console.log(e); }).finally(() => {}) }
( ̄▽ ̄)ノ
// ログインビスケットを取得する
function getCookie() {
 // ウェブサイトのログインメソッドを呼び出す
 superagent.post('https://.com')
 // プロキシのIPを設定する
 .proxy(proxy)
 .type('form')
 .send({
 // 送信するデータ
 reqType: 'phoneLogin',
 phone: username,
 password: password,
 })
 .end(function (err, res) {
 if (err) {
 handleErr(err.message);
 return;
 }
 cookie = res.header['set-cookie']; //レスポンスからクッキーを取得し、グローバル変数に代入する。
 getData();
 })
}
リスト取得 データの整理とエクセルへのインポート
async function getData() { // 我々は最初の10ページしか取得しないので、我々は10回をループするので、サイトのページは10ページしか見ることができないが、インターフェイスは、セキュリティのために、後方に調整し続けることができるので、我々は最初の10ページしか取得しないので、我々は最初の10ページしか取得しないので、我々は最初の10ページしか取得しないので、我々は最初の10ページしか取得しないので、我々は最初の10ページしか取得しないので、我々は最初の10ページしか取得しないので、我々は最初の10ページしか取得しないので、我々は最初の10ページしか取得しない。 for (let i = 1; i <= 10; i++) { // リストのインターフェイスを呼び出す const response = await superagent.post('https://www') // プロキシを設定する .proxy(proxy) .type('form') // ビスケットを設定する .set('Cookie', cookie) // データを送信する .send({ }) if (JSON.parse(response.text).list !== null) { // 必要なデータをjsonに変換する。 let addData = JSON.parse(response.text); // let list = addData.list; list.map((res) => { // スプライスされたデータの必要なタイトルdataid hrefを抽出する。 let getInfo = [res.title, 'https://www' + res._id + '.html', res._id] // 抽出されたデータは、全てのデータに格納される。 addInfo.data.push(getInfo) }) console.log(i) } else { // 10ページ分のデータがないとこうなる。 info.push(addInfo) console.log(username, 'username') console.log(searchString, 'searchString') var buffer = xlsx.build(info); fs.writeFile('./resut.xlsx', buffer, function (err) { if (err) throw err; }); return; } } info.push(addInfo) // エクセルファイルを修正する var buffer = xlsx.build(info); fs.writeFile('./resut.xlsx', buffer, function (err) { if (err) throw err; }); }
メソッドの呼び出し
// 最後の部分は呼び出しである。
execute();

プロジェクトの欠点 まとめ

  • 私は有料のプロキシを使用しています。
  • nodeのindex.jsを毎回手動で実行する必要がありますが、完全に自動化されているわけではありません。
  • 例えば、必要なデータがインターフェイスで返されるのではなく、jsで返されるのであれば、それはできませんし、domで返されるのであれば、trycheerioを使えばできます。

遭遇した困難

  • 動的にロードされたjs domに遭遇した場合、どのように対処するのかわからない場合は、牛刀を持った鶏のビットを感じるクロールするpuppeteerを使用したいと思います。

github

あなたは、ソースを示す必要がある。

結論

簡単なクローラ私はあなたの助けになることを願っていますお兄さんへようこそ暖かい議論や提案を一緒に解決するために私のjsのラウンドの方法で動的にロードされたドム処理夢!

Read next

ライブ・サービス・プラットフォームは、ライブ・システムのソースコードの機能表示に不可欠な役割を提供する。

ログイン登録:SMS認証コードログイン登録と一連のサードパーティログインメソッドを含み、SMS認証コードサードパーティサービスプラットフォームサービスプロジェクト、共有SDK接続に接続し、関連するサードパーティログインポートを有効にする必要があります。\nホームカタログログログログイン特典:初回ログイン登録特典、およびその継続的な毎日

Jan 25, 2021 · 2 min read