Python 3.x 如何使用Python查找Google搜索页面的ip地址

Python 3.x 如何使用Python查找Google搜索页面的ip地址,python-3.x,subdomain,Python 3.x,Subdomain,Python编程新手,正在尝试解决编码项目。 我正在尝试编写一段代码,可以访问网站中的子页面。我可以使用该站点的ip to.connect访问该站点的主页,然后使用.sendall和.recv获取主页的基本信息。 现在,我不想继续拍摄搜索页面 在此特定示例中:如果您在地址栏中键入关键字(此时使用Chrome),您将获得一页搜索结果。我试图捕获该页面的原始数据并将其转储到文件中。我可以使用.gethostbyname访问Google的主页ip地址,但搜索页面的url是一个字符串。我不知道如何编写允

Python编程新手,正在尝试解决编码项目。 我正在尝试编写一段代码,可以访问网站中的子页面。我可以使用该站点的ip to.connect访问该站点的主页,然后使用.sendall和.recv获取主页的基本信息。 现在,我不想继续拍摄搜索页面


在此特定示例中:如果您在地址栏中键入关键字(此时使用Chrome),您将获得一页搜索结果。我试图捕获该页面的原始数据并将其转储到文件中。我可以使用.gethostbyname访问Google的主页ip地址,但搜索页面的url是一个字符串。我不知道如何编写允许访问该页面的代码,也不知道如何发送搜索词来触发来自Google的相同响应,从而允许我捕获该数据作为对.sendall的回答

我有没有办法访问这个页面,它显然是用Python创建并发送回我的web浏览器的?如果我不能使用简单的.connect和.recv代码,还有其他/更好的方法吗

我们赞赏所有建议。从不发布代码,因此请原谅任何礼仪错误:

import socket
import sys

try:
  mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error:
  print("Failed to create socket.")
  sys.exit()
try:
  host = (socket.gethostbyname("www.google.com"), 80)
except socket.gaierror:
  print("Failed to get host")
  sys.exit()
打印(主机) 打印(类型(主机))
当您最初创建一个连接套接字时,您的操作系统会保留一个您在计算机上创建的“文件”空间(特意用引号括起来,现在不进入其中)。然后,操作系统在系统上为您创建的文件空间指定一个端口,并返回一个描述其位置的文件描述符。此端口用于发送和接收数据

当您运行
connect
方法连接到某个Google URL时,
socket
库自动决定您应该使用特定的协议进行连接,并与服务器进行一些初始通信以创建流。在这个流程中,您将发送一个请求,分成相同大小的数据包,并以相同的方式从服务器接收响应

为了创建请求,这基本上只是一个字符串,最初发送到谷歌的服务器,告诉他们你想要什么,更重要的是,你想要它的方式,我们需要做一些额外的事情,称为SSL请求。如果您注意到,正确的谷歌URL是
https://google.com
而非
http://google.com
(尽管后者会重定向),因为您希望协商一个特定的私钥来加密您的通信,并向可能看到它的其他人隐藏它。完成
connect
魔术后,使用
send
方法发送此SSL请求,通常该请求由Python库自动创建。然后,您会收到响应,它是响应头(映射到另一个的值,为您提供有关所获得内容的初始信息),然后是您的主体,它是HTML代码

让我们再深入研究一下这个请求。当您向Google提交搜索时,搜索将保存在您请求的URL中。正如@user2357112所说,搜索
新款苹果iphone
将变成
https://www.google.com/search?q=new+苹果+iphone&……
。等号前的所有内容都是一个
GET参数
,等号后的所有内容都是它的值。出于您的目的,您只关心
q=
部分,它表示您在搜索栏中输入的搜索关键字。其他一切都应该保持不变,用符号(&)分隔


一旦向该URL发送请求并获得HTML响应,就必须对其进行解析以获得搜索结果。如果有必要的话,请单独提出一个问题,因为每个帖子应该只有一个问题需要回答

好的,那么,只是确认一下,您用Python编写了自己的套接字连接并连接到了Google?很好,你会通过这种方式学到一些东西,但为了让你知道,如果将来你不想完成这项工作,有一个内置的
urllib
库可以为你完成所有这些,只需一行就可以连接并获得响应。我不建议你第一次使用它,这样你就可以理解它是如何工作的。其次,更重要的是,有人否决你的原因是你没有在这里发布任何代码来证明你试图连接。很好的解释,但请发布您的代码。@ytpillai:
请求
不是内置的,但它比手工操作方便得多。即使使用
urllib
(在标准库中)也比手工操作方便得多。@user2357112是的,但OP的目标是学习,而不一定只是完成某件事,因此制作自己的套接字在一定程度上比方便的方法更有用。尽管感谢您抓住了关于
请求
“搜索页面的url是一串单词”的错误,但搜索页面的url不是一串单词。如果在地址栏中键入
newappleiphone
,Chrome实际上不会试图将
newappleiphone
视为URL。它将构建一个类似
https://www.google.com/search?q=new+apple+iphone&othercrap=that youcaninore
并使用它。感谢您的解释,非常有用。至于这与修改我所写的代码有什么关系,我的理解是错误的。我理解这一点,因为我将把message=b“GET/HTTP/1.1\r\n\r\n”代码替换为message=b“”。我尝试了这个,代码就在那里,等待一个不出现的响应。你能解释一下我遗漏了什么吗?谢谢,你很接近了。但请记住,仅仅因为在浏览器中发出请求时看到的唯一内容是URL,并不意味着这就是发送的整个请求。您的
GET/HTTP/1.1\r\n\r\n
是一个起点。
GET
后面的斜杠表示您试图访问的路径,以yo为单位
mysock.connect(host)
message = b"GET / HTTP/1.1\r\n\r\n"
try:
  mysock.sendall(message)
except socket.error:
  print("Failed to send")
  sys.exit()
data = mysock.recv(5000)
mysock.close()