Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 6, 2013 19:38:03

Chrome
Зарегистрирован: 2013-02-03
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Несколько вопросов по Grab и Scrapy

Приветствую 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, которыми могли бы поделиться для изучения, буду очень благодарен.

Также, какие еще асинхронные сетевые библиотеки используете в работе?

Офлайн

#2 Фев. 7, 2013 05:53:36

plusplus
От:
Зарегистрирован: 2009-01-05
Сообщения: 418
Репутация: +  15  -
Профиль   Отправить e-mail  

Несколько вопросов по Grab и Scrapy

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

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

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

Chrome
В общем механизм формирования ссылок в Scrapy немного непривычный, если у кого есть проекты на Scrapy, которыми могли бы поделиться для изучения, буду очень благодарен.
Посмотри на bitbucket или github.



Отредактировано plusplus (Фев. 7, 2013 05:58:43)

Офлайн

#3 Авг. 18, 2013 19:36:46

insanemainframe
От:
Зарегистрирован: 2011-12-14
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Несколько вопросов по Grab и Scrapy

Не могу до конца понять, как создать список url, по которым должен ходить паук. В grab с этим как то проще и удобней. В статье по ссылке выше условие задание такое:
Я использую тут два способа: определение start_urls в __init__ паука, но этото способ не подходит, если есть необходимость делать кастмоные реквесты, в этом случае просто дедаю yield Requet из метода parse, если есть какие-то прямые способы формировать стартовые реквесты, то тоже было бы интересно услышать.



Офлайн

#4 Авг. 18, 2013 20:13:53

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

Несколько вопросов по Grab и Scrapy

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

Кстати, в Grab::Spider уже можно делать отложенные задания. Просто делаем yield Task(…., delay=60) и оно выполнится через 60 секунд и не раньше

Офлайн

#5 Авг. 28, 2013 01:27:56

kmike
От:
Зарегистрирован: 2009-12-07
Сообщения: 56
Репутация: +  4  -
Профиль   Отправить e-mail  

Несколько вопросов по Grab и Scrapy

В scrapy - да, BaseSpider можно использовать (и IMHO это обычно проще и понятнее). Чтоб задать начальные запросы, можно переопределить метод start_requests и yield'ить начальные Request'ы оттуда.

Еще один паттерн - есть, например, csv с нужными ссылками. В качестве start_urls используем list из одного элемента - url этого csv файла (если он локальный, то через file:// ). В методе parse этот csv разбираем и Request'ы генерируем.



Офлайн

#6 Авг. 28, 2013 15:06:57

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

Несколько вопросов по Grab и Scrapy

Это скорее не паттерн, а костыль. Странно, что туда за много лет не встроили фичу типа `task_generator` из Граба.

Офлайн

#7 Авг. 28, 2013 20:51:41

kmike
От:
Зарегистрирован: 2009-12-07
Сообщения: 56
Репутация: +  4  -
Профиль   Отправить e-mail  

Несколько вопросов по Grab и Scrapy

В scrapy task_generator можно реализовать, слушая сигнал spider_idle и генерируя запросы оттуда (с произвольной логикой, втч “поглощая” немного элементов из генератора). Вызвать там исключение DontCloseSpider не забыть только. Но с task_generator идея хорошая, да.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version