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

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

新規登録して質問してみよう
ただいま回答率
85.48%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

949閲覧

Node.js×Playwrightスクレイピングで、一部の処理のみPython-shell経由でPythonで行いたい

YukiMoriNRT

総合スコア11

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/12/11 15:59

編集2022/12/11 16:08

Node.js×Playwrightでスクレイピングプログラムを作成したのですが、reCaptchaでスクレイピングが停止してしまい、ソルバーを探したらPythonのものしか見つかりませんでした。
(画像認識などAI関連はPythonが主流なためと思われます)

使用したいreCaptchaソルバーはこちらです。
https://pypi.org/project/solverecaptchas/
npmでも探しましたが人力ソルバーである2captchaのAPIしか見つからず、Node.jsは改めてAI関連に弱いと実感しました。

そのため、プログラムを全部Pythonで書き直すか、ソルバーのNode.js用ラッパーを自作するかを検討しましたが、どちらも膨大な時間がかかり現実的ではないため、既存のコードを生かしつつソルバー処理のみPythonで行うことにしました。

Node.jsからPythonのコードを呼び出すPython-shellでは、Node.jsからPython関数に引数を渡したり、Python関数の戻り値をNode.jsで取得したりすることが可能です。
ということは、Node.jsクラスであるPlaywright browserオブジェクトなりpageオブジェクトなりelementオブジェクトなりを、Python-shell経由でPython関数の引数としても渡せるのでしょうか?
プリミティブ型ではなくクラス型オブジェクトであっても、Node.jsにもPythonにも同じクラスが用意されているような場合はPython-shellがよしなにラップしてくれますか?

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

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

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

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

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

guest

回答1

0

ということは、Node.jsクラスであるPlaywright browserオブジェクトなりpageオブジェクトなりelementオブジェクトなりを、Python-shell経由でPython関数の引数としても渡せるのでしょうか?

ライブラリの公式README.mdを読め案件ですね。
勘所がわからないと結構見つけるのが大変ですので、今回は一緒に読んでいきましょう。

まずは上の日本語の記事でふんわり確認します。

Node.jsとPythonの間でデータを送受信する方法

それでは、データを相互に連携するための方法について見ていきましょう! 今回利用するのは「send()」メソッドと「on()」メソッドになります。
簡単に説明すると、send()でデータを送信してon()でデータを受信することになります。実際のプログラムで書くと次のようになります!

js

1var pyshell = new PythonShell('sample.py'); 2pyshell.send(【送信したいデータ】); 3pyshell.on('message', 【コールバック関数】);

なるほど、一度newしてインスタンスを作ったら、
sendでデータを流し込めて、
onでイベント登録して何か起こったらJSのコードに帰ってこれるようになっているわけだ。


では本家のドキュメントで確認してみましょう。
sendメソッドで検索すれば一撃です。

Exchanging data between Node and Python:

サンプルコードを見るに侍エンジニア塾ブログのコードとほぼ同じようです。
そしてその下にsendで送信出来るメッセージのルールが記載されています。

Use options.mode to quickly setup how data is sent and received between your Node and Python applications.

  • use text mode for exchanging lines of text ending with a newline character.
  • use json mode for exchanging JSON fragments
  • use binary mode for anything else (data is sent and received as-is)

new PythonShell('sample.py')には第2引数のoptionsが存在します。
options.modeを指定する事で、以下の3パターンのデータを流し込む事が可能です。

  • text: 改行コード付きのStringを送信する
  • json: JSONデータを送信する
  • binary: stdin(標準入力)でバイナリデータを流し込む

Python側のコードはGitHubのtestディレクトリ内にあるpythonファイルを開いて見てくれだそうです。
かなりシンプル、やる気のないコードが記述されてました。
まぁPythonが獲物のエンジニアなら開発できそうではあります。


というわけで回答

プリミティブ型ではなくクラス型オブジェクトであっても、Node.jsにもPythonにも同じクラスが用意されているような場合はPython-shellがよしなにラップしてくれますか?

無理です!
python-shellはバイナリデータやJSON文字列飛ばすのが関の山です。

まぁ、テキストを投げ込んだらPythonで代わりにライブラリを使ってデータを生成
結果のテキストをNode.jsに投げ返して.on("message", fn)で受け取るという一連の流れは使えるので、
Promiseなんかでラッピングすれば普通にasync/awaitで処理する関数には加工して使えるようになるでしょう。

投稿2022/12/12 06:24

miyabi-sun

総合スコア21158

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

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

YukiMoriNRT

2022/12/13 12:06 編集

ありがとうございます。 クラスそのものに互換性はなく、クラスオブジェクトのまま送ることは不可能ということですね。 なので、受け取った側で再構築するために必要な情報をプリミティブデータ(文字列orバイナリ)の形でやり取りすることを考えてみました。 1. Node.js・Pythonそれぞれの実装を徹底解剖し、Node.jsオブジェクト内部で保持している変数を全てJSON化してそっくりそのままPythonに引き継ぐラッパークラスを開発する 2. remote-debugging-portつきで起動し、リモートからも同じ画面にアクセスできるようにする 3. Pythonからの画面操作は諦め、画像データのみ飛ばしてAI判定の結果をboolで受け取る 1.を全て自力で開発するのはタイパ的に困難であること、 より省力的な2.であっても同一環境へのリモートアクセスが可能であることから、2.を最有力候補として検討した上で、 もしリモートではうまくいかない場合は3.も検討し、3.もハマった場合は最悪全部Pythonで書き直すことになるかも知れません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問