だから私はグーグルパーサーを書こうとしています。私のツールのアイデアは、検索クエリを受け取り、グーグルでそれらを検索し、URLを返すことです。これまでは正常に機能していますが、ページ構成を設定しようとして問題が発生した場合、コードは次のようになります。
const needle = require("needle") //for making get request
const sp = require("serp-parser") //for parsing data from the request
const queryup = "watch movies online free" //my search data
const query = encodeURI(queryup) //my search data so google can read it
var page = 0; //initializing the page counter
let pages = 5; //setting amount of pages to loop through
for (var i = 0; i < pages; i++) { //my loop
needle.get(`https://www.google.com/search?q=${query}&start=${page}`, function(err, response){ //MY MAIN PROBLEM <<<--- The issue is its adding to the page value but its not effecting it here, why?
page += 10 //adding to page value (every 10 page value is 1 extra page)
console.log(`----- Page number: `+ page / 10+" -----") //logging the number of the page to confirm that it is indeed increasing the page value
let results = response.body; //defining the body of my request
parser = new sp.GoogleNojsSERP(results); //initializing the parser
let parsed = parser.serp //parsing the body
let objarray = parsed.organic; //parsed body (returns as an array of json objects)
for (var i = 0; i < objarray.length; i++) { //loop the logging of each url
let url = objarray[i].url //defining url
console.log(url) //logging each url
}
});
}
10億のコメントなし:
const needle = require("needle")
const sp = require("serp-parser")
const queryup = "watch movies online free"
const query = encodeURI(queryup)
var page = 0;
let pages = 5;
for (var i = 0; i < pages; i++) {
needle.get(`https://www.google.com/search?q=${query}&start=${page}`, function(err, response){
//^^^^^ MY MAIN PROBLEM <<<--- The issue is its adding to the page value but its not effecting it here, why?
page += 10
console.log(`----- Page number: `+ page / 10+" -----")
let results = response.body;
parser = new sp.GoogleNojsSERP(results);
let parsed = parser.serp
let objarray = parsed.organic;
for (var i = 0; i < objarray.length; i++) {
let url = objarray[i].url
console.log(url)
}
});
}
これは非同期の問題のようです。私は針に精通していませんが、外部クエリは基本的に同期されないことを知っています。
発生している問題は、基本的に、ループが最初に実行された後に実際のWebクエリが発生し、すでにpage
50にインクリメントされていることです。次に、非同期が複雑で管理が難しいため、それぞれがpage = 50の5つのクエリが作成されます。
内部的には、エンジンは基本的に、最初に実行できる可能性のある他のすべてを文字通り実行し、次にWebクエリを実行します。
通じ旅needle
NPMドキュメントを使用すると、その後、非同期関数で包み、使用して管理することができ、代わりに約束を返すために、針を取得するために、代替構文を使用することができると言われますawait
:あなたは後にしているものである、同期動作を強制します
const needle = require('needle');
const sp = require('serp-parser');
const queryup = 'watch movies online free';
const query = encodeURI(queryup);
let page = 0;
const pages = 5;
const googler = async function () {
for (let i = 0; i < pages; i++) {
try {
const response = await needle('get', `https://www.google.com/search?q=${query}&start=${page}`);// MY MAIN PROBLEM <<<--- The issue is its adding to the page value but its not effecting it here, why?
console.log('----- Page number: ' + page / 10 + ' -----');
const results = await response.body;
const parser = new sp.GoogleNojsSERP(results);
const parsed = parser.serp;
const objarray = parsed.organic;
for (let i = 0; i < objarray.length; i++) {
const url = objarray[i].url;
console.log(url);
}
} catch (err) {
console.error(err);
}
page += 10;
}
};
googler();
主な違い:
needle
ドキュメント、リクエストメソッドが上の方法であることではなくneedle
オブジェクトは、代わりにあなたが呼び出しに直接渡す最初の引数のneedle
関数としての地位を。await
promiseを管理すると、拒否されたpromiseはエラーをスローしますが、これは従来のtry / catchブロックでキャッチする必要があります。私はここでそれをしました。とはいえ、もしそれneedle
がnode-fetch
基本的にエラーをスローすることはおそらくないでしょうが、それは良い習慣です。私の拡張機能の1つは、var
宣言をに自動的に変更し、let
再割り当てされていないlet
宣言をconst
;に変更しました。それらを元に戻すことを歓迎します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加