はい、ヘッダがあります。その終わりは最初の\ r \ n \ r \ nシーケンスの後です。そのシーケンスを見たら、残りをファイルに送ります。ここに粗修正があります:
import socket
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as mysock:
mysock.connect(('www.py4inf.com', 80))
mysock.send(b'GET http://www.py4inf.com/cover.jpg HTTP/1.0\n\n')
header = b''
while True:
data = mysock.recv(512)
if not data:
raise RuntimeError('no header?')
header += data
# end-of-header in buffer yet?
eoh = header.find(b'\r\n\r\n')
if eoh != -1:
break
# split the header off and keep data read after it.
header,data = header[:eoh+4],header[eoh+4:]
print(header.decode())
with open("stuff.jpg", "wb") as fhand:
fhand.write(data)
while True:
data = mysock.recv(512)
if not data:
break
fhand.write(data)
ここにヘッダーがあります。コンテンツの長さはヘッダーにあることに注意してください。キープアライブでHTTPリクエストを送信する場合は、ヘッダーの後にそのバイト数を正確に読み取る必要があります。 Connection: close
が指定されているので、それ以上のデータが受信されなくなるまで読んでください。
HTTP/1.1 200 OK
Date: Sun, 22 May 2016 23:22:20 GMT
Server: Apache
Last-Modified: Fri, 04 Dec 2015 19:05:04 GMT
ETag: "b294001f-111a9-526172f5b7cc9"
Accept-Ranges: bytes
Content-Length: 70057
Connection: close
Content-Type: image/jpeg
**ソケットを使用していますか? –
はい。私はurllib.request方法を知っています: 'from urllib.request import urlopen img = urlopen( 'http://www.py4inf.com/cover.jpg').read() fhand = open( 'cover.jpg' 、 'wb') fhand.write(img) fhand.close() ' –