【问题标题】:How to get html code using python sockets如何使用 python 套接字获取 html 代码
【发布时间】:2016-03-26 02:00:24
【问题描述】:

所以我试图仅使用 python 套接字而不是任何其他库(例如 urllib)来获取 google 的源代码。我不明白为什么我的 GET 请求不起作用,我尝试了所有可能的方法。这是我拥有的代码,它非常小,我不想获得太多细节。只是寻找用于获取源代码的协议。我认为这将是GET 方法,但它不起作用。我需要一个类似于 urllib.request 但仅使用 python 套接字的响应。

  • 如果我将“https://www.google.com”传递给socket.gethostbyname(),getaddrinfo 会失败。
  • 此外,当我尝试从 python.org 获取请求时,while 循环永远不会结束。


import socket;

s=socket.socket();

host=socket.gethostbyname("www.google.com");

port=80;

send_buf="GET / \r\n"\
        "Host: www.google.com\r\n";

s.connect((host, port));

s.sendall(bytes(send_buf, encoding="utf-8"));

data="";

part=None;

while( True ):

    part=s.recv(2048);

    data+=str(part, "utf-8");

    if( part==b'' ):

        break;

s.close();

【问题讨论】:

  • https://www.google.com 不是主机名(它是 URL),所以 gethostbyname 当然会失败。
  • 你不需要分号,除非你在 Python 中将多条语句放在一行 :)

标签: python sockets getaddrinfo


【解决方案1】:

以下内容对我有用:

import socket
s=socket.socket()
host=socket.gethostbyname('www.google.com')
port=80
s.connect((host,port))
s.sendall("GET /\r\n")
val = s.recv(10000)
# Split off the HTTP headers
val = val.split('\r\n\r\n',1)[1]

【讨论】:

  • 但这不会返回源代码,它返回的内容与我的代码返回的内容完全相同:)
  • 我试过这个,我认为我真正想要的是像 urllib.request() 一样工作并返回网站的完整源代码的东西。我从 google.com 收到 302 Moved 消息,这与我使用提供完整源代码的 urllib 时不同。
  • 我得到了 200 OK(以及谷歌主页的 html),这里显示了确切的代码,所以我不确定你为什么会得到 302 Moved
  • 这是我得到的 b'\n302 已移动\n

    302 已移动

    \n文档已移动\ngoogle.fr/…>。\r\n \r\n'
  • 看起来 Google 认为(正确或错误地)您在法国(请参阅 support.google.com/websearch/answer/873?hl=en)。更改浏览器中的设置可能会解决问题(我相信它只是基于 IP 地址,对于浏览器或 Python 来说都是一样的),或者您可以直接访问 google.fr 以获取该页面的源代码
猜你喜欢
  • 2015-12-13
  • 2012-12-17
  • 1970-01-01
  • 2016-10-06
  • 2014-01-19
  • 1970-01-01
  • 2018-01-29
  • 1970-01-01
  • 2015-11-25
相关资源
最近更新 更多