Python请求获取('连接中止。',BadStatusLine(“''”,))错误

时间:2015-10-16 16:00:45

标签: python python-3.x python-requests

def download_torrent(url):
    fname = os.getcwd() + '/' + url.split('title=')[-1] + '.torrent'
    try:
        schema = ('http:')
        r = requests.get(schema + url, stream=True)
        with open(fname, 'wb') as f:
            for chunk in r.iter_content(chunk_size=1024):
                if chunk:
                    f.write(chunk)
                    f.flush()
    except requests.exceptions.RequestException as e:
        print('\n' + OutColors.LR + str(e))
        sys.exit(1)

    return fname

在那段代码中,当我运行完整脚本时,我收到一个错误。当我去实际下载洪流时,我得到:

('Connection aborted.', BadStatusLine("''",))

我只发布了我认为与上述相关的代码块。整个脚本如下。这是来自pantuts,但我认为它不再维持,我试图让它运行python3。根据我的研究,错误可能意味着我使用的是http而不是https,但我已经尝试了两种。

Original script

3 个答案:

答案 0 :(得分:38)

您收到的错误表明主机未按预期方式响应。在这种情况下,这是因为它检测到您正在尝试抓取它并故意断开连接

如果您在测试网站requests上尝试使用此网址的http://mirror.internode.on.net/pub/test/5meg.test1代码,您会看到它正常下载。

要解决此问题,请假冒user agent您的用户代理会识别您的网络浏览器,并且网络托管服务商通常会检查它以检测机器人。

使用headers字段设置您的用户代理。这是一个告诉webhost你是Firefox的例子。

headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.0; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0' }
r = requests.get(url, headers=headers)

网络主机可以检查机器人和人工操作的浏览器之间存在许多其他差异 1 ,但用户代理是最简单和最常见的之一。

如果您希望更难以检测到刮刀,您需要使用无头浏览器,例如headless Chrome 2 (或ghost.py如果您想坚持使用你可以信任的Python)就像一个真正的浏览器(因为它是!)。

<子>的脚注:

1 可能的其他检查包括检查是否未下载图像,页面资源未按正常顺序下载,页面下载速度超过人类可读取的速度,并且没有正确设置cookie。谷歌标记的鼠标移动被认为不够人性化。

2 无头Chrome是2018年最无能为力的无头浏览器,但如果它的重量对您来说是个问题,那么其稍微过时的前辈PhantomJS和{{3重量更轻,仍可使用。

答案 1 :(得分:1)

尝试一下:

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.0; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0',
    'ACCEPT' : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'ACCEPT-ENCODING' : 'gzip, deflate, br',
    'ACCEPT-LANGUAGE' : 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7',
    'REFERER' : 'https://www.google.com/'
}

    r = requests.get("http://yourdomain.com/", headers=headers)

答案 2 :(得分:0)

就我而言,我必须从标题中删除用户代理字段

url='https://...'
headers = {}
requests.get(url, headers=headers)

一旦我设置了'User-Agent',它就会得到('Connection aborted.', BadStatusLine("''",)) 并且此错误仅在单个站点上发生。 我的第一篇文章,我从这个网站上获得了很多帮助,希望它可以帮助在这里找到其他人