Twisted Python getPage - PullRequest
       10

Twisted Python getPage

4 голосов
/ 20 апреля 2010

Я пытался получить поддержку по этому вопросу, но я полностью запутался.

Вот мой код:


from twisted.internet import reactor
from twisted.web.client import getPage
from twisted.web.error import Error
from twisted.internet.defer import DeferredList
from sys import argv

class GrabPage:
 def __init__(self, page):
  self.page = page

 def start(self, *args):
  if args == ():
   # We apparently don't need authentication for this
   d1 = getPage(self.page)
  else:
   if len(args) == 2:
    # We have our login information
    d1 = getPage(self.page, headers={"Authorization": " ".join(args)})
   else:
    raise Exception('Missing parameters')

  d1.addCallback(self.pageCallback)
  dl = DeferredList([d1])
  d1.addErrback(self.errorHandler)
  dl.addCallback(self.listCallback)

 def errorHandler(self,result):
  # Bad thingy!
  pass

 def pageCallback(self, result):
  return result

 def listCallback(self, result):
  print result

a = GrabPage('http://www.google.com')
data = a.start() # Not the HTML

Я хочу получить HTML-код, который предоставляется pageCallback при вызове start (). Это было лаваш для меня. Ty! И извините за мое дурацкое кодирование.

1 Ответ

14 голосов
/ 20 апреля 2010

Вам не хватает основ работы Twisted. Все вращается вокруг reactor, который вы даже никогда не запускаете. Думайте о реакторе так:

Петля реактора http://krondo.com/blog/wp-content/uploads/2009/07/reactor-1.png

Пока вы не запустите реактор, устанавливая отсрочки, все, что вы делаете - это связываете их без событий, из которых можно выстрелить.

Я рекомендую прочитать Twisted Intro Dave Peticolas . Это быстро и действительно дает вам всю недостающую информацию, которой нет в документации Twisted.

В любом случае, вот наиболее простой пример использования getPage, насколько это возможно:

from twisted.web.client import getPage
from twisted.internet import reactor

url = 'http://aol.com'

def print_and_stop(output):
    print output
    if reactor.running:
       reactor.stop()

if __name__ == '__main__':
    print 'fetching', url
    d = getPage(url)
    d.addCallback(print_and_stop)
    reactor.run()

Поскольку getPage возвращает отложенное значение, я добавляю обратный вызов print_and_stop в отложенную цепочку. После этого я запускаю reactor. Реактор запускает getPage, который затем запускает print_and_stop, который печатает данные с aol.com, а затем останавливает реактор.

Изменить, чтобы показать рабочий пример кода OP:

class GrabPage:
    def __init__(self, page):
        self.page = page
        ########### I added this:
        self.data = None

    def start(self, *args):
        if args == ():
            # We apparently don't need authentication for this
            d1 = getPage(self.page)
        else:
            if len(args) == 2:
                # We have our login information
                d1 = getPage(self.page, headers={"Authorization": " ".join(args)})
            else:
                raise Exception('Missing parameters')

        d1.addCallback(self.pageCallback)
        dl = DeferredList([d1])
        d1.addErrback(self.errorHandler)
        dl.addCallback(self.listCallback)

    def errorHandler(self,result):
        # Bad thingy!
        pass

    def pageCallback(self, result):
        ########### I added this, to hold the data:
        self.data = result
        return result

    def listCallback(self, result):
        print result
        # Added for effect:
        if reactor.running:
            reactor.stop()

a = GrabPage('http://google.com')
########### Just call it without assigning to data
#data = a.start() # Not the HTML
a.start()

########### I added this:
if not reactor.running:
    reactor.run()

########### Reference the data attribute from the class
data = a.data
print '------REACTOR STOPPED------'
print
########### First 100 characters of a.data:
print '------a.data[:100]------'
print data[:100] 
...