2014-12-23 8 views
14

Jak zwykle, często mam problemy, a ja dokładnie szukałem odpowiedzi na obecną, ale znalazłem się ze stratą. Oto niektóre z miejsc, w jakich znaleziono: - How to fix httplib.BadStatusLine exception? - Python httplib2 Handling Exceptions - python http status codehttplib.BadStatusLine: ''

Mój problem jest następujący. Stworzyłem pająka i chcę zaindeksować różne adresy URL. Kiedy indeksuję każdy adres URL niezależnie od siebie, wszystko działa poprawnie. Jednak gdy próbuję indeksować oba otrzymuję następujący błąd: httplib.BadStatusLine: ''

Podążyłem za radą, którą czytałem (patrz linki wspomniane powyżej) i można wydrukować odpowiedź.status dla każdego wniosku działa, ale response.url nie drukuje, a błąd jest zgłaszany. (Drukuję tylko te instrukcje, aby spróbować zidentyfikować źródło błędu).

Mam nadzieję, że to jest jasne.

Używam scrapy i selen

class PeoplePage(Spider): 
    name = "peopleProfile" 
    allowed_domains = ["blah.com"] 
    handle_httpstatus_list = [200, 404] 
    start_urls = [ 
     "url1", 
     "url2" 
    ] 

    def __init__(self): 
     self.driver = webdriver.Firefox() 

    def parse(self, response): 
     print response.status 
     print '???????????????????????????????????' 
     if response.status == 200: 
      self.driver.implicitly_wait(5) 
      self.driver.get(response.url) 
      print response.url 
      print '!!!!!!!!!!!!!!!!!!!!' 

      # DO STUFF 

     self.driver.close() 

Odpowiedz

18

podstawie Python Doc, httplib.BadStatusLine podniesiony czy serwer odpowiada z kodem stanu HTTP, że nie rozumie. Możesz spróbować przekazać ten wyjątek. Nie powinieneś zamykać sterownika, jeśli chcesz połączyć się z więcej niż jednym adresem URL.

Spróbuj tego:

def parse(self, response): 
    try: 
     print response.status 
     print '???????????????????????????????????' 
     if response.status == 200: 
      self.driver.implicitly_wait(5) 
      self.driver.get(response.url) 
      print response.url 
      print '!!!!!!!!!!!!!!!!!!!!' 

      # DO STUFF 
    except httplib.BadStatusLine: 
     pass 
+0

Dziękuję Nima. Myślę, że głównym problemem było to, że zamykałem sesję ... Jeszcze raz dziękuję! :-) –

1

zrobiłem dekorator robić to, co robi top odpowiedź, tak aby łatwo kod wielokrotnego użytku. Oto ona:

import http 

def pass_bad_status_line_exc(wrapped_function): 
    """ 
    Silently pass this exception `http.client.BadStatusLine` decorator 
    """ 
    def _wrapper(*args, **kwargs): 
     try: 
      result = wrapped_function(*args, **kwargs) 
     except http.client.BadStatusLine: 
      return 
     return result 
    return _wrapper