【问题标题】:Python Requests getting ('Connection aborted.', BadStatusLine("''",)) errorPython 请求获取 ('Connection aborted.', BadStatusLine("''",)) 错误
【发布时间】:2016-01-15 11:05:08
【问题描述】:
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

【问题讨论】:

  • 您能提供一个发生这种情况的示例网址吗?
  • 您粘贴的代码缺少try。我收到了一个不同的错误:('Connection aborted.', RemoteDisconnected('Remote end closed connection without response',))希望更具描述性的错误对您有所帮助。
  • 嗯。运行时的脚本没有给我 url,只是种子名称,所以我不能发布示例 url。我刚刚搜索了学习python,选择了第一个torrent。我不确定您所说的错过尝试是什么意思。你能详细说明吗?感谢您的帮助。
  • 您粘贴的代码 sn-p 有一个except,但没有一个try。看起来您的 github 存储库中的代码确实如此。我在这里突出显示了我所指的行:github.com/pantuts/asskick/blob/master/asskick.py#L42
  • 很好,我错过了。当我拿出指向 stackoverflow 的链接以保持整洁时,我一定是把它拿出来了。我正在运行的实际代码有 try: 在其中,不幸的是我仍然得到相同的 badstatusline 错误

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


【解决方案1】:

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

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

要解决这个问题,请伪造您的user agent您的用户代理会识别您的网络浏览器,并且网络主机通常会检查它以检测机器人。

使用headers 字段设置您的用户代理。这是一个告诉网络主机您是 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 Chrome2(或者ghost.py,如果你想坚持使用 Python)这样的无头浏览器,它你可以相信它的行为就像一个真正的浏览器(因为它是!)。


脚注:

1可能的其他检查包括检查图像是否没有被下载,页面资源是否没有按正常顺序下载,页面下载速度是否超过人类阅读速度,和 cookie 设置不正确。 Google 会标记被认为不够像人类的鼠标动作。

2Headless Chrome 是 2018 年最称职的无头浏览器,但如果它的重量对你来说是个问题,它的稍微过时的前辈 PhantomJSghost.py 是重量更轻,仍然可用。

【讨论】:

  • ghost.py链接过期了,能否请您重新添加一下
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    试试这个:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-18
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2018-02-21
      • 1970-01-01
      • 2018-04-22
      • 2020-02-29
      相关资源
      最近更新 更多