Найти - Пользователи
Полная версия: Несколько вопросов по Grab и Scrapy
Начало » Data Mining » Несколько вопросов по Grab и Scrapy
1
Chrome
Приветствую 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'),
             )
Здесь по идеи паук переходит по стартовой странице и далее ищет ссылки, в которых есть регэкспы ‘search\.php\?.+’ и ‘vuz_detail\.php\?.+’, переходит по этим ссылкам, причем для последней вызывается колбек (исправьте, если я не правильно описал алгоритм). В новых скачиваемых страницах должны быть ссылки на предыдущие, поэтому паук должен зацикливаться в работе, если только он не сохраняет ссылки на страницы, по которым он ходил. Этот момент немного странный для меня, если ссылка на предыдущую страницу отличается от той, что была раньше, то мы можем вернуться назад.
В общем механизм формирования ссылок в Scrapy немного непривычный, если у кого есть проекты на Scrapy, которыми могли бы поделиться для изучения, буду очень благодарен.

Также, какие еще асинхронные сетевые библиотеки используете в работе?
plusplus
Chrome
Приветствую Python сообщество!Есть пара вопросов по библиотеках Grab и Scrapy.1. Можно ли сделать задержку между асинхронными запросами в Grab? Например, я запустил несколько сетевых потоков, которые закачивают страницы по определенному алгоритму. Как сделать задержку между этими запросами, но при этом не тормозить всю очередь асинхронных запросов? По идеи такая возможность должна быть в библиотеке curl, но ее вроде нету

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

Chrome
Здесь по идеи паук переходит по стартовой странице и далее ищет ссылки, в которых есть регэкспы ‘search\.php\?.+’ и ‘vuz_detail\.php\?.+’, переходит по этим ссылкам, причем для последней вызывается колбек (исправьте, если я не правильно описал алгоритм). В новых скачиваемых страницах должны быть ссылки на предыдущие, поэтому паук должен зацикливаться в работе, если только он не сохраняет ссылки на страницы, по которым он ходил. Этот момент немного странный для меня, если ссылка на предыдущую страницу отличается от той, что была раньше, то мы можем вернуться назад.
Могу ошибаться, т.к. со scrapy только эту статью и читал и больше не работал, но вроде CrawlSpider - это паук, который хранит пройденные ссылки в sqlite и, соответсвенно уже больше по ним не ходит, а если тебе этого не надо, то нужно использовать BaseSpider.

Chrome
В общем механизм формирования ссылок в Scrapy немного непривычный, если у кого есть проекты на Scrapy, которыми могли бы поделиться для изучения, буду очень благодарен.
Посмотри на bitbucket или github.
insanemainframe
Не могу до конца понять, как создать список url, по которым должен ходить паук. В grab с этим как то проще и удобней. В статье по ссылке выше условие задание такое:
Я использую тут два способа: определение start_urls в __init__ паука, но этото способ не подходит, если есть необходимость делать кастмоные реквесты, в этом случае просто дедаю yield Requet из метода parse, если есть какие-то прямые способы формировать стартовые реквесты, то тоже было бы интересно услышать.
lorien
Есть пара вопросов по библиотеках Grab и Scrapy.
1. Можно ли сделать задержку между асинхронными запросами в Grab? Например, я запустил несколько сетевых потоков, которые закачивают страницы по определенному алгоритму. Как сделать задержку между этими запросами, но при этом не тормозить всю очередь асинхронных запросов? По идеи такая возможность должна быть в библиотеке curl, но ее вроде нету.

Кстати, в Grab::Spider уже можно делать отложенные задания. Просто делаем yield Task(…., delay=60) и оно выполнится через 60 секунд и не раньше
kmike
В scrapy - да, BaseSpider можно использовать (и IMHO это обычно проще и понятнее). Чтоб задать начальные запросы, можно переопределить метод start_requests и yield'ить начальные Request'ы оттуда.

Еще один паттерн - есть, например, csv с нужными ссылками. В качестве start_urls используем list из одного элемента - url этого csv файла (если он локальный, то через file:// ). В методе parse этот csv разбираем и Request'ы генерируем.
lorien
Это скорее не паттерн, а костыль. Странно, что туда за много лет не встроили фичу типа `task_generator` из Граба.
kmike
В scrapy task_generator можно реализовать, слушая сигнал spider_idle и генерируя запросы оттуда (с произвольной логикой, втч “поглощая” немного элементов из генератора). Вызвать там исключение DontCloseSpider не забыть только. Но с task_generator идея хорошая, да.
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