2016-12-29 2 views
0

, поэтому я хочу проверить сайт, чтобы обновлять меня всякий раз, когда есть новый опубликованный пункт. Они часто не обновляются, поэтому я уверен, что когда они будут обновлены, это будет интересным. Я хочу достичь этого, выбирая «начальный номер» и подсчитывая количество ссылок на странице, затем сравнивайте это число с количеством ссылок каждые 10 минут, пока количество ссылок больше стартового.Используйте вывод одной функции в качестве входного сигнала другой функции

Сначала я запускаю это, чтобы получить «стартовый номер» ссылок:

links=[] 
for link in soup.findAll('a'): 
    links.append(link.get('href')) 
start_num = len(links) 

Затем сравните это число с количеством ссылок прямо сейчас и через каждые 5 секунд:

notify=True 
while notify: 
    try: 
     page = urllib.request.urlopen('web/site/url') 
     soup = bs(page, "lxml") 

     links=[] 
     for link in soup.findAll('a'): 
      links.append(link.get('href')) 

     if len(links) > start_num: 
      message = client.messages.create(to="", from_="",body="") 
      print('notified') 
      notify=False 
     else: 
      print('keep going') 
      time.sleep(60*5) 

    except: 
     print("Going to sleep") 
     time.sleep(60*10) 

Как может Я объединяю все это в 1 функцию, в которой я запускаю, может хранить начальное число ссылок, не перезаписывая его каждый раз, когда я проверяю его на текущее количество ссылок?

+0

Если вы хотите сохранить состояние в функции, вы должны рассмотреть возможность использования класса. –

ответ

0

вы можете сделать это по крайней мере два способа: декораторов и генераторы

Декораторы:

def hang_on(func): 

    # soup should be in a visible scope 
    def count_links(): 
     # refresh page? 
     return len(soup.findAll('a')) 

    start_num = count_links() 

    def wrapper(*args, **kwargs): 
     while True: 
      try: 
       new_links = count_links() 
       if new_links > start_num: 
        start_num = new_links 
        return fund(*args, **kwargs) 
       print('keep going') 
       time.sleep(60*5)    
      except: 
       print("Going to sleep") 
       time.sleep(60*10)   

    return wrapper 

@hang_on  
def notify(): 
    message = client.messages.create(to="", from_="",body="") 
    print('notified') 

# somewhere in your code, simply: 
notify() 

Генераторы:

def gen_example(soup): 

    # initialize soup (perhaps from url) 

    # soup should be in a visible scope 
    def count_links(): 
     # refresh page? 
     return len(soup.findAll('a')) 

    start_num = count_links() 

    while True: 
     try: 
      new_links = count_links() 
      if new_links > start_num: 
       start_num = new_links 
       message = client.messages.create(to="", from_="",body="") 
       print('notified') 
       yield True # this is what makes this func a generator 

      print('keep going') 
      time.sleep(60*5)    
     except: 
      print("Going to sleep") 
      time.sleep(60*10)  

# somewhere in your code: 
gen = gen_example(soup) # initialize 

gen.next() # will wait and notify 

# coming soon 
0

Я бы реализовать его как класс, так как этот код вполне читабельны и легко поддерживаются. Наслаждайтесь:

class Notifier: 
    url = 'web/site/url' 
    timeout = 60 * 10 

    def __links_count(self): 
     page = urllib.request.urlopen(self.url) 
     soup = bs(page, "lxml") 

     links=[] 
     for link in soup.findAll('a'): 
      links.append(link.get('href')) 

     return len(links) 

    def __notify(self): 
     client.messages.create(to="", from_="", body="") 
     print('notified') 

    def run(self): 
     current_count = self.__links_count() 

     while True: 
      try: 
       new_count = self.__links_count() 

       if new_count > current_count: 
        self.__notify() 
        break 

       sleep(self.timeout) 

      except: 
       print('Keep going') 
       sleep(self.timeout) 

notifier = Norifier() 
notifier.run() 
+0

, поэтому self, используемое как аргументы внутри функций (self.url, self.timeout), всегда относится к переменным, не определенным ни в одном из методов, определенных в классе? – e1v1s

Смежные вопросы