2016-03-23 10 views
0

私は、ユーザーが入力したWebサイトからHTMLコードを取得するコードを記述しようとしています。私はurllibや他のライブラリを使わずにこれを書く必要があります。Python HTTP GET。 "間違った要求"

from socket import * 


url = (input("Please enter url: ")) 
host=gethostbyname(url) 

clientSocket = socket(AF_INET, SOCK_STREAM) 
clientSocket.connect((host,80)) 

clientSocket.send(("GET " + host + "HTTP/1.1\n\n").encode("UTF-8")) 

file = clientSocket.recv(1024) 
print("The html code: ", file.decode("UTF-8")) 
clientSocket.close() 

コードはうまく動作します。しかし、そのような「www.stackoverflow.comは」私はホストからの「不正な要求」レスポンスを得るようにI入力のWebサイト:から実際のHTMLコードを取得するために、正しい要求されるもの

The html code: HTTP/1.1 400 Bad Request 

Date: Wed, 23 Mar 2016 16:14:27 GMT 

Content-Type: text/html 

Content-Length: 177 

Connection: close 

Server: -nginx 

CF-RAY: - 



<html> 

<head><title>400 Bad Request</title></head> 

<body bgcolor="white"> 

<center><h1>400 Bad Request</h1></center> 

<hr><center>cloudflare-nginx</center> 

</body> 

</html> 

をサーバー。ありがとうございます

答えて

1

ホスト名はURLではありません。 gethostbyname()を使用しているため、あなたのスクリプトはホスト名の入力を求めているようです。 GETリクエストでは、最初の引数のURIが表示されます。また、改行を含む改行を送信する必要があり、GET要求を終了するには2つが必要です。あなたがしたいすべてが、URLをダウンロードするあなたのためのすべてのHTTPプロトコルの詳細の面倒をurllib2のようなライブラリを使用している場合

clientSocket.send(("GET/HTTP/1.1\r\n\r\n").encode("UTF-8")) 

また:あなたのような何かをする必要があります。たとえば、次のようになります。

import urllib2 

r = urllib2.urlopen('http://google.com/') 
print r.read() 
0

あなたはHTTP/1.1とは言いませんが、最初の行にはそのように言います。

まず、GETに続くトークンは、サーバー上の絶対パスでなければなりません。したがって、/で始まります。

第2に、Host:ヘッダーを含める必要があります。

第3に、チャンク接続を処理しないため、単純なクライアントはConnection: closeと表示されるはずです。


次のスクリプトを使用して、より良い成功を持っているかもしれません:

from socket import * 

host = gethostbyname('stackoverflow.com') 
clientSocket = socket(AF_INET, SOCK_STREAM) 
clientSocket.connect((host,80)) 
clientSocket.send((
    "GET/HTTP/1.1\r\n" 
    "Host: stackoverflow.com\r\n" 
    "Connection: close\r\n\r\n").encode('utf-8')) 

file = clientSocket.recv(1024) 
print("The html code: ", file.decode("UTF-8")) 
clientSocket.close() 
+0

ありがとうございました!しかし、私の教授は、私の代わりにURLを入力するようユーザーに要求しています。これは私が問題を抱えているところです。異なるサイトには異なるパスがあり、それを一般化する方法はわかりません。 – JulianP

+0

それから、コンポーネントにそれを解析するために 'urlparse'を使用してください –

+0

私の無知を許そうとしていますが、私はその作業をどうするか分かりません。私はネットワーキングの紹介にすぎず、教授はあまり役に立ちません。私がこれまで行ってきたことはすべて私自身の研究で得たのですが、道路ブロックにいるような気がします。 – JulianP

関連する問題