私はUbuntu 16.04を実行していますが、URLを指定して指定した画像ファイルにGET要求を行うPythonスクリプトを作成しようとしています。一例として、以下のコードで:Pythonスクリプトを使用してnetcatを使ってサーバーにGETリクエストを送信する
host
はwww.google.com
port
ある80
u.path
ある/images/srpr/logo3w.png
proc = Popen(["netcat {} {}".format(host, port)], shell= True)
proc = Popen(["GET {} HTTP/1.1".format(u.path)], shell= True)
proc = Popen(["Host: {}".format(host)], shell= True)
proc = Popen(["Connection: close"], shell= True)
proc = Popen(["\n"], shell= True)
ある私の問題は、私は、端末に正常にこれらを実行することができるということです、スクリプトを実行しようとすると、GET
リクエストがwww.google.com
に送信されたようですu.path
の指定が必要です。私はそれが2つの理由でこれをしていることを知っています。サーバーの応答が私に来る直前に、以下を得るまず、:
/bin/sh: 1: Host:: not found /bin/sh: 1: Connection:: not found
第二に、私は、画像データのサーバーの応答が端末上で奇妙なUnicodeの記号として解釈醜い原料の束であることを知っています私は明らかにサーバーの応答にwww.google.com
HTMLテキストを取得しています。
netcat
STDINが開かれるまでHTTPリクエストを待つ必要があるかもしれないと思っていましたが、私はどのようにわかっていません。どういうわけか\n
を送信しているので、リクエストを完了しているだけかもしれませんか?私は本当に知らない。
EDIT:実際にはwww.google.com
にリクエストを送信していないようです。私はサーバーの応答を.html
ファイルとして保存しました。クラウドフロントのWebサイトのように見えます。
EDIT2:さらに調査した結果、netcatはインタラクティブで、デッドロックなどの問題があるようです。私はproc.communicate()
を使用しようとしましたが、複数の行を送信する必要があるため、communicate
は最初の入力がSTDIN
に書き込まれてから、EOF
またはそれらの行に何かが送信されます。これにより、私はproc.stdin.write
を使用しようとしましたが、これはまた、Popen
コマンドにSTDIN
、STDOUT
、およびSTDERR
のためにsubprocess.PIPE
を使用することに関するデッドロックを引き起こすことも明らかです。また、私が行ったbytes-like
オブジェクトとして符号化する必要がありますが、最後に\r\n\r\n
を送信して接続を終了しようとすると、何もしません。STDOUT
には、私が空であると理解しているb''
同様の問題を抱えている人のためbytes
はあなたがGETリクエストを行うには、 'netcat'を使用している理由はありますか?それを行うもっと簡単な方法がたくさんあります。 –
これはネットワーククラスの割り当ての一部であり、 'netcat'だけを使用する必要があります。バックグラウンドで何かを隠すことができるライブラリや何もありません。 –
google.com以外のサイトの反対側でGETを実行してください。 Googleでは、ロボットスクリプトがAPIを使用せずにデータを取得することを拒否することがあります。 – boardrider