Задать вопрос

Обработка ошибок в парсере на python. Что не так?

Написал парсер на питоне. Копирует контент с чужого форума на мой форум, однако, то ли из-за таймаута на том или на моем форуме, то ли из-за проблем в соединении, парсер периодически вырубается из-за ошибок. Сейчас сделал так, чтобы парсер не вырубался, а вместо этого выводился текст в консоли и шел повтор запроса. Но это не решает проблему - эти повторы могут идти до бесконечности - а стоит закрыть и заново запустить скрипт - то все работает. Ниже прилагаю куски кода, где стоят try except. Может что-то не так сделал? Можно ли это на что-то заменить, чтобы при ошибке, происходил пропуск и дальнейшая работа скрипта? Скрипт копирует контент с нескольких форумов, поэтому важно чтобы при ошибке в соединении с одним форумом - шла работа дальше, со вторым и третьим форумом и т.д. Спасибо.

def in_go(self):#Вход на целевой форум/сайт
        
        global pars
        pars=Grab(log_file=self.name_log)
        pars.setup(connect_timeout=30, timeout=30)
        while self.err!="1":
            try:
                pars.go(self.url_login)
                pars.doc.set_input(self.user, self.login)#Вводим имя пользователя
                pars.doc.set_input(self.passwrd, self.password)#Вводим пароль
                if self.cookie_length==True:
                    pars.doc.set_input('cookielength', self.cook_length)#Выставляем время сессии
                pars.doc.submit()#Нажатие кнопки "Регистрация"
                #pars.go(self.url_profile_pars)#Дополнительная проверка входа на целевой форум
            except:
                print "НЕУДАЧНЫЙ ВХОД. ПОВТОР ЧЕРЕЗ 5 СЕК..."
                time.sleep(self.timeout)
            else:
                break
        print pars.doc.select('//title').text(), "\nУСПЕШНЫЙ ВХОД\n\n"#Выводим название сайта


def copy_info(self):
        while self.err!="1":
            try:
                pars.go(self.url_recent)#Переход к последним сообщениям
                self.board=(pars.doc.select(self.xpath_board)).text()#копируем имя раздела
                Title=(pars.doc.select(self.xpath_title)).text()#Копируем имя темы
                Title=Title.replace('Re: ','')#Удаляем в начале названия темы Re:
                Title=Title.replace(u'Ответ: ', '')#Удаляем в начале названия темы Отвте:
                self.title=Title.replace('"','')#Удаляем кавычки необходимо для корректных запросов
                self.nik=(pars.doc.select(self.xpath_nik)).text()#Копируем ник пользователя
                Post=(pars.doc.select(self.xpath_post)).html()#Копируем HTML код сообщения
            except:
                print "ОШИБКА ЧТЕНИЯ ДАННЫХ. ПОВТОР ЗАПРОСА, ЧЕРЕЗ 5 СЕК..."
                time.sleep(self.timeout)
            else:
                break


while self.err!="1":
            try:
                pars.go((pars.doc.select(self.xpath_recent)).attr('href'))#Переход на страницу в тему с последним сообщением
            except:
                print "ОШИБКА ПЕРЕХОДА НА СТРАНИЦУ С ПОСЛЕДНИМИ СООБЩЕНИЯМИ. ПОВТОР ЧЕРЕЗ 5 СЕК..."
                time.sleep(self.timeout)
            else:
                break
  • Вопрос задан
  • 1908 просмотров
Подписаться 4 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
Lucian
@Lucian
https://t.me/MakeFreelance
Привет, почему вы используете while, а не механизм работы с tasks? В каком месте вываливается с ошибкой?
Ответ написан
@deliro
0) Старайся не использовать костыль global
1) Не пользовался Grab'ом, но по виду, requests сессии использовать проще в связке с BeautifulSoup.
2) Отлавливать except:ом не нужно. Так ты пропускаешь вообще все ошибки. Даже синтаксические.
3) Используй потоки. Не так давно переписал свою библиотеку для работы со Steam API и увеличил скорость загрузки через потоки 500 матчей с 20 минут до 40 секунд (конечно, зависит от скорости соединения, но всё же).
4) Или syncio. habrahabr.ru/company/wargaming/blog/256425

А по факту: сложно понять, где ошибка без полного кода и трейсбэка.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы