Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 5, 2011 12:10:28

tibs
От:
Зарегистрирован: 2011-06-30
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

Возврат к предыдущей итерации

Цикл for проходит по коллекции ссылок, открывая их и кое-что делая с полученными данными. Но иногда возникает ошибка HTTP Error 404 - ссылка пролетает получается. Можно ли как-то вернуться к предыдущей итерации цикла с вот этой ссылкой, подождать некоторое время и заново ее попытаться открыть?



Офлайн

#2 Авг. 5, 2011 12:16:13

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

Возврат к предыдущей итерации

tibs
Используйте вместо коллекции ссылок очередь (модуль Queue) и при возникновении ошибки переносите ссылку снова в ее начало.



Офлайн

#3 Авг. 5, 2011 20:00:19

tibs
От:
Зарегистрирован: 2011-06-30
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

Возврат к предыдущей итерации

А чем тогда цикл for заменить? Он же вроде только с коллекциями работает.



Офлайн

#4 Авг. 7, 2011 08:25:24

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Возврат к предыдущей итерации

while not myqueue.empty():
mydata = myqueue.get()
>>> import Queue
>>> help(Queue.Queue.get)
Help on method get in module Queue:

get(self, block=True, timeout=None) unbound Queue.Queue method
Remove and return an item from the queue.

If optional args 'block' is true and 'timeout' is None (the default),
block if necessary until an item is available. If 'timeout' is
a positive number, it blocks at most 'timeout' seconds and raises
the Empty exception if no item was available within that time.
Otherwise ('block' is false), return an item if one is immediately
available, else raise the Empty exception ('timeout' is ignored
in that case).
..bw



Офлайн

#5 Авг. 7, 2011 09:11:05

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Возврат к предыдущей итерации

tibs
А чем тогда цикл for заменить? Он же вроде только с коллекциями работает.
for работает и с итераторами

Офлайн

#6 Авг. 7, 2011 12:23:11

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Возврат к предыдущей итерации

> for работает и с итераторами
А если прочитать первые два поста, то как ты это себе представляешь?

myqueue = []
init_queue(myqueue)

for link in myqueue:
try:
process_link(link)
except Exception:
myqueue.append(link)
Так :-) ?

..bw



Офлайн

#7 Авг. 7, 2011 16:16:47

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Возврат к предыдущей итерации

Ну что-то вроде этого:

for ref in ref_source:
while not process_ref( ref ):
do_wait() # ждем



Офлайн

#8 Авг. 9, 2011 23:28:57

tibs
От:
Зарегистрирован: 2011-06-30
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

Возврат к предыдущей итерации

    m=re.findall(re1,r,16)
for topic_id in m:

try:

# open torrent url
torrent_url = 'http://{{tracker}}/forum/dl.php?t=%s' % topic_id
handle = opener.open(torrent_url, data)

# write it to output file
out = open('torrent/[{{tracker}}].t%s.torrent'%topic_id, 'wb')
out.write(handle.read())
out.close()
except Exception,e:
print e
open('%s.html'%topic_id,'wb+').write(str(e))
else:
print u"%s Торрент успешно сохранен"%topic_id
time.sleep(5)
Вот часть кода. После re.findall переменная m - это что? список? И как мне код поправить? Просто иногда сайт лежит и торренты нельзя скачать - 404. В этом случае, например, подождать 1 минуту.



Отредактировано tibs (Янв. 3, 2014 16:12:09)

Офлайн

#9 Авг. 10, 2011 08:41:47

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

Возврат к предыдущей итерации

tibs
torrent_url = 'http://pornolab.net/forum/dl.php?t=%s' % topic_id
ути какое палево
tibs
После re.findall переменная m - это что? список?
m - итератор по группам, найденным регуляркой
tibs
И как мне код поправить?
Сначала создай Queue и в цикле тупо засунь туда урлы. Потом делай try:except на открытие каждого урла и в случае ошибки запихивай этот урл обратно в очередь. Код написать не успел, но общий принцип должен быть понятен.



Офлайн

#10 Авг. 10, 2011 11:23:38

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Возврат к предыдущей итерации

> итератор
Неа, список это. Не путай людей умными словами.
tibs, выше тебе несколько вариантов было дано, включай голову уже. Например Isem'овский возьми, или мой.

..bw



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version