web-dev-qa-db-fra.com

Les requêtes Python obtiennent l'erreur (erreur '' Connexion annulée. ', BadStatusLine ("' '" ",))

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

Dans ce bloc de code, je reçois une erreur lorsque j'exécute le script complet. Quand je vais télécharger le torrent, je reçois:

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

Je n'ai posté que le bloc de code que je pense pertinent ci-dessus. Le script entier est ci-dessous. Cela vient de pantuts, mais je ne pense pas qu'il soit maintenu plus longtemps, et j'essaie de le faire fonctionner avec python3. D'après mes recherches, l'erreur pourrait signifier que j'utilise http au lieu de https, mais j'ai essayé les deux.

Script original

22
eurabilis

L'erreur que vous obtenez indique que l'hôte ne répond pas de la manière attendue. Dans ce cas, c’est parce que il détecte que vous essayez de le rayer et de vous déconnecter délibérément.

Si vous essayez votre code requests avec cette URL depuis un site Web de test: http://mirror.internode.on.net/pub/test/5meg.test1, vous verrez qu'il se télécharge normalement.

Pour contourner ce problème, simulez votre user agent . Votre agent utilisateur identifie votre navigateur Web. Les hôtes Web le vérifient généralement pour détecter les robots.

Utilisez le champ headers pour définir votre agent d'utilisateur. Voici un exemple qui indique à l'hôte Web que vous êtes 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)

Il y a beaucoup d'autres divergences1 entre les robots et les navigateurs gérés par l’homme que les hôtes Web peuvent vérifier, mais User Agent est l’un des plus simples et des plus courants.

Si vous souhaitez que votre grattoir soit plus difficile à détecter, vous devez utiliser un navigateur sans navigateur tel que sans lecteur Chrome2 (ou ghost.py si vous voulez vous en tenir à Python), en qui vous pouvez avoir confiance, se comportera comme un vrai navigateur (parce que c’est le cas!).


Notes de bas de page:

1D'autres vérifications possibles incluent des vérifications pour savoir si les images ne sont pas téléchargées, les ressources de page non téléchargées dans l'ordre normal, les pages téléchargées plus rapidement que l'utilisateur ne peut les lire, et les cookies ne sont pas configurés correctement. Google signale des mouvements de souris jugés insuffisamment humains.

2Headless Chrome est le navigateur sans navigateur le plus compétent de 2018, mais si son poids vous pose problème, ses prédécesseurs un peu dépassés, PhantomJS et ghost.py , sont plus légers et restent utilisables.

36
sorbet

Dans mon cas, je dois supprimer les champs de l'agent utilisateur des en-têtes.

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

une fois que j'ai défini 'User-Agent', il obtient ('Connection aborted.', BadStatusLine("''",)).__ et cette erreur ne se produit qu'avec le site individuel . mon premier message, je reçois de nombreuses aides de ce site, j'espère qu'il peut aider les autres qui trouvent ici

0
M.ison