Python / Twisted – как напечатать более подробное сообщение об ошибке

Я запускаю этот код:

import argparse from tqdm import tqdm from sys import argv from pprint import pformat from twisted.internet.task import react from twisted.web.client import Agent, readBody from twisted.web.http_headers import Headers from twisted.internet.task import cooperate from twisted.internet.defer import gatherResults import sys from twisted.python import log log.startLogging(sys.stdout) import lxml.html from geoip import geolite2 import pycountry from tld import get_tld import json import socket poweredby = "" server = "" ip = "" f = open("errors.txt", "w") def error(response, url): f.write("Error: "+url+"\n") def cbRequest(response, url): global poweredby, server, ip # print 'Response version:', response.version # print 'Response code:', response.code # print 'Response phrase:', response.phrase # print 'Response headers:' # print pformat(list(response.headers.getAllRawHeaders())) poweredby = response.headers.getRawHeaders("X-Powered-By")[0] server = response.headers.getRawHeaders("Server")[0] #print poweredby #print server d = readBody(response) d.addCallback(cbBody, url) return d def cbBody(body, ourl): global poweredby, server,ip #print body html_element = lxml.html.fromstring(body) generator = html_element.xpath("//meta[@name='generator']/@content") ip = socket.gethostbyname(ourl) try: match = geolite2.lookup(ip) if match is not None: country = match.country try: c = pycountry.countries.lookup(country) country = c.name except: country = "" except: country = "" try: res = get_tld("http://www" + ourl, as_object=True) tld = res.suffix except: tld = "" try: match = re.search(r'[\w\.-]+@[\w\.-]+', body) email = match.group(0) except: email = "" permalink=ourl.rstrip().replace(".","-") try: item = generator[0] val = "{ \"Domain\":" + json.dumps( "http://" + ourl.rstrip()) + ",\"IP\":\"" + ip + "\",\"Server\":" + json.dumps( str(server)) + ",\"PoweredBy\":" + json.dumps( str(poweredby)) + ",\"MetaGenerator\":" + json.dumps(item) + ",\"Email\":" + json.dumps( email) + ",\"Suffix\":\"" + tld + "\",\"CountryHosted\":\"" + country+"\",\"permalink\":\""+permalink+"\" }" except: val = "{ \"Domain\":" + json.dumps( "http://" + ourl.rstrip()) + ",\"IP\":\"" + ip + "\"," + "\"Server\":" + json.dumps( str(server)) + ",\"PoweredBy\":" + json.dumps( str(poweredby)) + ",\"MetaGenerator\":\"\",\"Email\":" + json.dumps( email) + ",\"Suffix\":\"" + tld + "\",\"CountryHosted\":\"" + country+"\",\"permalink\":\""+permalink+"\" }" print val def main(reactor, url_path): urls = open(url_path) return mainjob(reactor, (url.strip() for url in urls)) def mainjob(reactor, urls=argv[2:]): #for url in urls: # print url agent = Agent(reactor) work = (process(agent, url) for url in tqdm(urls)) tasks = list(cooperate(work) for i in range(100)) return gatherResults(list(task.whenDone() for task in tasks)) def process(agent, url): d = agent.request( 'GET', "http://" + url, Headers({'User-Agent': ['crawler']}), None) d.debug=1 d.addCallback(cbRequest, url) d.addErrback(error, url) return d react(main, ["./test.txt"]) f.close() 

Я включил отладку и как-то для этих двух записей addErrback всегда (4 из 4 попыток), поэтому записи ошибок:

  user@laptop:~/crawler$ python scanner.py 2017-02-25 20:35:36+0100 [-] Log opened. 0it [00:00, ?it/s]2017-02-25 20:35:36+0100 [-] Starting factory <twisted.web.client._HTTP11ClientFactory instance at 0x7fffefac1248> 2017-02-25 20:35:36+0100 [-] Starting factory <twisted.web.client._HTTP11ClientFactory instance at 0x7fffefac16c8> 2it [00:00, 660.31it/s] 2017-02-25 20:35:37+0100 [-] Stopping factory <twisted.web.client._HTTP11ClientFactory instance at 0x7fffefac1248> 2017-02-25 20:35:37+0100 [-] Stopping factory <twisted.web.client._HTTP11ClientFactory instance at 0x7fffefac16c8> 2017-02-25 20:35:37+0100 [-] Main loop terminated. user@laptop:~/crawler$ cat errors.txt Error: google.al Error: fau.edu.al 

