Найти - Пользователи
Полная версия: Grab - грабим файлы с сайта перебором
Начало » Data Mining » Grab - грабим файлы с сайта перебором
1
ctocopok
Есть некий сайт, типа фотогалереи, по счастью для граббера - файлы поименованы примерно как “3782796.jpg”

На них, в основном, есть ссылки на основном, большом сайте, но до его парсинга пока я не добрался. Решил поработать брутфорсом.

Нумерация не сквозная, то есть 3782796.jpg есть, а 3782795.jpg и 3782797.jpg может не быть.
в лоб попробовал сделать примерно следующее:
from grab import Grab
numstart = 3000000
numend   = 4000000
g = Grab()
for i in xrange(numstart, numend):
   url = prefix + str(i)+'.jpg'
   g.setup(method = 'HEAD')
   g.go(url)
   if g.response.code == 200:
      print i, 'we are lucky'
   else:
      continue
Ну, я еще понаписал всякой диагностики, обработку ошибок какую-никакую.
Суть в чем - при запуске этого безобразия “в лоб”, скорость работы составляет примерно 4-5 запросов в секунду, а значит, перебор всех представленных выше вариантов займет примерно 2.5 суток. Долгонько.
Разделил диапазон на 10 других, по 100 тыс. урлов, сделал батник (я на винде):
start python leech.py 3000000
start python leech.py 3100000
start python leech.py 3200000
...
start python leech.py 3900000
Запуск 10 этих потоков на скорости никак не сказался, то есть ограничение - внутри питона, а не в системе или канале.

Внимание, вопрос. Как бы это безобразие переписать в эффективное асинхронное (?) мультипоточное(?) дело с блэкджеком и обработчиками?
Пока что я только пишу результаты (валидные УРЛы) в файл, а потом же еще и сами файлы захочется скачать….
Очевидно, надо в сторону Grab::Spider, но что-то не сварить мне пока его в голове.
Может кто-нибудь “прототип” написать? Или я хочу чего-то, что и так в доках описано?
ctocopok
Из документации на spider я понял, что задается некий стартовый URL, разбирая который с помощью
for elem in grab.xpath_list('//h1[@class="title"]/a[@class="post_title"]'):
    yield Task('habrapost', url=elem.get('href'))

генерятся задания на последующий обход (и иные действия).

Из того, что есть сейчас, я получу перечень урлов на скачивание. Можно ли этот перечень скачать грабов в несколько потоков? Как?
могу, конечно, залить это на тестовый веб-сервер и пройтись прямо как в документации, но хотелось бы большего понимания и осмысленного манипулирования данными :)
Singularity
ctocopok
Можно ли этот перечень скачать грабов в несколько потоков? Как?
при запуске указать в сколько потоков скачивать.

Ты сам создаешь инстанс граба или запускаешь через grab cli ?
plusplus
Самый быстрый вариант - Spider. Помедленее - использовать потоки, вот уже написанная обертка для потоков.
ctocopok
Так, с тем, как скормить пауку перечень урлов, я понял. Пример из доков помог.
class ExampleSpider(Spider):
    def task_generator(self):
        for line in open('var/urls.txt'):
            yield Task('download', url=line.strip())

Инстанс создаю, видимо, как в коде из первого сообщения.

По всей видимости, мне дальше надо написать def task_download, в котором прописать скачивание и сохранение нужных jpg.
ihasseb
Ну, я еще понаписал всякой диагностики, обработку ошибок какую-никакую.
Суть в чем - при запуске этого безобразия “в лоб”, скорость работы составляет примерно 4-5 запросов в секунду, а значит, перебор всех представленных выше вариантов займет примерно 2.5 суток. Долгонько
ihasseb
Ну, я еще понаписал всякой диагностики, обработку ошибок какую-никакую.
Суть в чем - при запуске этого безобразия “в лоб”, скорость работы составляет примерно 4-5 запросов в секунду, а значит, перебор всех представленных выше вариантов займет примерно 2.5 суток. Долгонько
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