Comme toujours, j'ai souvent des problèmes, et j'ai complètement cherché une réponse à la question actuelle, mais je me suis retrouvé perdu. Voici quelques-uns des endroits que j'ai consultés: - Comment corriger une exception httplib.BadStatusLine? - Python httplib2 Gestion des exceptions - code d'état http python
Mon problème est le suivant. J'ai créé une araignée et je veux explorer différentes URL. Lorsque je parcours chaque URL indépendamment, tout fonctionne correctement. Cependant, lorsque j'essaie d'analyser les deux, j'obtiens le message d'erreur suivant: httplib.BadStatusLine: ''
J'ai suivi certains conseils que j'ai lus (voir les liens susmentionnés) et je peux imprimer le response.status pour chaque requête, mais le response.url ne s'imprime pas et l'erreur est renvoyée. (J'imprime uniquement les deux instructions pour essayer d'identifier la source de l'erreur).
J'espère que c'est clair.
J'utilise scrapy et sélénium
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()
Basé sur Python Doc , httplib.BadStatusLine
généré si un serveur répond avec un code d’état HTTP que nous ne comprenons pas . Vous pouvez essayer de transmettre cette exception. Vous ne devriez pas fermer votre pilote si vous appelez plus d'une URL.
Essaye ça:
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
J'ai demandé à un décorateur de faire ce que la réponse principale fait, afin de rendre le code facilement réutilisable. C'est ici:
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
J'ai frappé cette erreur parce que j'avais défini une instance Selenium.webdriver
(nommée driver
), appelée driver.quit()
dessus, puis tenté d'appeler driver.get(url)
sur le pilote arrêté. La solution consiste à ne pas appeler driver.quit()
.
Je ne sais pas dans quelle mesure cela aidera, mais pour moi, j'essayais d'émettre une demande POST] et vous avez besoin d'une nouvelle connexion HTTP pour le faire. Vous ne pouvez pas utiliser la même connexion pour plusieurs demandes. Je continue à avoir la même erreur: httplib.BadStatusLine: ''. Je crois que la documentation décrit ceci, je l’ai simplement négligée.