Форум сайта python.su
Приветствую Python сообщество!
Есть пара вопросов по библиотеках Grab и Scrapy.
1. Можно ли сделать задержку между асинхронными запросами в Grab? Например, я запустил несколько сетевых потоков, которые закачивают страницы по определенному алгоритму. Как сделать задержку между этими запросами, но при этом не тормозить всю очередь асинхронных запросов? По идеи такая возможность должна быть в библиотеке curl, но ее вроде нету.
2. Немного сложно разобраться с библиотекой scrapy. На хабре есть статья:
http://habrahabr.ru/post/115710/
Не могу до конца понять, как создать список url, по которым должен ходить паук. В grab с этим как то проще и удобней. В статье по ссылке выше условие задание такое:
Перейти на страницу abitur.nica.ru/new/www/search.php?region=77&town=0&opf=0&type=0&spec=0&ed_level=0&ed_form=0&qualif=&substr=&page=1И код, который отвечает за хождение по ссылкам:
Пройтись по каждой странице с результатами, меняя значение page
Перейти в описание вуза abitur.nica.ru/new/www/vuz_detail.php?code=486®ion=77&town=0&opf=0&type=0&spec=0&ed_level=0&ed_form=0&qualif=&substr=&page=1
class AbiturSpider(CrawlSpider): name = "abitur" allowed_domains = ["abitur.nica.ru"] start_urls = ["http://abitur.nica.ru/new/www/search.php?region=77&town=0&opf=0&type=0&spec=0&ed_level=0&ed_form=0&qualif=&substr=&page=1"] rules = ( Rule(SgmlLinkExtractor(allow=('search\.php\?.+')), follow=True), Rule(SgmlLinkExtractor(allow=('vuz_detail\.php\?.+')), callback='parse_item'), )
Офлайн
Chrome
Приветствую Python сообщество!Есть пара вопросов по библиотеках Grab и Scrapy.1. Можно ли сделать задержку между асинхронными запросами в Grab? Например, я запустил несколько сетевых потоков, которые закачивают страницы по определенному алгоритму. Как сделать задержку между этими запросами, но при этом не тормозить всю очередь асинхронных запросов? По идеи такая возможность должна быть в библиотеке curl, но ее вроде нету
ChromeМогу ошибаться, т.к. со scrapy только эту статью и читал и больше не работал, но вроде CrawlSpider - это паук, который хранит пройденные ссылки в sqlite и, соответсвенно уже больше по ним не ходит, а если тебе этого не надо, то нужно использовать BaseSpider.
Здесь по идеи паук переходит по стартовой странице и далее ищет ссылки, в которых есть регэкспы ‘search\.php\?.+’ и ‘vuz_detail\.php\?.+’, переходит по этим ссылкам, причем для последней вызывается колбек (исправьте, если я не правильно описал алгоритм). В новых скачиваемых страницах должны быть ссылки на предыдущие, поэтому паук должен зацикливаться в работе, если только он не сохраняет ссылки на страницы, по которым он ходил. Этот момент немного странный для меня, если ссылка на предыдущую страницу отличается от той, что была раньше, то мы можем вернуться назад.
ChromeПосмотри на bitbucket или github.
В общем механизм формирования ссылок в Scrapy немного непривычный, если у кого есть проекты на Scrapy, которыми могли бы поделиться для изучения, буду очень благодарен.
Отредактировано plusplus (Фев. 7, 2013 05:58:43)
Офлайн
Не могу до конца понять, как создать список url, по которым должен ходить паук. В grab с этим как то проще и удобней. В статье по ссылке выше условие задание такое:Я использую тут два способа: определение start_urls в __init__ паука, но этото способ не подходит, если есть необходимость делать кастмоные реквесты, в этом случае просто дедаю yield Requet из метода parse, если есть какие-то прямые способы формировать стартовые реквесты, то тоже было бы интересно услышать.
Офлайн
Есть пара вопросов по библиотеках Grab и Scrapy.
1. Можно ли сделать задержку между асинхронными запросами в Grab? Например, я запустил несколько сетевых потоков, которые закачивают страницы по определенному алгоритму. Как сделать задержку между этими запросами, но при этом не тормозить всю очередь асинхронных запросов? По идеи такая возможность должна быть в библиотеке curl, но ее вроде нету.
Офлайн
В scrapy - да, BaseSpider можно использовать (и IMHO это обычно проще и понятнее). Чтоб задать начальные запросы, можно переопределить метод start_requests и yield'ить начальные Request'ы оттуда.
Еще один паттерн - есть, например, csv с нужными ссылками. В качестве start_urls используем list из одного элемента - url этого csv файла (если он локальный, то через file:// ). В методе parse этот csv разбираем и Request'ы генерируем.
Офлайн
Это скорее не паттерн, а костыль. Странно, что туда за много лет не встроили фичу типа `task_generator` из Граба.
Офлайн
В scrapy task_generator можно реализовать, слушая сигнал spider_idle и генерируя запросы оттуда (с произвольной логикой, втч “поглощая” немного элементов из генератора). Вызвать там исключение DontCloseSpider не забыть только. Но с task_generator идея хорошая, да.
Офлайн