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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> в цикле RuntimeError: maximum recursion, при интерации больше 985 
V
    Опции темы
americanets
Дата 13.11.2008, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1100
Регистрация: 27.9.2006

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



где то при итерации цикла больше 985 умирает с таким вот ответом, как продлить жизнь циклу ? 

Код

  File "crawler.py", line 61, in crawl
    crawl(urllist,done,domain)
  File "crawler.py", line 28, in crawl
    f = urllib2.urlopen(req)
  File "/usr/lib/python2.5/urllib2.py", line 124, in urlopen
    return _opener.open(url, data)
  File "/usr/lib/python2.5/urllib2.py", line 381, in open
    response = self._open(req, data)
  File "/usr/lib/python2.5/urllib2.py", line 399, in _open
    '_open', req)
  File "/usr/lib/python2.5/urllib2.py", line 360, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.5/urllib2.py", line 1107, in http_open
    return self.do_open(httplib.HTTPConnection, req)
  File "/usr/lib/python2.5/urllib2.py", line 1079, in do_open
    h.request(req.get_method(), req.get_selector(), req.data, headers)
  File "/usr/lib/python2.5/httplib.py", line 866, in request
    self._send_request(method, url, body, headers)
  File "/usr/lib/python2.5/httplib.py", line 889, in _send_request
    self.endheaders()
  File "/usr/lib/python2.5/httplib.py", line 860, in endheaders
    self._send_output()
  File "/usr/lib/python2.5/httplib.py", line 732, in _send_output
    self.send(msg)
  File "/usr/lib/python2.5/httplib.py", line 699, in send
    self.connect()
  File "/usr/lib/python2.5/httplib.py", line 670, in connect
    self.sock = socket.socket(af, socktype, proto)
RuntimeError: maximum recursion depth exceeded




вот сам код 



Код

#!/usr/bin/python
# -*- coding: utf-8 -*-
import urllib2
import re
import sys
import string
count = [0]

def crawl( urllist, done , domain) :
    count[0] += 1
    url=urllist[0]
    findUrl = []
    regexp =re.compile("href=\"(.*?)[\s\"]")
    req = urllib2.Request(url)
    req.add_header('User-agent', 'Python\'s script  ')
    try :
        f = urllib2.urlopen(req)
    except urllib2.URLError:
        print url + " Не смог быть открыт"
        return ''
    headers = f.info()
    contenttype = headers.getheader("Content-Type")
    html = f.read()
    html.replace('\n',' ')

    allurl = regexp.findall(html)

    for i in range(0,len(allurl)):
        if ( allurl[i][ : 1] == '/') :
            findUrl.append(domain + allurl[i])

    urllist = urllist + findUrl
    done.append(url) ;
    """print headers"""
    print "Загружен " + contenttype + '   ' + url + "  - " + str(count[0])

    for i in range(0,len(done)):
        while urllist.count(done[i]):
            urllist.pop(urllist.index(done[i]))

    if len(urllist)>0:
        crawl(urllist,done,domain)


if ( len(sys.argv) > 1 ) :
    urllist = [sys.argv[1]]
    done = []
    domain = urllist[0]
    crawl( urllist, done , domain )




--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
Daevaorn
Дата 13.11.2008, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



Дело не в цикле напрямую, а в глубине рекурсии - бесконечная она у вас. У вас что-то не то с алгоритмом.
PM MAIL WWW   Вверх
_Viper_
Дата 13.11.2008, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Daevaorn, не факт, возможно просто большая вложенность чем 1000.
americanets, что бы увеличить уровень рекурсии в питоне используй ф-цию sys.setrecursionlimit.
PM MAIL   Вверх
americanets
Дата 13.11.2008, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1100
Регистрация: 27.9.2006

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



_Viper_, sys.setrecursionlimit(3000) помогло , спасибо 


Daevaorn, ну  и алгоритм тоже подправить стоит 


--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
Daevaorn
Дата 13.11.2008, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



Цитата(_Viper_ @  13.11.2008,  14:32 Найти цитируемый пост)
Daevaorn, не факт, возможно просто большая вложенность чем 1000.

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


 




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


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

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