2015-10-16 11 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 

W tym bloku kodu pojawia się błąd po uruchomieniu pełnego skryptu. Kiedy idę pobierać torrent, otrzymuję:Python Żąda pobrania ("Połączenie przerwane.", BadStatusLine ("" ",)) error

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

Wysłałem tylko blok kodu, który uważam za istotny powyżej. Cały skrypt znajduje się poniżej. Jest z pantuts, ale nie sądzę, że jest dłużej utrzymywany i próbuję go uruchomić z python3. Z moich badań wynika, że ​​błąd może oznaczać, że używam http zamiast https, ale próbowałem obu.

Original script

+0

Czy możesz podać przykładowy URL, gdy tak się dzieje? – TobiMarg

+0

W wklejonym kodzie brakuje 'try'. Otrzymuję inny błąd: '('Połączenie przerwane.', RemoteDisconnected ('Zdalne zakończenie połączenia zakończone bez odpowiedzi',))' Mam nadzieję, że pomoże ci bardziej opisowy błąd. – sorbet

+0

hmm. Skrypt po uruchomieniu nie podaje mi adresu URL, więc nie mogę opublikować przykładowego adresu URL. Właśnie szukałem Pythona i wybrałem pierwszy torrent. Nie jestem pewien, co masz na myśli, mówiąc o braku próby. Czy możesz rozwinąć? Dzięki za pomoc. – eurabilis

Odpowiedz

28

Błąd masz wskazuje gospodarz nie reaguje w oczekiwany sposób. W takim przypadku dzieje się tak, ponieważ wykrywa, że ​​próbujesz go zeskrobać i celowo rozłączyć, podając.

Jeśli wypróbujesz swój kod requests pod tym adresem URL z witryny testowej: http://mirror.internode.on.net/pub/test/5meg.test1, zobaczysz, że plik jest pobierany normalnie.

Aby obejść ten problem, należy sfałszować numer user agent. Twój klient użytkownika identyfikuje twoją przeglądarkę internetową, a hosty internetowe często sprawdzają ją w celu wykrycia botów.

Użyj pola headers, aby ustawić klienta użytkownika. Oto przykład, który mówi hostowi, że jesteś 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) 

Jest wiele innych sposobów na sieci gospodarze do wykrywania botów, ale kliencka jest jednym z najprostszych i wspólnych kontroli. Jeśli chcesz, aby skrobak był trudniejszy do wykrycia, możesz spróbować ghost.py.