Вы получаете 301, потому что сайт перенаправляет на сайт https.
Я не знаю, является ли использование сокетов обязательным, но если нет, вы можете использовать запросы, это простая в использовании библиотека для выполнения http-запросов:
import requests
req = requests.get("http://www.ncbi.nlm.nih.gov")
html = req.text
При этом 301 выполняется в любом случае, но он прозрачен.
Если вы хотите сделать это с сокетами, вы должны добавить «ssl layer» вручную:
import socket
import ssl
searcher = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
searcher.connect(("www.ncbi.nlm.nih.gov", 443))
searcher = ssl.wrap_socket(searcher, keyfile=None, certfile=None, server_side=False, cert_reqs=ssl.CERT_NONE, ssl_version=ssl.PROTOCOL_SSLv23)
cmd = "GET https://www.ncbi.nlm.nih.gov/ HTTP/1.0\r\n\r\n".encode()
searcher.send(cmd)
while True:
data = searcher.recv(512)
if len(data) < 1: break
print(data.decode())
searcher.close()