Python-发送HTTP获取字符串-接收301永久移动-什么';下一个呢?
我正在尝试使用Python 2将我自己的HTTP GET消息发送到web服务器,检索html文本,并将其写入html文件(不允许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内
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()