Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > жутко удивило: зачем питону нажатие клавиши?


Автор: kulibinka 8.1.2007, 18:25
Разбираясь с десктопным яндексом (локальный поиск на компьютере - http://desktop.yandex.ru/), сделал себе на питоне прокладку между моими запросами и тем что выдает яндекс.

Т.е., даю питону файл запросов, он их посылает моему локальному яндексу и собирает результаты выдачи мне в папочку.


У меня управляющая конструкция вида:

Код

этот кусок кода отвечает за получение страницы выдачи яндекса по запросу
    
url = 'http://127.0.0.1:9375/?dtype=1&ls=1&text=' + zapros

while True:
#а тут проваливается, так что цикл надо
    count_proval=0

#        эта часть нужна, так как f =urllib2.urlopen(url) бывает глючит на открывании
    while True:
        try:
            f =urllib2.urlopen(url)
        except:
            print "*",
            continue
        else:
            break

    page_text = f.read()

    а эта часть нужна, так как яндекс бывает глючно выводит страничку - пустую или обрезанную
    if len(page_text)==0 or page_text.find("</body></html>")==-1:
#        если все плохо - еще по разу
        print " ", count_proval,
        f.close()
        count_proval +=1
    else:
#    ну а если все нормально - пошли дальше
        f.close()
        break

НУ И ТУТ ПОШЛА РАБОТА ДАЛЬШЕ


И вот тут начинается фокус: обычно оно вообще в цикл не входит, а в самом плохом случае оно циклится, циклится, но рано или поздно успешно все считывает. 

НО: ЕСЛИ В ПЕРИОД ЦИКЛЕНИЯ КЛИКНУТЬ НА ЛЮБУЮ КЛАВИШУ, ОН СРАЗУ ЖЕ УСПЕШНО ЗАРАБОТАЕТ!

Как по мне, то это чудо smile
Кто-нибудь может его обьяснить?

Автор: albertn 10.1.2007, 11:49
А циклится в каком месте?
В смысле выводит * или количество неудачных попыток?

Автор: kulibinka 10.1.2007, 11:55
нажатие клавИши
звездЫ жизнь обрывает
есть тайны в этом мире...

(хоку, которая точно описывает ситуацию smile )

Автор: albertn 10.1.2007, 12:01
А что выведет, если написать в 13 строке:
Код

    except Exception, e:
        print e

Автор: kulibinka 10.1.2007, 12:23
Выведет
Код

HTTP Error 204: no content

Автор: albertn 10.1.2007, 12:35
Она у тебя скорее всего по таймауту вылетает, или где-то глюк. Попробуй более стабильную функцию
Код

# Эту часть можно запихнуть в самое начало кода
import httplib
conn = httplib.HTTPConnection("127.0.0.1:9375")

# Эта часть уже скачивание саомй страницы
conn.request("GET", '/?dtype=1&ls=1&text=' + zapros)
f = conn.getresponse()
print f.status, f.reason
page_text = f.read()

# Это уже в самом конце программы
conn.close()

Автор: kulibinka 10.1.2007, 12:47
Попробовал.
И опять побежало "204 No Content" до нажатия клавиши...

Добавлено @ 12:51 
Почитал о 204.

Цитата

204 - No Content, Нет содержимого 
Сервер выполнил запрос, но нет никакой новой информации, которую можно послать обратно. Если клиент - агент пользователя, ему НЕ СЛЕДУЕТ изменять вид документа, который послужил причиной запроса. 
Этот ответ предназначен прежде всего для того, чтобы позволить вводить данные для действий, не изменяя вид активного документа агента пользователя. Ответ МОЖЕТ включать новую метаинформацию в форме заголовков объекта (entity-headers), которые СЛЕДУЕТ добавить к документу, показываемому в настоящее время агентом пользователя. Ответ с кодом состояния 204 НЕ ДОЛЖЕН содержать тела сообщения, и, таким образом, всегда завершается первой пустой строкой после полей заголовка.


Озадачила фраза "Этот ответ предназначен прежде всего для того, чтобы позволить вводить данные для действий" - он что, действительно ждет чтобы я что-то сделал?

Автор: kulibinka 11.1.2007, 21:01
Ну так что - ни у кого никаких идей нет, нужно будет делать эмуляцию клика миши в окне на питоне smile ?

Автор: albertn 12.1.2007, 10:26
На сколько я понял, этот яндекс частично аяксовый, поэтому от скорее всего ожидает, что с ним будет общаться именно JavaScript.
Попробуй дополнительно отправить серверу заголовки:
Код

conn.request("GET", '/?dtype=1&ls=1&text=' + zapros,'',{'Pragma': 'no-cache'})
# или
conn.request("GET", '/?dtype=1&ls=1&text=' + zapros,'',{'Cache-Control': 'no-cache'})

Автор: kulibinka 12.1.2007, 13:32
Попробовал.

Код

count_proval=0
while True:

       conn = httplib.HTTPConnection("127.0.0.1:9375")

       conn.request("GET", url, '',{'Cache-Control': 'no-cache','Pragma': 'no-cache'})

       f = conn.getresponse()
       print f.status, f.reason
       page_text = f.read()

       conn.close()
       if len(page_text)==0 or page_text.find("</body></html>")==-1:
           print " ", count_proval,
           f.close()
           count_proval +=1
       else:
           f.close()
           break


И вообще, как оказалось - если вылезет No Content, то это навсегда (сам скрипт через while True никогда эту ситуацию не разрулит). 
Кстати, ему даже не нужно нажатие клавиши - достаточно мышкой поводить по окну питоновскому smile

Добавлено @ 13:35 
Цитата

На сколько я понял, этот яндекс частично аяксовый, поэтому от скорее всего ожидает, что с ним будет общаться именно JavaScript.


Ну если бы он на всех запросах так глючил, я бы понял.
Но ведь не на всех - иногда ему просто что-то заходит, и тогда он сваливается в No Content.

Автор: albertn 15.1.2007, 09:29
Скорее всего яндекс каким-то образом понимает, что ты уже когда-то делал данный запрос, и говорит, что ничего с прошлого раза не изменилось. По-этому и вызывает ошибку 204. Есть еще не возможные варианты решения:
  • Каждый раз случайным образом выбирать версию браузера (каждый раз отдельно подключаться)
  • В случае появления ошибки делать другой запрос, а затем возвращаться к исходному
  • Обновить версию Python.

Автор: pythonwin 15.1.2007, 12:28
можно ещё 
  •  написать о баге разработчикам питона

Автор: albertn 15.1.2007, 12:31
Цитата(pythonwin @  15.1.2007,  12:28 Найти цитируемый пост)
 написать о баге разработчикам питона

Для начала нужно установить действительно ли это их баг, или это фитча яндекса.

Автор: Sergey912 29.1.2007, 11:35
kulibinka
Может быть не в тему, но зачем с Яндексом соеденятся через локалхост?  smile 

Автор: kulibinka 29.1.2007, 15:56
Цитата

Может быть не в тему, но зачем с Яндексом соеденятся через локалхост? 

это поиск по компу от Яндекса - см. первый пост.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)