Найти - Пользователи
Полная версия: # Grab, вопросы новичка
Начало » Data Mining » # Grab, вопросы новичка
1 2
pooteen
Приветствую всех!
Начал использовать grablib. Прежде всего, хочу поблагодарить lorien за труды.
Собственно вопросы:
import grab
g = grab.Grab()
g.setup(timeout=2)
g.load_proxylist("proxy.txt", "text_file", "http")
g.go("http://www.yandex.ru")
print r.code
Этот код может дать исключения, например
  • grab.error.GrabConnectionError: (7, ‘Failed connect to www.yandex.ru:3202; Connection refused’)
    (в файле 1 прокси: 75.126.27.66:3202).
  • grab.error.GrabTimeoutError: Operation timed out after 2458 milliseconds with 1961 out of -1 bytes received
Меня интересует, как сказать Grab-у менять прокси до тех пор, пока не найдет нормальный?
Т.к. я в доску новичек, то первое, что пришло в голову - это тупо перебирать прокси (пробуем делать коннект - если исключение -прокси плохой, меняем и пробуем снова и так до победного), например так:
def grab_proxy(g):
    result = (False, g)
    try:
        g.go("http://www.yandex.ru")
        result = (True, g)
    except Exception as error:
        print error
        g.change_proxy()
    finally:
        return result
g = grab.Grab()
g.load_proxylist("proxy.txt", "text_file", "http")
tmp = (False, g)
while tmp[0] is False:
    tmp = grab_proxy(g)
g = tmp[1]
r = g.go("http://www.yandex.ru")
print r.code
(без проверок и т.д. - просто накидал для примера.)
Как в таких случаях поступают нормальные люди? :)
plusplus
pooteen
Как в таких случаях поступают нормальные люди? :)

У grab-а по дефолту включен hammer_mode, при желании можно увеличить ему таймауты и количество попыток. Всегда этого хватало, то есть по сути ставил load_proxylist и ни о чем не парился. А если всё-таки проблемы возникают, то может попробовать найти прокси получше?
Singularity
opka ?
pooteen
plusplus, как я понял hammer_mode не меняет прокси, а просто делает тот же коннект, но с новыми таймаутами (и мне это не подойдет, если прокси умер).

Сделал пока функцию-генератор для чека прокси. Моя задача такая: коннект должен быть в любом случае (пока есть прокси).
    def check_proxy():
        with open("proxy.txt", "r") as f:
            proxy_list = [p.strip() for p in f.readlines()]
        g = Grab()
        for proxy in proxy_list:
            g.setup(proxy=proxy, proxy_type="http", connect_timeout=5, timeout=5)
            try:
                g.go("http://www.microsoft.com")
            except GrabError:
                logging.error("proxy {0} is dead. Trying next...".format(proxy))
            else:
                yield proxy
Вопрос: вот попали мы в except (мертвый пркоси) - как его теперь из списочка кильнуть (из файла в том числе), чтоб при последующей загрузке он не мешался? Вернее так: как это сделать не через опу?
Singularity :)
lorien
Вы можете просто-напросто реализовать свой метод загрузки, ротации, фильтрации прокси-листа и подставлять в граб нужный прокси сервер.
pooteen
lorien, я подозреваю, что я это и делаю в функции выше, что-то вроде:
g = Grab()
g.setup(proxy=check_proxy().next())
Если это не то, что Вы имели ввиду, то кньте в меня примером или ссылкой на описание (искал в рассылке на гугле, не нашел, хотя вопросов с прокси там много). И вообще я полагаю, что изначально свою задачу решаю неверно, но об этом спрошу позже (или здесь или в рассылке вашей).
lorien
> У grab-а по дефолту включен hammer_mode

Нет, по дефолту он выключен: https://github.com/lorien/grab/blob/master/grab/base.py#L138
Это вы путаете, возможно, с поведением Grab::Spider, который действительно, по-дефолту, пытается выполнить задание несколько раз в случае сетевой ошибки.

> lorien, я подозреваю, что я это и делаю в функции выше, что-то вроде:
Ну да, такой вариант имеет право на жизнь. Но только учитывайте, что если вы проверили прокси и она работает, это не значит, что она будет работать для следующего вызова. Так что проверять работу граба через проверенную проксю всё равно надо и в случае ошибки как-то реагировать.
pooteen
lorien
Ну да, такой вариант имеет право на жизнь. Но только учитывайте, что если вы проверили прокси и она работает, это не значит, что она будет работать для следующего вызова. Так что проверять работу граба через проверенную проксю всё равно надо и в случае ошибки как-то реагировать.
Вот столкнулся с этим. При проверке пркоси живой. После 2-3 запросов - уже не отвечает. Как это лучше обрабатывать? Начинать всю работу сначала?
Сейчас, при успехе мне возврвщают true, и false при ошибке (любой). Сделать особое возвращаемое значение при ошибке прокси чтоб начать снова? Или устанавливать флаг о том, что функция звершилась из-за мертвого прокси?
Как вы это делаете?

Можно не отвечать, сделал:)
lorien
Обычно я проверяю наличие нужного элемента на странице, если элемента нет,то выполняю запрос повторно. Прокси просто рэндомно переключаются, я юзаю эти прокси http://grablib.org/ru/fineproxy - там они все рабочие и норм. качества, так что особо не заморачиваюсь на фильтрации прокси.
PanovSergey
Всем привет, немного офф. Насколько я знаю scrapy использует twisted соответственно может выполнять несколько запросов одновременно. Grab умеет? Прошу не пинать если я не прав.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB