web-dev-qa-db-ja.com

Python Requests getting( 'Connection aborted。'、BadStatusLine( "''"、))error

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("''",))

上記に関連すると思われるコードブロックのみを掲載しました。スクリプト全体は次のとおりです。それはパンタッツからですが、もはや維持されているとは思わず、python3で実行しようとしています。私の研究から、エラーはhttpsではなくhttpを使用していることを意味するかもしれませんが、両方を試しました。

元のスクリプト

25
eurabilis

表示されるエラーは、ホストが期待どおりに応答していないことを示しています。この場合、それがあなたがそれをスクレイプしようとして意図的にあなたを切断していることを検出するからです

テストWebサイトからこのURLでrequestsコードを試してみると:http://mirror.internode.on.net/pub/test/5meg.test1、正常にダウンロードされることがわかります。

これを回避するために、偽の ユーザーエージェントユーザーエージェントはWebブラウザーを識別し、Webホストは一般的にそれをチェックしますボットを検出します。

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 Webホストがチェックできるボットと人間が操作するブラウザの間ですが、ユーザーエージェントは最も簡単で一般的なものの1つです。

スクレーパーの検出を困難にする場合は、 headless Chrome のようなヘッドレスブラウザーを使用します。2 (または ghost.py Pythonに固執したい場合)、信頼できる場合は、実際のブラウザのように動作します(なぜなら、!).


脚注:

1考えられるその他のチェックには、画像がダウンロードされていないか、ページリソースが通常の順序でダウンロードされていないか、ページが人間が読むよりも速くダウンロードされているか、Cookieが適切に設定されていないかなどのチェックが含まれます。グーグルは、人間のように不十分と思われるマウスの動きにフラグを立てます。

2Headless Chromeは2018年で最も有能なヘッドレスブラウザーですが、その重量が問題になっている場合は、少し前の先行バージョンである PhantomJS および ghost .py 、より軽量であり、まだ使用可能です。

39
sorbet

私の場合、ヘッダーからユーザーエージェントフィールドを削除する必要があります

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

'User-Agent'を設定すると、('Connection aborted.', BadStatusLine("''",))が取得され、このエラーは個々のサイトでのみ発生します。私の最初の投稿、私はこのサイトから多くの助けを得ます、それがここで見つける他の人を助けることができることを望みます

0
M.ison