質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

250閲覧

スクレイピングした値の使い方

MASAKIX

総合スコア12

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2018/08/21 13:08

編集2018/08/31 12:12

nightmareJSをつかってスクレイピングした値を、そのあとの処理に使いたいのですが、その値を受け取る方法がよくわかりません。具体的にはスクレイピングした値をwebの入力する場所にtypeしたいのですが、

js

1var Nightmare = require('nightmare'); 2var nightmare = Nightmare(); 3 4Promise.resolve( 5 6nightmare. 7goto('https://www.yodobashi.com/product/100000001002780005/'). 8wait('.productPrice.fs16.alignM'). 9evaluate(() => {return document.querySelector('.productPrice.fs16.alignM').innerText;})). 10 11then((result) => {console.log(result);}). 12catch(console.error); 13 14nightmare.end();

thenメソッドの後にtypeでつなげるのはできないので(then((result) => {tyep('●',result);}).とはできない)
そのあとに一行typeを書くのですが、thenでないと受け取れないし、、、
どうすればよいでしょうか??

↓回答に誤りがあります

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

コメントを受けて内容を修正してみました。
これでどうですか?

js

1var Nightmare = require('nightmare'); 2var nightmare = Nightmare(); 3 4nightmare 5 .goto('https://www.yodobashi.com/product/100000001002780005/') 6 .wait('.productPrice.fs16.alignM') 7 .evaluate(() => { 8 const value = document.querySelector('.productPrice.fs16.alignM').innerText; 9 const element = document.querySelector(/* 値を設定したい対象のセレクタ */); 10 element.value = value; 11 12 return value; /* then の resultに渡したいもの。なんでもいい */ 13 }) 14 .end() 15 .then((result) => { 16 // 取得結果を受けてやりたいことを書く 17 // スクレイピング対象ページ内の操作はここではできない 18 console.log(result); 19 }) 20 .catch(console.error);

投稿2018/08/22 04:11

編集2018/08/25 06:47
spookybird

総合スコア1803

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MASAKIX

2018/08/23 16:59

回答ありがとうございます。書いてくださった方法で、element.valueがresultに設定されたので、type(’●’,result)と一行追加すれば良いという認識で間違ってないですか?取り急ぎ、お伺いさせてください.
spookybird

2018/08/23 21:46

element.valueがresultに設定されたとはどういうことですか?type('●', result)をどこに追加するつもりですか?ご自分でやってみてresultが受け取れなかったのでは?resultを利用するために.then()のコールバックの中に処理を書いたのですが。
MASAKIX
MASAKIX

2018/08/24 05:27

恐らく、認識の行き違いがありそうです。.type(selector[, text])で指定したセレクタに文字入力するもので、スクレイピングした値をセレクタに入力したいということです。then()で受け取ること自体は出来ていますが、その受け取った値を入力するために受け渡すことが出来ていないということです。 具体的には.then((result)=>{console.log(result );})で正しく動作する(受け取れている)が、受け取れている値を入力するためにtypeに繋げたいがそれが出来ないということです。
spookybird

2018/08/24 06:55

typeはNightmareのインスタンスが持つメソッドなのでthenの中では使えません。なので、私が提示したように値を設定したい要素を取得して、その要素のvalueに入れればいいのでは?なぜ頑なに".type()"を使いたがるのかが理解できないです。
MASAKIX

2018/08/24 12:19

すみません。自分の知識が足りてなくて申し訳ないです。つまり、提示して頂いたもので、入力できるのですね。ちなみに、提示して頂いたようなことは何を学べば得られる知識なのでしょうか?教えて頂けると幸いです。
MASAKIX

2018/08/24 15:29

試したところ以下のようなエラーが出てしまいました ReferenceError: document is not defined at Promise.resolve.then (C:\but\scr2.js:10:23) at process._tickCallback (internal/process/next_tick.js:103:7)
spookybird

2018/08/25 00:35

そもそもの話なんですが、あるサイトをスクレイピングした結果をどこに出力したいんでしょうか?スクレイピングしたサイトにそのまま書き出そうとかしてます?よくよく考えたらやりたいことそのものが意味がわからないですね...
MASAKIX

2018/08/25 06:08

やりたいこととしては、商品の値段を取得して、(たとえば、¥115)それの¥を除いた数字部分の0.9倍をポイント使用欄に書き込みたいというのがやりたいことです。要は注文時のポイント使用欄の自動書き込みです。スクレイピングはスクレイピングで操作して、そのあとにそれを用いて別に注文操作ということなのでしょうか。
MASAKIX

2018/08/25 12:48

自動注文のコードに教えていただいた取得後、入力を組み込みたいのですが、その場合、取得してからページを幾つか移動した末に入力欄が出てきます。本当に頭が混乱してきたので、一度自動注文のコードをここに書いてみます。どこら辺に組み込めばよいのか教えていただけませんでしょうか?すみません。。
MASAKIX

2018/08/25 12:52

var Nightmare = require('nightmare'); var nightmare = Nightmare(); nightmare .goto('https://www.yodobashi.com/product/100000001002780005/') .wait('.productPrice.fs16.alignM') .evaluate(() => { const value = document.querySelector('.productPrice.fs16.alignM').innerText; const element = document.querySelector(//ポイント入力セレクタ); element.value = value; return value; /* then の resultに渡したいもの。なんでもいい */ }) .end() .then((result) => { // 自動注文のコード console.log(result); }) .catch(console.error); であってますか?
spookybird

2018/08/25 13:01

であってますか、と言われてもそんなに見づらいものを見せられて確認する気にならないです。
MASAKIX

2018/08/25 14:25

すみません。 自分の考えですと、取得後、thenの中(//取得結果を受けてやりたいことを書くの箇所)で、自動注文をするのですが、その過程で入力するタイミングがくるわけです。しかし、入力は取得の際の.evaluateの中のDOM操作なので、そこにスクレイピングページとは関係のないポイントの入力セレクタを冒頭の.evaluateの中に記述してもうまく入力出来ないと思い、どうすればよいのかがよくわからないと言った状況です。
spookybird

2018/08/26 05:17

質問の本筋とズレてしまっている上にどんどん話が広がってしまっているのでこれ以上この質問には回答しません。Nightmareの使い方を理解できていないようですので、イチから勉強しなおすことをお勧めします。
MASAKIX

2018/08/28 12:31

了解いたしました。本筋とずれてしまいすみません。ところで、本筋に戻りますと、提示していただいたもので試してみたのですが、以下のようなエラーを吐き出しました。 { TypeError: Cannot set property 'value' of null at fn (<anonymous>:8:19) at javascript (<anonymous>:25:21) at <anonymous>:40:3 at EventEmitter.electron.ipcRenderer.on (C:\but\node_modules\electron\dist\resources\electron.asar\renderer\init.js:63:28) at emitMany (events.js:146:13) at EventEmitter.emit (events.js:223:7) code: -1 }
spookybird

2018/08/28 13:15

nullのプロパティ'value'を設定できないって言ってるんだからelementがnullなんでしょう。つまりquerySelectorで指定しているセレクタが間違っています。丸写しじゃなくひとつずつ動作を確認されてみてはいかがですか。
MASAKIX

2018/08/29 12:16

ところが、自分が提示したコードにて正常に取得できたセレクタを今回提示していただいたコード内でも使っているので、セレクタ自体が間違っているということはなさそうなのです。。。
spookybird

2018/08/29 12:46

nullになってるかどうかはその場でログを出して確かめればすぐにわかることです。JavaScriptを基礎から勉強しなおし、その後Nightmareの勉強を始められてはいかがでしょうか。あなたの解析力やコーディング力では使いこなすのはかなり難しいと思います。
MASAKIX

2018/08/29 19:17

すみません。勘違いをしてました。勉強中でして、申し訳ございません。取得➡DOM操作の流れがevaluateの中で書かれておりますが、取得ページと『取得結果を入力したいセレクタ』が別のページなためnullになってしまうのだと思います。取得と取得結果を入力したいセレクタが別のページの場合は教えていただいたコードは使えないという認識であっていますか?
MASAKIX

2018/08/29 19:34

加えて、本筋に戻りますと、取得したページ内の適当なセレクタを設定してやってみたところ、やはり入力はできていませんでした。
MASAKIX

2018/08/29 19:34

その際にエラーが出ることはありません。
MASAKIX

2018/08/29 20:02

本筋である、取得+入力というところだけは、クリアをしたいです。(取得と入力するセレクタは同一ページにあるという条件でよい)ちなみにelementに設定したセレクタはhttps://www.yodobashi.com/product/100000001002780005/における検索ボックスのようなセレクターです。(input#getJsonDataと#getJsonDataで両方試しました)
MASAKIX

2018/08/30 14:59

ようやくできました。具体的には下記でできました。ご迷惑をおかけいたしました。そしてありがとうございました!一から勉強致します。。valueで被っているのが原因かなと思っていたらそうでした! const v = document.querySelector('.productPrice.fs16.alignM').innerText; const element = document.querySelector(/* 値を設定したい対象のセレクタ */); element.value = v;
MASAKIX

2018/08/30 15:14

ちなみに本来やりたかったことも不格好ながら、できました! .evaluate(() => { const vlue = document.querySelector('#js_scl_unitPrice.productPrice').innerText; var vlu = vlue.slice( 1 ) var vl =vlu*9/10 var v =Math.floor(vl) const element = document.querySelector('#getJsonData'); element.value = v; return v; /* then の resultに渡したいもの。なんでもいい */ })
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問