Есть ли лучшая библиотека, чем urlgrabber для извлечения удаленных URL в python? - PullRequest
2 голосов
/ 11 января 2010

Я пишу паука, которому нужна функция load_url, которая выполняет для меня следующее:

  1. Повторите URL, если есть временная ошибка, без утечек исключений.
  2. Не утечка памяти или файловых дескрипторов
  3. Использовать HTTP-KeepAlive для скорости (необязательно)

URLGrabber отлично выглядит на поверхности, но у него есть проблемы. Сначала я столкнулся с проблемой, когда открылось слишком много файлов, но я смог обойти эту проблему, отключив функцию проверки активности. Затем функция начала поднимать socket.error: [Errno 104] Connection reset by peer. Эта ошибка должна была быть обнаружена, и, возможно, на ее месте должно появиться URLGrabberError.

Я использую Python 2.6.4.

Кто-нибудь знает способ решения этих проблем с помощью URLGrabber или знает другой способ добиться того, что мне нужно, с помощью другой библиотеки?

Ответы [ 5 ]

4 голосов
/ 11 января 2010

Если вы пишете веб-сканер / скребок для экрана, вам может быть интересно взглянуть на специальную платформу, такую ​​как scrapy .

Вы можете написать действительно сложные веб-сканеры с очень небольшим кодом: он позаботится обо всех мельчайших деталях планирования запросов и перезвонит вам с результатами для обработки любым способом, который вам нужен (он основан на скрученных, но он скрывает от вас все детали реализации).

0 голосов
/ 11 января 2010

Методы, используемые Harvestman crawler , возможно, стоит изучить.

0 голосов
/ 11 января 2010

Scrapy звучит великолепно, и я рассмотрю возможность ее использования в будущем. Однако для этого проекта я действительно ищу простую функцию, как описано выше. Я создал тот, который, кажется, выполняет свою работу.

import urllib2

class HttpLoadError(RuntimeError):
    pass

class Http404(HttpLoadError):
    pass

class HttpFailedRepeatedly(HttpLoadError):
    pass

def safeurlopen(url):
    import time
    i = 0
    while True:
        i += 1
        try:
            return urllib2.urlopen(url)
        except (urllib2.HTTPError, socket.error), e:
            if getattr(e, 'code', '') == 404:
                raise Http404
            if i >= 10:
                raise HttpFailedRepeatedly(e)
            time.sleep(30)

def safeurlopenandread(url):
    rh = safeurlopen(url)
    res = rh.read()
    rh.close()
    return res
0 голосов
/ 11 января 2010

Также для очистки экрана в Python есть Scrapy , хотя я не знаю, будет ли это соответствовать вашим требованиям.

0 голосов
/ 11 января 2010

Экран-выскабливание? Проверить BeautifulSoup

...