Python Requests obtiene (‘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 

En ese bloque de código recibo un error cuando ejecuto el script completo. Cuando voy a descargar el torrent, obtengo:

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

Solo publiqué el bloque de código que creo que es relevante arriba. El guión completo está abajo. Es de pantuts, pero no creo que se mantenga por más tiempo, y estoy tratando de que funcione con python3. De mi investigación, el error puede significar que estoy usando http en lugar de https, pero he intentado ambos.

Guión original

El error que recibe indica que el host no responde de la manera esperada. En este caso, se debe a que detecta que está intentando rasparlo y desconectarlo deliberadamente .

Si prueba su código de requests con esta URL desde un sitio web de prueba: http://mirror.internode.on.net/pub/test/5meg.test1 , verá que se descarga normalmente.

Para evitar esto, falsifique su agente de usuario . Su agente de usuario identifica su navegador web, y los anfitriones web comúnmente lo revisan para detectar bots.

Utilice el campo de headers para establecer su agente de usuario. Aquí hay un ejemplo que le dice al webhost que eres 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) 

Existen muchas otras discrepancias 1 entre los bots y los navegadores operados por humanos que los hosts web pueden verificar, pero el agente de usuario es uno de los más fáciles y comunes.

Si quieres que tu raspador sea más difícil de detectar, querrás usar un navegador sin cabeza como Chrome 2 sin cabeza (o ghost.py si quieres quedarte con Python), en el que puedes confiar se comportará como un navegador real (porque ¡es!).


Notas al pie:

1 Otras posibles verificaciones incluyen la verificación de si las imágenes no se están descargando, los recursos de la página no se descargan en el orden normal, las páginas que se descargan más rápido de lo que un humano puede leerlas y las cookies no se configuran correctamente. Google señala los movimientos del ratón que se consideran insuficientemente humanos.

2 Headless Chrome es el navegador sin cabeza más competente en 2018, pero si su peso es un problema para usted, sus antecesores un poco anticuados, PhantomJS y ghost.py , son más livianos y aún se pueden usar.

En mi caso, debo eliminar los campos de agente de usuario de los encabezados

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

una vez que configuro 'User-Agent' , se obtiene ('Connection aborted.', BadStatusLine("''",)) y este error ocurre solo con el sitio individual. Mi primera publicación, recibo muchas ayudas de este sitio, espero que pueda ayudar a otros que encuentren aquí.