Я смущен, так как во время захвата я вижу, что эти запросы были отправлены и получен ответ.

введите описание изображения здесь

Как печатать точную ошибку в addErrback (), чтобы лучше понять поведение?

Это связано с этим вопросом:

Twisted / Python – обработка большого файла по строкам

Я ценю любую помощь. Новое для Python и Twisted.

Благодаря,

Обновление 1:

Я изменил функцию ошибки на это:

 def error(failure, url): f.write("Error: "+url+"\n") print type(failure.value), failure # catch error here print failure.value.reasons[0].printTraceback() 

и вот вывод, похоже, одинаковый при каждом запуске:

 user@laptop:~/crawler$ python scanner.py 2017-02-25 21:24:48+0100 [-] Log opened. 0it [00:00, ?it/s]2017-02-25 21:24:48+0100 [-] Starting factory <twisted.web.client._HTTP11ClientFactory instance at 0x7fffefac1200> 2017-02-25 21:24:48+0100 [-] Starting factory <twisted.web.client._HTTP11ClientFactory instance at 0x7fffefac1680> 2it [00:00, 788.33it/s] 2017-02-25 21:24:48+0100 [-] <type 'exceptions.TypeError'> [Failure instance: Traceback: <type 'exceptions.TypeError'>: 'NoneType' object has no attribute '__getitem__' 2017-02-25 21:24:48+0100 [-] /usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py:565:_startRunCallbacks 2017-02-25 21:24:48+0100 [-] /usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py:651:_runCallbacks 2017-02-25 21:24:48+0100 [-] /usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py:457:callback 2017-02-25 21:24:48+0100 [-] /usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py:565:_startRunCallbacks 2017-02-25 21:24:48+0100 [-] --- <exception caught here> --- 2017-02-25 21:24:48+0100 [-] /usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py:651:_runCallbacks 2017-02-25 21:24:48+0100 [-] scanner.py:47:cbRequest 2017-02-25 21:24:48+0100 [-] ] 2017-02-25 21:24:48+0100 [HTTP11ClientProtocol,client] main function encountered error Traceback (most recent call last): Failure: twisted.internet.defer.FirstError: FirstError[#0, [Failure instance: Traceback: <type 'exceptions.AttributeError'>: 'exceptions.TypeError' object has no attribute 'reasons' /usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py:565:_startRunCallbacks /usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py:651:_runCallbacks /usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py:457:callback /usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py:565:_startRunCallbacks --- <exception caught here> --- /usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py:651:_runCallbacks scanner.py:37:error ]] 2017-02-25 21:24:48+0100 [-] <class 'twisted.internet.error.ConnectError'> [Failure instance: Traceback (failure with no frames): <class 'twisted.internet.error.ConnectError'>: An error occurred while connecting: [Failure instance: Traceback (failure with no frames): <class 'twisted.internet.error.ConnectionLost'>: Connection to the other side was lost in a non-clean fashion: Connection lost. 2017-02-25 21:24:48+0100 [-] ]. 2017-02-25 21:24:48+0100 [-] ] 2017-02-25 21:24:48+0100 [-] Stopping factory <twisted.web.client._HTTP11ClientFactory instance at 0x7fffefac1680> 2017-02-25 21:24:48+0100 [-] Stopping factory <twisted.web.client._HTTP11ClientFactory instance at 0x7fffefac1200> 2017-02-25 21:24:48+0100 [-] Main loop terminated. 2017-02-25 21:24:48+0100 [-] Unhandled error in Deferred: 2017-02-25 21:24:48+0100 [-] Unhandled Error Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/twisted/internet/base.py", line 1084, in connectionFailed self.factory.clientConnectionFailed(self, reason) File "/usr/local/lib/python2.7/dist-packages/twisted/internet/endpoints.py", line 246, in clientConnectionFailed self._onConnection.errback(reason) File "/usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py", line 498, in errback self._startRunCallbacks(fail) File "/usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py", line 565, in _startRunCallbacks self._runCallbacks() --- <exception caught here> --- File "/usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py", line 651, in _runCallbacks current.result = callback(current.result, *args, **kw) File "scanner.py", line 37, in error print failure.value.reasons[0].printTraceback() exceptions.AttributeError: 'ConnectError' object has no attribute 'reasons' 2017-02-25 21:24:48+0100 [-] Unhandled error in Deferred: 2017-02-25 21:24:48+0100 [-] Unhandled Error Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py", line 565, in _startRunCallbacks self._runCallbacks() File "/usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py", line 651, in _runCallbacks current.result = callback(current.result, *args, **kw) File "/usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py", line 457, in callback self._startRunCallbacks(result) File "/usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py", line 565, in _startRunCallbacks self._runCallbacks() --- <exception caught here> --- File "/usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py", line 651, in _runCallbacks current.result = callback(current.result, *args, **kw) File "scanner.py", line 37, in error print failure.value.reasons[0].printTraceback() exceptions.AttributeError: 'exceptions.TypeError' object has no attribute 'reasons' 

Обновление 2:

После изменения функции ошибки на пример, данный @ Jean-Paul Calderone

Я получаю этот вывод:

 2017-02-27 17:46:57+0100 [-] Log opened. 0it [00:00, ?it/s]2017-02-27 17:46:57+0100 [-] Starting factory <twisted.web.client._HTTP11ClientFactory instance at 0x7fffefac0320> 2017-02-27 17:46:57+0100 [-] Starting factory <twisted.web.client._HTTP11ClientFactory instance at 0x7fffefac07a0> 2it [00:00, 763.36it/s] 2017-02-27 17:46:57+0100 [-] Traceback (most recent call last): 2017-02-27 17:46:57+0100 [-] File "/usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py", line 565, in _startRunCallbacks 2017-02-27 17:46:57+0100 [-] self._runCallbacks() 2017-02-27 17:46:57+0100 [-] File "/usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py", line 651, in _runCallbacks 2017-02-27 17:46:57+0100 [-] current.result = callback(current.result, *args, **kw) 2017-02-27 17:46:57+0100 [-] File "/usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py", line 457, in callback 2017-02-27 17:46:57+0100 [-] self._startRunCallbacks(result) 2017-02-27 17:46:57+0100 [-] File "/usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py", line 565, in _startRunCallbacks 2017-02-27 17:46:57+0100 [-] self._runCallbacks() 2017-02-27 17:46:57+0100 [-] --- <exception caught here> --- 2017-02-27 17:46:57+0100 [-] File "/usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py", line 651, in _runCallbacks 2017-02-27 17:46:57+0100 [-] current.result = callback(current.result, *args, **kw) 2017-02-27 17:46:57+0100 [-] File "scan.py", line 59, in cbRequest 2017-02-27 17:46:57+0100 [-] poweredby = response.headers.getRawHeaders("X-Powered-By")[0] 2017-02-27 17:46:57+0100 [-] exceptions.TypeError: 'NoneType' object has no attribute '__getitem__' 2017-02-27 17:46:57+0100 [-] Stopping factory <twisted.web.client._HTTP11ClientFactory instance at 0x7fffefac0320> 2017-02-27 17:46:59+0100 [-] Traceback (most recent call last): 2017-02-27 17:46:59+0100 [-] File "/usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py", line 565, in _startRunCallbacks 2017-02-27 17:46:59+0100 [-] self._runCallbacks() 2017-02-27 17:46:59+0100 [-] File "/usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py", line 651, in _runCallbacks 2017-02-27 17:46:59+0100 [-] current.result = callback(current.result, *args, **kw) 2017-02-27 17:46:59+0100 [-] File "/usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py", line 457, in callback 2017-02-27 17:46:59+0100 [-] self._startRunCallbacks(result) 2017-02-27 17:46:59+0100 [-] File "/usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py", line 565, in _startRunCallbacks 2017-02-27 17:46:59+0100 [-] self._runCallbacks() 2017-02-27 17:46:59+0100 [-] --- <exception caught here> --- 2017-02-27 17:46:59+0100 [-] File "/usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py", line 651, in _runCallbacks 2017-02-27 17:46:59+0100 [-] current.result = callback(current.result, *args, **kw) 2017-02-27 17:46:59+0100 [-] File "scan.py", line 59, in cbRequest 2017-02-27 17:46:59+0100 [-] poweredby = response.headers.getRawHeaders("X-Powered-By")[0] 2017-02-27 17:46:59+0100 [-] exceptions.TypeError: 'NoneType' object has no attribute '__getitem__' 2017-02-27 17:46:59+0100 [-] Stopping factory <twisted.web.client._HTTP11ClientFactory instance at 0x7fffefac07a0> 2017-02-27 17:46:59+0100 [-] Main loop terminated. 

Как вы можете видеть, он жалуется на то, что ответ является объектом NoneType, поэтому здесь не упоминается настоящая причина.

Однако, когда я запускаю старую версию функции ошибки, она печатает то, что вы можете видеть в «Обновление 1»:

 <class 'twisted.internet.error.ConnectError'> [Failure instance: Traceback (failure with no frames): <class 'twisted.internet.error.ConnectError'>: An error occurred while connecting: [Failure instance: Traceback (failure with no frames): <class 'twisted.internet.error.ConnectionLost'>: Connection to the other side was lost in a non-clean fashion: Connection lost. 

Почему он не печатает его в первой версии (ответ предложенный Жан-Поль Кальдероном)? Любая причина, по которой эта ошибка возникает вообще?

Я подтвердил, что он работает, когда я подключаюсь к этим доменам, также работает через поточную версию искателя (также в Python), поскольку вы можете видеть, что он также находится на проводе (скриншот Wireshark). Кажется, что Twisted не видит его (видит это как потерянное соединение?)

One Solution collect form web for “Python / Twisted – как напечатать более подробное сообщение об ошибке”

В вашей функции error . Трассировка говорит вам следующее:

  File "scanner.py", line 37, in error print failure.value.reasons[0].printTraceback() exceptions.AttributeError: 'exceptions.TypeError' object has no attribute 'reasons' 

scanner.py, строка 37, в функции с именем error , строка print failure.value.reasons[0].printTraceback() вызывает AttributeError потому что экземпляр TypeError не имеет атрибутов reasons .

Я думаю, что атрибут reasons который вы ищете, принадлежит RequestGenerationFailed , RequestTransmissionFailed или ResponseFailed .

Итак, определите error например:

 from twisted.web._newclient import ( RequestGenerationFailed, RequestTransmissionFailed, ResponseFailed, ) def error(failure, url): f.write("Error: "+url+"\n") if failure.check( RequestGenerationFailed, RequestTransmissionFailed, ResponseFailed, ): failure.value.reasons[0].printTraceback() else: failure.printTraceback() 

И если это окажется полезным, _newclient билет против Twisted, чтобы сделать эти типы исключений общедоступными (так как нет гарантии, что импорт _newclient продолжит работу в будущем).

  • Tail -f регистрироваться на сервере, обрабатывать данные, а затем обслуживать клиента через скрученные
  • Витая регистрация
  • Скрученный скрипт Python на Raspberry Pi (Debian) для связи с Arduino через USB
  • Создание программы на python до тех пор, пока Twisted отложенное не вернет значение
  • Использование inlineCallbacks
  • Как запустить Klein с скрученными?
  • Странное поведение при попытке реализовать скрученный отложенный список
  • Используйте мой собственный основной цикл в скрученном
  • Python, несколько потоков, выборка веб-страниц, загрузка веб-страниц
  • Как написать скрученный сервер, который также является клиентом?
  • UDP-клиент и сервер с Twisted Python
  •  
    Interesting Posts for Van-Lav

    Как найти ссылки Markdown с помощью регулярных выражений?

    HTML-форма POST для скрипта python?

    Mac OS X / bin / bash: команда python: не найдена в некоторой среде IDE

    СУХОЙ способ добавления созданных / модифицированных и временных

    Скопировать данные Из спортивной таблицы с использованием Python и Beautiful soup

    Почему существует необходимость в Twisted?

    Приложение Django работает нормально, но появляется предупреждающее сообщение TEMPLATE_ *

    упорядочивая перетасованные точки, которые могут быть соединены для формирования многоугольника (в python)

    Нужно пинговать 1000 URL-адресов каждые 2 минуты

    Python: использование `copyreg` для определения редукторов для типов, которые уже имеют редукторы

    Могу ли я передавать значения словаря / ввод и клавиши для работы

    Будет ли python автоматически мусор собирать двусвязный список?

    Получать подсчет нескольких отфильтрованных подзапросов в шаблоне

    Как настроить переменную среды R_user для использования rpy2 в python

    Создание словаря из итерабельного

    Python - лучший язык программирования в мире.