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

Ответ 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