2016-10-05 4 views
3

Я строю скрипт python, чтобы проверить цену элемента amazon каждые 5-10 секунд. Проблема в том, что скрипт перестает «работать» через несколько минут. В консоли нет выхода, но в моих процессах он отображается как «работает».Скрипт Python останавливается через несколько минут

Я использую сеансы запросов для создания http-запросов и времени для отображения времени запроса.

Мой код выглядит следующим образом;

target_price = raw_input('Enter target price: ') 
url = raw_input('Enter the product url: ') 
while True: 
    delay=randint(5,10) 

    print datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d %H:%M:%S')+': '+'Sleeping for ' + str(delay) + ' seconds' 
    time.sleep(delay) 
    try: 
     with requests.Session() as s: 
      page = s.get(url,headers=headers,proxies=proxyDict,verify=False,timeout=5) 
      tree = html.fromstring(page.content) 
      price = tree.xpath('//div[@class="a-row a-spacing-mini olpOffer"]/div[@class="a-column a-span2 olpPriceColumn"]/span[@class="a-size-large a-color-price olpOfferPrice a-text-bold"]/text()')[0] 
      new_price = re.findall("[-+]?\d+[\.]?\d+[eE]?[-+]?\d*", price)[0] 
      old_price = new_price 
      print new_price 
      if float(new_price)<float(target_price): 
       print 'Lower price found!' 
       mydriver = webdriver.Chrome() 
       send_simple_message() 
       login(mydriver) 
       print 'Old Price: ' + old_price 
       print 'New Price: ' + new_price 
      else: 
       print 'Trying again' 
    except Exception as e: 
     print e 
     print 'Error!' 

EDIT: Я удалил функцию wait() и вместо этого использовал time.sleep.

EDIT2: Когда я использую прерывание клавиатуры, чтобы остановить сценарий, вот выход

Traceback (most recent call last): 
    File "checker.py", line 85, in <module> 
    page = s.get(url,headers=headers,proxies=proxyDict,verify=False,timeout=5) 
    File "C:\Python27\lib\site-packages\requests\sessions.py", line 488, in get 
return self.request('GET', url, **kwargs) 
    File "C:\Python27\lib\site-packages\requests\sessions.py", line 475, in request 
resp = self.send(prep, **send_kwargs) 
    File "C:\Python27\lib\site-packages\requests\sessions.py", line 596, in send 
    r = adapter.send(request, **kwargs) 
    File "C:\Python27\lib\site-packages\requests\adapters.py", line 423, in send 
timeout=timeout 
    File "C:\Python27\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 589, in urlopen 
self._prepare_proxy(conn) 
    File "C:\Python27\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 797, in _prepare_proxy 
conn.connect() 
    File "C:\Python27\lib\site-packages\requests\packages\urllib3\connection.py", 
line 267, in connect 
self._tunnel() 
    File "C:\Python27\lib\httplib.py", line 729, in _tunnel 
line = response.fp.readline() 
KeyboardInterrupt 

Это просит работает в бесконечный цикл?

+0

Что такое активный цикл? Как я могу это изменить? Первоначально я использовал time.sleep(), но изменил его на пользовательскую функцию, так как я думал, что time.sleep() может заставить программу перестать работать. –

+0

@ShikharGupta Active loop означает цикл, который не делает ничего похожего на цикл while, который у вас есть с 'pass'. – afsafzal

+0

Знаете ли вы, на какой строке вашего кода он застрял? Какой последний печатный результат вы видите? – afsafzal

ответ

0

Аргумент таймаута для функции s.get() сложный. Here Я нашел хорошее объяснение его необычного поведения. timeout остановит процесс, если запрошенный URL не отвечает, но он не остановит его, если он будет реагировать бесконечно.

В вашем случае соединение установлено гайкой, запрашиваемая страница просто отправляет ответы в бесконечном цикле.

Вы можете установить тайм-аут для вызова всей функции: Timeout function if it takes too long to finish

+0

Это разрешило это, хотя я использовал функцию eventlet to timeout get(). –

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