Httplib.BadStatusLine: ''
Как всегда, у меня часто возникают проблемы, и я тщательно искал ответ на текущий, но оказался в затруднении. Вот некоторые из мест, которые я искал:
- Как исправить исключение httplib.BadStatusLine?
- Python httplib2 Обработка исключений
- код состояния http python
Моя проблема следующая. Я создал паука и хочу сканировать разные URL-адреса. Когда я просматриваю каждый URL независимо, все работает нормально. Однако, когда я пытаюсь выполнить обход, я получаю следующую ошибку: httplib.BadStatusLine: ''
Я следил за некоторыми советами, которые я прочитал (см. ссылки, упомянутые выше), и может печатать ответ. Состояние для каждого запроса работает, но response.url не печатает и не возникает ошибка. (Я только печатаю оба утверждения, чтобы попытаться определить источник ошибки).
Я надеюсь, что это ясно.
Я использую scrapy and selenium
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()
Ответы
Ответ 1
Основанный на Python Doc, httplib.BadStatusLine
поднят, если сервер отвечает кодом состояния HTTP, который мы не понимаем.
Вы можете попытаться передать это исключение. Вы не должны закрывать свой драйвер, если вы собираетесь называть более одного URL-адреса.
Попробуйте следующее:
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
Ответ 2
Пожалуйста, убедитесь, что ваш chromedriver
обновлен с помощью браузера GoogleChrome.
Вот ссылка для скачивания: https://sites.google.com/a/chromium.org/chromedriver/downloads
Ответ 3
Я сделал декоратора, чтобы сделать то, что делает верхний ответ, чтобы сделать код легко повторным. Вот он:
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