2015-10-16 9 views
16
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 

In questo blocco di codice viene visualizzato un errore quando si esegue lo script completo. Quando vado a scaricare il torrent, ottengo:Richiesta Python ('Connection aborted.', BadStatusLine ("''",)) errore

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

Ho pubblicato solo il blocco di codice che ritengo rilevante sopra. L'intero script è sotto. È da pantuts, ma non penso che sia mantenuto più a lungo, e sto cercando di farlo funzionare con python3. Dalla mia ricerca, l'errore potrebbe significare che sto usando http invece di https, ma ho provato entrambi.

Original script

+0

Potresti fornire un URL di esempio dove questo accade? – TobiMarg

+0

Il codice che hai incollato manca un 'try'. Ricevo un errore diverso: '('Connessione interrotta.', RemoteDisconnected ('Connessione remota chiusa chiusa senza risposta',))' Spero che un errore più descrittivo ti aiuti. – sorbet

+0

hmm. Lo script durante l'esecuzione non mi dà l'url solo il nome del torrent, quindi non posso pubblicare un URL di esempio. Ho appena cercato di imparare Python e ho selezionato il primo torrent. Non sono sicuro di cosa intendi perdendo una prova. Puoi elaborare? Grazie per l'aiuto. – eurabilis

risposta

28

L'errore che si ottiene indica l'host non risponde nel modo previsto. In questo caso, è perché rileva che stai cercando di grattarlo e deliberatamente disconnettendoti.

Se provi il tuo codice requests con questo URL da un sito Web di prova: http://mirror.internode.on.net/pub/test/5meg.test1, vedrai che viene scaricato normalmente.

Per aggirare questo, falsificare il tuo user agent. Il tuo agente utente identifica il tuo browser web e generalmente gli webhost lo controllano per rilevare i bot.

Utilizzare il campo headers per impostare il proprio agente utente. Ecco un esempio che dice al webhost che sei 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) 

C'è un sacco di altri modi per il web ospita per rilevare i bot, ma user agent è uno dei più facili e più comuni controlli. Se vuoi che il tuo raschietto sia più difficile da rilevare, puoi provare con lo ghost.py.