python:如何获取url?(具有不正确的响应标题)
我想用python构建一个需要获取url的小脚本。但服务器有点糟糕,只回复纯ASCII,没有任何标题 当我尝试时:python:如何获取url?(具有不正确的响应标题),url,python-3.x,Url,Python 3.x,我想用python构建一个需要获取url的小脚本。但服务器有点糟糕,只回复纯ASCII,没有任何标题 当我尝试时: import urllib.request response = urllib.request.urlopen(url) print(response.read()) 我获得一个http.client.BadStatusLine:100错误,因为这不是一个格式正确的http响应 是否有其他方法可以获取url并获取原始内容,而无需尝试解析响应 谢谢在这种情况下,您需要做的是使用套接
import urllib.request
response = urllib.request.urlopen(url)
print(response.read())
我获得一个http.client.BadStatusLine:100
错误,因为这不是一个格式正确的http响应
是否有其他方法可以获取url并获取原始内容,而无需尝试解析响应
谢谢在这种情况下,您需要做的是
使用套接字发送原始HTTP请求
在本例中,您需要使用python模块进行一些低级网络编程。(网络套接字实际上将服务器
发送的所有信息作为
返回给您,因此您可以根据自己的意愿相应地解释响应。例如,HTTP协议根据标准HTTP头(GET、POST、HEAD等)解释响应。高级模块urllib
将此头信息隐藏在您只需返回数据即可。)
您还需要了解一些有关HTTP头的基本信息。对于您的情况,您只需要了解GET
HTTP请求。请参见此处的定义-,请参见此处的示例-。(如果您希望捕获从浏览器发送的HTTP请求的实时跟踪,则需要一个数据包嗅探软件,如。)
一旦您了解了有关socket
模块和HTTP头
的基本知识,您就可以通过这个示例了解如何通过socket向服务器发送HTTP请求并读取其回复。你也可以参考这个
(您可以通过谷歌pythonsockethttp
获取更多示例。)
(提示:我不是Java爱好者,但如果你在python下找不到足够有说服力的例子,请尝试在Java下找到,然后相应地将其翻译成python。)如果没有更多信息,很难回答你的直接问题;不知道所讨论的(web)服务器是如何损坏的 这就是说,您可以尝试使用较低级别的东西,例如。这里有一种方法(python2.x风格,未经测试): 嗯
编辑:您可能需要调整请求中的内容,具体取决于所涉及的web服务器。Guanidene的优秀答案提供了一些资源来指导您走上这条道路 您是否尝试过
urllib2
或请求
?我使用的是python 3,默认情况下urllib2没有安装在那里。我想这是python2的,但如果我错了,请纠正我。据我所知,行为也将是相同的,因为urllib2也解析响应(如果我弄错了,请随意更正)。看起来python3.x
中的urllib
与python2.x
中的urllib2
相同。您是否尝试创建一个URLopener
对象,然后使用它的open
方法之一(使用help(urllib)
了解更多信息)-虽然我没有python3.x
或对您测试的数据的访问权限,但文档并没有提到这方面的头,而request
方法明确地说了。请求
模块受到广泛赞誉,尽管它在这方面很有用open_data,open_file,open_ftp,open_http,open_https
忽略大部分最后的评论-我把urlib
和urlib2
的内容混在一起了-只要检查一下你的文档就可以了-它通常相当清晰,还会解析响应并生成http.client.BadStatusLine:100这是公司的东西,sry(但我可以在firefox中粘贴url时看到输出)urlretrieve
应该只将服务器发送的内容放入一个文件中。将'abc.jpg'
更改为'abc.txt'
好吧,我该怎么说呢,它没有!:p…它检查响应并生成urllib.error.URLError:
…这还不起作用,但肯定在正确的轨道上…谢谢创建!欢迎分享如果你认为我们能帮上忙的话,它就不起作用了。我只需要稍微调整一下请求头。目标服务器是一个非常疯狂的野兽。:)
urllib.urlretrieve('http://google.com/abc.jpg', 'abc.jpg')
#!/usr/bin/env python
import socket
from urlparse import urlparse
def geturl(url, timeout=10, receive_buffer=4096):
parsed = urlparse(url)
try:
host, port = parsed.netloc.split(':')
except ValueError:
host, port = parsed.netloc, 80
sock = socket.create_connection((host, port), timeout)
sock.sendall('GET %s HTTP/1.0\n\n' % parsed.path)
response = [sock.recv(receive_buffer)]
while response[-1]:
response.append(sock.recv(receive_buffer))
return ''.join(response)
print geturl('http://www.example.com/') #<- the trailing / is needed if no
other path element is present
#!/usr/bin/env python
import socket
from urllib.parse import urlparse
ENCODING = 'ascii'
def geturl(url, timeout=10, receive_buffer=4096):
parsed = urlparse(url)
try:
host, port = parsed.netloc.split(':')
except ValueError:
host, port = parsed.netloc, 80
sock = socket.create_connection((host, port), timeout)
method = 'GET %s HTTP/1.0\n\n' % parsed.path
sock.sendall(bytes(method, ENCODING))
response = [sock.recv(receive_buffer)]
while response[-1]:
response.append(sock.recv(receive_buffer))
return ''.join(r.decode(ENCODING) for r in response)
print(geturl('http://www.example.com/'))