我想创建一个方法,该方法返回作为参数传递的网址的HTML。我知道如何使用" urllib2"等工具来做到这一点。或者"请求"。但是,我被限制使用套接字。到目前为止,我已经尝试了这个并且它无法正常工作。
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((url, 80))
s.sendall("GET / HTTP/1.0\r\n\r\n")
return s.recv(4096)
错误与请求有关,我认为格式不正确。
我已尝试过其他用户的类似解决方案,但其中没有一个有效。任何帮助将不胜感激,谢谢。
答案 0 :(得分:1)
尽管Host
标头仅对HTTP / 1.1是必需的,但即使您正在执行HTTP / 1.0请求,许多站点实际上也需要它,特别是如果它们在同一IP地址上托管不同的域。所以你需要的是至少以下内容:
s.sendall("GET / HTTP/1.0\r\nHost: " + hostname + "\r\n\r\n")
请注意,某些网站还需要特定的User-Agent
值或其他标头,因为它们正在尝试检测并阻止漫游器。并且,网站经常回复HTTP重定向,因此如果您想要获取HTML,您需要能够解析响应,请遵循重定向(并在新请求中包含给定的cookie),可能还要处理HTTPS而不是普通的HTTP等。