Python请求获取('连接中止.',BadStatusLine("''",))错误

eur*_*lis 25 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
Run Code Online (Sandbox Code Playgroud)

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

('Connection aborted.', BadStatusLine("''",))
Run Code Online (Sandbox Code Playgroud)

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

原始剧本

sor*_*bet 39

您收到的错误表明主机没有以预期的方式响应.在这种情况下,这是因为它检测到你正在试图刮掉它并故意断开你的连接.

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

要解决这个问题,请假冒您的用户代理.您的用户代理识别您的Web浏览器,并且Web主机通常会检查它以检测机器人.

使用该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)
Run Code Online (Sandbox Code Playgroud)

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

如果你想让你的刮刀更难检测,你会想要使用像无头Chrome 2这样的无头浏览器(如果你想坚持使用Python,那就是ghost.py),你可以相信它会像真正的浏览器一样(因为它是!).


脚注:

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

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