Как использовать HTTP на основе TCP для загрузки изображения в Python? - PullRequest
0 голосов
/ 18 декабря 2018

Как использовать TCP на основе HTTP для загрузки изображения в python?Я загружаю изображение, но оно говорит, что не может открыть этот файл (что, вероятно, означает, что не все байты были восстановлены или записаны).Моя задача - использовать библиотеку сокетов, а не urlib или запросы.Любая помощь приветствуется.

serverPort = 80
clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect(('google.com', serverPort))
print("ready to receive!")

output = 'GET  http://google.com/favicon.ico HTTP/1.0\r\nHOST: google.com\r\n\r\n'
print(output)
output1 = ('b' + output)
clientSocket.sendall(output1.encode())
reply = b''

while True:
    data = clientSocket.recv(1024)
    if not data:
        break
    reply += data

headers = reply.split(b'\r\n\r\n')[0]
image = reply[len(headers) + 4:]

f = open('image_test.ico', 'wb')
f.write(image)
f.close()

clientSocket.close()

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Вы не создаете байтовый объект, добавляя 'b' в начало строки.Вы смешиваете представление Python с фактическим содержимым.

b'bytes'

- это последовательность bytes, где каждый элемент гарантированно представляет собой один 8-битный байт, соответствующий коду ASCII символа.

'b' + 'bytes'

- это строка в Юникоде, где каждый элемент не обязательно должен быть одним байтом, а, скорее, символом Python.Это эквивалентно

'bbytes'

или (чтобы быть действительно явным)

u'bbytes'

Префикс b или u является сигналом для интерпретатора Python о том, как последовательность должнабыть сохраненным, а не частью значения.

Чтобы преобразовать строку в bytes объект, вызовите метод encode строки.

output1 = b'bytes'.encode('us-ascii')
0 голосов
/ 18 декабря 2018

Попробуйте это ...

import socket
import select

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('google.com', 80))
s.sendall(b'GET /favicon.ico HTTP/1.0\r\n\r\n')

reply = b''

while select.select([s], [], [], 3)[0]:
    data = s.recv(2048)
    if not data: break
    reply += data

headers =  reply.split(b'\r\n\r\n')[0]
image = reply[len(headers)+4:]

# save image
f = open('google.ico', 'wb')
f.write(image)
f.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...