【问题标题】:Repeatedly getting "302 Not found" Sockets反复获取“302 Not found”套接字
【发布时间】:2016-01-04 04:27:12
【问题描述】:

当我运行以下代码时

import socket
import urlparse
import re
import os

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.connect(("www.google.co.in", 80))
s.send("GET /?gfe_rd=cr&gws_rd=cr HTTP/1.0\r\n\r\n")
data = s.recv(100000)
print data
s.close()

我从谷歌得到的响应总是如下

HTTP/1.0 302 Found
Location: http://www.google.co.in/?gfe_rd=cr&gws_rd=cr
Cache-Control: private
Content-Type: text/html; charset=UTF-8
P3P: CP="This is not a P3P policy! See https://www.google.com/support/accounts/answer/151657?hl=en for more info."
Date: Mon, 04 Jan 2016 04:30:53 GMT
Server: gws
Content-Length: 245
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Set-Cookie: NID=75=chG9KySsUncl-1elqXhs56m7cNHxFvFwNR5pZoavIwRJ2PpoGlm5RbShdsiF7udrTgwZgG-eRo4oQqA0RhbfwtExcxUGk88F_R2TNV9vi4XKhWSB9ihhcqulYTtg9xGkagSDPdFfmw; expires=Tue, 05-Jul-2016 04:30:53 GMT; path=/; domain=.google.com; HttpOnly

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.co.in/?gfe_rd=cr&amp;gws_rd=cr">here</A>.
</BODY></HTML>

我明白这是因为我没有遵循重定向。有人可以解释我应该连接到哪个 url,这样我就不会收到这个错误,或者我该如何解决这个问题?

【问题讨论】:

    标签: python sockets networking ip


    【解决方案1】:

    您收到的是302 Found,而不是Not Found

    302 响应代码的含义是重定向,您的浏览器会静默/自动执行此操作,并加载新的重定向页面。

    正如您在响应正文中看到的那样

    The document has moved
    <A HREF="http://www.google.co.in/?gfe_rd=cr&amp;gws_rd=cr">here</A>.
    

    将您的请求指向此 URL,您不应再收到 302 响应,并且确保将 &amp;amp; 替换为 &amp;

    s.send("GET /?gfe_rd=cr&gws_rd=cr HTTP/1.0\r\n\r\n")
    

    查看this link 以自动取消转义这些 URL,因此您无需手动执行此操作。

    例如,在 Python 3.5 中:

    import html
    html.unescape('/?gfe_rd=cr&amp;gws_rd=cr')  # /?gfe_rd=cr&gws_rd=cr
    

    【讨论】:

    • 即使我这样做,我似乎也无法得到正确的回应
    • 现在有什么反应?我收到了带有您的固定代码的HTTP/1.0 200 OK
    • 我得到 200 ok 响应,但我似乎无法让它与其他网站一起使用,例如 www.cplusplus.com(在连接参数中),响应代码是 301(说永久移动)
    • 这是作业吗?您是否有任何理由不为此使用Requestsdocs.python-requests.org/en/latest 这将是一个简单的requests.get('http://www.google.co.in')
    • 看来您还需要为该网站发送Host 标头。 s.send("GET / HTTP/1.0\r\n") s.send("Host: www.cplusplus.com\r\n\r\n")(注意双 \r\n\r\n 仅在最后一个标题上)
    猜你喜欢
    • 1970-01-01
    • 2010-12-09
    • 2010-09-27
    • 2012-04-30
    • 2013-10-05
    • 2017-05-26
    • 2011-06-16
    • 2019-12-28
    • 1970-01-01
    相关资源
    最近更新 更多