web-dev-qa-db-ja.com

pythonソケットGET

スタックオーバーフローの他の投稿からこれはうまくいくはずです

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)                 

s.connect(("www.cnn.com" , 80))
s.sendall("GET / HTTP/1.1\r\n")
print s.recv(4096)
s.close

しかし、何らかの理由で(recvで)ハングし、印刷されません。 www.cnn.comへのリクエストがデータのチャンクになることは知っていますが、少なくともrecvから何かを読み取る必要がありますよね?

pSこれが最良の方法ではないこと、そしてhttpliburllib2などのライブラリが世の中にあることは知っていますが、これらをこのプロジェクトに使用することはできません(学校用です)。 socketライブラリを使用する必要があります

8
james smith

リクエスト行の後に空白行を送信するのを忘れました:

s.sendall("GET / HTTP/1.1\r\n\r\n")

さらに、HTTP 1.1は HTTP 1.1 RFCのHostセクション に記載されているHostヘッダーフィールドを追加する必要があることを指定しています。

s.sendall("GET / HTTP/1.1\r\nHost: www.cnn.com\r\n\r\n")
13
Takis

コードはほぼ正しいですが、HTTPプロトコルを満たすために2つの\r\nシーケンスを送信する必要があります。

有効なGETリクエストは次のようになります(2行に注意してください)。

 GET/HTTP/1.1 
 

したがって、コードは次のようになります。

s.sendall('GET / HTTP/1.1\r\n\r\n')

さらに、Host:など、有効なHTTP 1.1リクエストに必要な追加のヘッダーがあります。次のようなものをリクエストに追加する必要があります。

s.sendall('''GET / HTTP/1.1
Host: cnn.com

''')
5
mhawke

みんなの時間を無駄にしてすみません。私はこの解決策を見つけました ここ スタックオーバーフローで(検索するために私のGoogle検索でいくつかの言い換えをしました)

import socket
request = b"GET / HTTP/1.1\nHost: www.cnn.com\n\n"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("cnn.com", 80))
s.send(request)
result = s.recv(10000)
while (len(result) > 0):
    print(result)
    result = s.recv(10000)

そして、すべての答えは、エンディングについても同様でした\r\n\r\nただし、返されたもの301ステータス。この解決策はどういうわけかリダイレクトに従っているようです?とにかく、この解決策は私のために働いた

5
james smith

この行を置き換えてみてください:

_s.sendall("GET / HTTP/1.1\r\n")
_

と:

_s.sendall("GET / HTTP/1.1\r\n\r\n")
                             ^^^^
_

また、_s.close_は関数なので、s.close()に置き換える必要があると思います。

1
Kevin Guan

Python 3.の例をクリーンアップしています。バイト/文字列変換が必要です。また、withを使用して接続を自動的に閉じることもできます。

#!/usr/bin/env python3

import socket

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:

    s.connect(("example.com" , 80))
    s.sendall(b"GET / HTTP/1.1\r\nHost: example.com\r\nAccept: text/html\r\n\r\n")
    print(str(s.recv(4096), 'utf-8'))
1
Jan Bodnar

@james:気づかずにSlowLoris攻撃を行った。私はここよりよく説明することはできません https://www.youtube.com/watch?v=XiFkyR35v2Y 上記のすべての回答から解決策を見つけたと思いますが、これを持ってくるように答えましたあなたの知識に。 :)

0
sibi