Python HTTP всегда 301 с использованием сокетов - PullRequest
0 голосов
/ 28 августа 2018

Я пишу простую программу для получения информации с веб-сайта, использующего Python. но когда я запускаю приведенный ниже код, он всегда возвращает следующую информацию 301. В то же время мой браузер может легко зайти на сайт. Пожалуйста, скажите мне, почему это происходит и как улучшить мой код, чтобы избежать проблемы.

HTTP/1.1 301 Moved Permanently
Date: Tue, 28 Aug 2018 14:26:20 GMT
Server: Apache
Referrer-Policy: origin-when-cross-origin
Location: https://www.ncbi.nlm.nih.gov/
Content-Length: 237
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a         href="https://www.ncbi.nlm.nih.gov/">here</a>.</p>
</body></html>

import socket

searcher = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
searcher.connect(("www.ncbi.nlm.nih.gov", 80))
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()

1 Ответ

0 голосов
/ 28 августа 2018

Вы получаете 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()
...