Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> жутко удивило: зачем питону нажатие клавиши? новогоднее чудо :) 
:(
    Опции темы
kulibinka
Дата 8.1.2007, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 20.11.2006

Репутация: 2
Всего: 4



Разбираясь с десктопным яндексом (локальный поиск на компьютере - 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
Кто-нибудь может его обьяснить?
PM MAIL   Вверх
albertn
Дата 10.1.2007, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



А циклится в каком месте?
В смысле выводит * или количество неудачных попыток?
PM WWW ICQ   Вверх
kulibinka
Дата 10.1.2007, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 20.11.2006

Репутация: 2
Всего: 4



нажатие клавИши
звездЫ жизнь обрывает
есть тайны в этом мире...

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

Это сообщение отредактировал(а) kulibinka - 10.1.2007, 11:57
PM MAIL   Вверх
albertn
Дата 10.1.2007, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



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

    except Exception, e:
        print e

PM WWW ICQ   Вверх
kulibinka
Дата 10.1.2007, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 20.11.2006

Репутация: 2
Всего: 4



Выведет
Код

HTTP Error 204: no content

PM MAIL   Вверх
albertn
Дата 10.1.2007, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



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

# Эту часть можно запихнуть в самое начало кода
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()

PM WWW ICQ   Вверх
kulibinka
Дата 10.1.2007, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 20.11.2006

Репутация: 2
Всего: 4



Попробовал.
И опять побежало "204 No Content" до нажатия клавиши...

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

Цитата

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


Озадачила фраза "Этот ответ предназначен прежде всего для того, чтобы позволить вводить данные для действий" - он что, действительно ждет чтобы я что-то сделал?
PM MAIL   Вверх
kulibinka
Дата 11.1.2007, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 20.11.2006

Репутация: 2
Всего: 4



Ну так что - ни у кого никаких идей нет, нужно будет делать эмуляцию клика миши в окне на питоне smile ?
PM MAIL   Вверх
albertn
Дата 12.1.2007, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



На сколько я понял, этот яндекс частично аяксовый, поэтому от скорее всего ожидает, что с ним будет общаться именно 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'})

PM WWW ICQ   Вверх
kulibinka
Дата 12.1.2007, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 20.11.2006

Репутация: 2
Всего: 4



Попробовал.

Код

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.
PM MAIL   Вверх
albertn
Дата 15.1.2007, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



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

PM WWW ICQ   Вверх
pythonwin
Дата 15.1.2007, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



можно ещё 
  •  написать о баге разработчикам питона

PM WWW GTalk Jabber   Вверх
albertn
Дата 15.1.2007, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



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

Для начала нужно установить действительно ли это их баг, или это фитча яндекса.
PM WWW ICQ   Вверх
Sergey912
Дата 29.1.2007, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 3.1.2007

Репутация: нет
Всего: нет



kulibinka
Может быть не в тему, но зачем с Яндексом соеденятся через локалхост?  smile 
PM MAIL WWW   Вверх
kulibinka
Дата 29.1.2007, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 20.11.2006

Репутация: 2
Всего: 4



Цитата

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

это поиск по компу от Яндекса - см. первый пост.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0851 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.