Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-发送HTTP获取字符串-接收301永久移动-什么';下一个呢?_Python_Http_Redirect_Tcp_Network Programming - Fatal编程技术网

Python-发送HTTP获取字符串-接收301永久移动-什么';下一个呢?

Python-发送HTTP获取字符串-接收301永久移动-什么';下一个呢?,python,http,redirect,tcp,network-programming,Python,Http,Redirect,Tcp,Network Programming,我正在尝试使用Python 2将我自己的HTTP GET消息发送到web服务器,检索html文本,并将其写入html文件(不允许urllib,urllib2,httplib,请求,等等) 输出: HTTP/1.1 301 Moved Permanently Location: https://www.python.org// Connection: Keep-Alive Content-length: 0 当位置显然仍然相同时,为什么返回301?下一步我应该发送什么消息和到哪里来获取html内

我正在尝试使用Python 2将我自己的HTTP GET消息发送到web服务器,检索html文本,并将其写入html文件(不允许
urllib
urllib2
httplib
请求
,等等)

输出:

HTTP/1.1 301 Moved Permanently
Location: https://www.python.org//
Connection: Keep-Alive
Content-length: 0
当位置显然仍然相同时,为什么返回301?下一步我应该发送什么消息和到哪里来获取html内容


多谢各位

您的问题是,您正在查找的url没有通过
http://
提供服务,而是重定向到
https://
。为了显示您的代码基本上与正确的目标一起工作,我将您的get请求更改为

import socket
tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpSocket.connect(('www.cnn.com', 80))

http_get = """GET / HTTP/1.1\r
Host: www.cnn.com/\r
Connection: keep-alive\r
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r
Upgrade-Insecure-Requests: 1\r
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36\r
Accept-Encoding: gzip, deflate, sdch\r
Accept-Language: en-US,en;q=0.8\r\n\r\n"""

http_get_minimum = """GET / HTTP/1.1\r\nHost: www.cnn.com\r\nConnection: close\r\n\r\n"""

tcpSocket.send(http_get_minimum)
m = tcpSocket.recv(4096)
tcpSocket.close()
收到

HTTP/1.1200ok x-servedByHost:prd-10-60-168-42.nodes.56m.dmtio.net 缓存控制:最大年龄=60 X-XSS-Protection:1;模式=块 内容安全策略:默认src“self”http://.cnn.com: https://.cnn.com: .cnn.net:.turner.com:.ugdturner.com:.vgtf.net:;脚本src'unsafe inline''unsafe eval''self'*;样式src“不安全内联”self*;框架src“自”*;对象src'self'*;img src“自我”*数据:;媒体src“自我”*;字体src“self”*;连接src“self”*; 内容类型:text/html;字符集=utf-8 通孔:1.1清漆 内容长度:74864 接受范围:字节 日期:2015年10月5日星期一00:39:54 GMT 通孔:1.1清漆 年龄:170 连接:关闭 X服务方:cache-iad2144-IAD,cache-sjc3129-SJC X-Cache:点击,点击 X-Cache-Hits:295 X定时器:S1444005594.675567,VS0,VE0 改变:接受编码

更新:是的,为了能够通过
HTTPS
请求,您所展示的内容需要额外的功能。然而,http和https之间有一些主要区别,首先是默认端口,http为80,https为443。Https的工作原理是通过加密系统传输正常的http交互,因此理论上,除了客户端和终端服务器之外,任何一方都无法访问信息。有两种常见类型的加密层:传输层安全性(TLS)和安全套接字层(SSL),这两种层都对正在交换的数据记录进行编码


使用https连接时,服务器通过提供其支持的加密方法列表来响应初始连接。作为响应,客户端选择连接方法,客户端和服务器交换证书以验证其身份。完成此操作后,双方在确保使用相同密钥并关闭连接后交换加密信息。为了承载https连接,服务器必须具有公钥证书,该证书嵌入密钥信息并验证密钥所有者的身份。大多数证书都是由第三方验证的,这样客户端就可以确保密钥是安全的。

我也遇到了同样的问题,将端口从80更改为443解决了这个问题。

所以,要请求HTTPS网页,我必须做完全不同的事情吗?
import socket
tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpSocket.connect(('www.cnn.com', 80))

http_get = """GET / HTTP/1.1\r
Host: www.cnn.com/\r
Connection: keep-alive\r
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r
Upgrade-Insecure-Requests: 1\r
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36\r
Accept-Encoding: gzip, deflate, sdch\r
Accept-Language: en-US,en;q=0.8\r\n\r\n"""

http_get_minimum = """GET / HTTP/1.1\r\nHost: www.cnn.com\r\nConnection: close\r\n\r\n"""

tcpSocket.send(http_get_minimum)
m = tcpSocket.recv(4096)
tcpSocket.close()