python:如何获取url?(具有不正确的响应标题)

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并获取原始内容,而无需尝试解析响应 谢谢在这种情况下,您需要做的是使用套接

我想用python构建一个需要获取url的小脚本。但服务器有点糟糕,只回复纯ASCII,没有任何标题

当我尝试时:

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/'))