Увы, не могу ничего вам обещать. Но есть пример: мы с товарищем по grablab вместе занимаемся парсингом, он сначала использовал scrapy, а потом как-то не могу побороть один баг, попробовал grab:spider, да так на нём и остался. Причём он его без всякой документации юзает т.к. по сути там апи не сильно сложный.
Архитектура у обоих фреймворков одинаковая: пишем функции для обработки ответа от сервера, внутри функции можно порождать новые запросы. В данный момент в grab:spider нет никаких фишек для деплоя — я беру файл, называю его spider.py и фигачу туда всю логику, затем я запускаю его через команду python spider.py — вот и весь деплой :) В принципе, довольно удобно, в скрапи меня напрягала вся эта возня с проектами, с настройками, с пайплайнами. В спайдере нету пайплайнов, куда хотим — туда и пишем ручками… Я пишу в mongodb обычно.
В spider есть одна фича — не знаю, есть ли она в scrapy. Эта фича сильно обгечает отладку парсинга и повторный парсинг. Все GET-запросы кэшируются в монгодб. Очень-очень удобно :)
Cмотря, что называть принципиальным отличием. С высоты птичьего полёта — та же петрушка. А если смотреть оооочень детально, то в двух разных минорных версиях Scrapy можно найти принципиальные отличия :)
Честно говоря, иногда подумываю написать обёртку для регекспов, какой-нить облегчённый xpath. Просто бывает, когда надо парсить миллионы страниц, xpath слишком медленный, вернее само построение DOM-дерева.
Смотря, что за проект. Практика показывает, что есть неиллюзорные шансы найти кучу костылей и говнокода, написанных несколько лет назад человеком, которого и в проекте то уже нету :)
Ясно. Ну такой подход ожидаемо тормозит по сравнению с lxml. Тормозит чуть ли не в 10 раз: dumpz.org/122917/ Думаю тормоза из-за того, что каждый раз вызывается функция и каждый раз в ней стрится дополнительный PyQuery-объект.
А вообще, раз мы про pyquery заговорили, я подумал — самое время — и замержился с pyquery-форком. В общем, теперь в грабе через аттрибут `pyquery` доступно PyQuery-дерево.
pyquery предоставляет возможность писать селекторы в виде jquery-селекторов, не путайте их с css-селекторами.Это разные вещи, хоть и похожи. Кроме того, я писал выше, что lxml не поддерживает сложные css-селекторы. Мне сейчас проверять лень.
Так, с примером проблема. Я не знаю, как в scrapy без создания целого парсера просто получить HtmlXPathSelector от какого-либо содерижмого, он хочет какой-то response-объект, если вы мне подскажите, как его сделать, я напишу пример.
А почему оно должно было заработать? Yield же должен кто-то ловить и обрабатывать, ну вот его и ловит код, который task-функцию вызывает. Если хотите добавить из другого места task, то можете использовать просто self.add_task(Task(..)). А yield это просто для удобства и красоты.
А там, по-моему, обрезанный какой-то css, я как-то пробовал :nth-child(x) — у меня не заработало. А pyquery, наверное, всё корректно транслирует в xpath.
Бывают сайты с табличной вёрсткой, где множество вложенных тэгов table, tr, td. Там особо не к чему привязаться кроме поясняющего текста внутри нужной ячейки
Архитектура у обоих фреймворков одинаковая: пишем функции для обработки ответа от сервера, внутри функции можно порождать новые запросы. В данный момент в grab:spider нет никаких фишек для деплоя — я беру файл, называю его spider.py и фигачу туда всю логику, затем я запускаю его через команду python spider.py — вот и весь деплой :) В принципе, довольно удобно, в скрапи меня напрягала вся эта возня с проектами, с настройками, с пайплайнами. В спайдере нету пайплайнов, куда хотим — туда и пишем ручками… Я пишу в mongodb обычно.
В spider есть одна фича — не знаю, есть ли она в scrapy. Эта фича сильно обгечает отладку парсинга и повторный парсинг. Все GET-запросы кэшируются в монгодб. Очень-очень удобно :)
А вообще, раз мы про pyquery заговорили, я подумал — самое время — и замержился с pyquery-форком. В общем, теперь в грабе через аттрибут `pyquery` доступно PyQuery-дерево.
Показана реальная ситуация, я очень часто итерируюсь по xpath выборке и применяю дополнительные xpath-выражения к каждому элементу выборки.
У меня такие результаты:
lorien@athlon:/web/barn$ python speed3.py
HtmlXpathSelector: 0.75
lxml: 0.02
Equal: True