- PVSM.RU - https://www.pvsm.ru -
С поддержкой asyncio и вдохновленный Scrapy [1].
В первую очередь как инструмент для сбора данных, применяемый в моем хобби проекте, который не давил бы своей мощью, сложностью и наследием. И да, кто же будет сознательно начинать что-то новое на python2.x?
В итоге появилось идея сделать простой фреймворк для современной экосистемы python3.x, но такой же элегантный как Scrapy.
Под катом обзорная статья о Pomp [2] в стиле FAQ.
И действительно, ведь на простой связке requests [3] + lxml [4] можно сделать очень многое. В действительности же фреймворки задают правила и нужные абстракции, и берут много рутины на себя.
Pomp из коробки не дает то, что может покрыть широкий спектр требований в решении задач парсинга сайтов: разбор содержимого, прокси, кеширование, обработка редиректов, куки, авторизация, заполнение форм и т.д.
В этом и слабость и одновременно сила Pomp. Данный фреймворк позиционируется как "фреймворк для фреймворков", другими словами дает все что нужно для того что бы сделать свой фреймворк и начать продуктивно "клепать" веб пауков.
Pomp дает разработчику:
Выигрыш:
Другими словами из Pomp можно сделать Scrapy, если работать с сетью на Twisted [7] и разбирать контент с помощью lxml и т.д.
В случае когда вам требуется обработать N источников, с общей моделью данных и с периодическим обновлением данных — это и есть идеальный случай применения Pomp.
Если вам необходимо обработать 1-2 источника и забыть, то быстрее и понятнее все сделать на requests+lxml, и вовсе не использовать специальные фреймворки.
Попытаться сравнить можно только в разрезе конкретной задачи.
И что лучше сказать сложно, но для меня это вопрос решенный, так как я используя Pomp могу собрать любой сложности систему. С другими же фреймворками зачастую придется бороться с их "рамками" и даже забивать гвозди микроскопом, к примеру использовать Scrapy для работы с headless browsers, оставляя неудел всю мощь Twisted.
Основные блоки:
- очередь запросов (задач);
- "транспорт" (на диаграмме как BaseDownloader);
- middlewares для пре- и пост-обработки запросов;
- pipelines для последовательной обработки/фильтрации/сохранения добытых данных;
- crawler для разбора контента и генерации следующих запросов;
- engine, который связывает все части.
Поиск на странице http://python.org/news [9] предложений со словом python
простейшим regexp.
import re
from pomp.core.base import BaseCrawler
from pomp.contrib.item import Item, Field
from pomp.contrib.urllibtools import UrllibHttpRequest
python_sentence_re = re.compile('[ws]{0,}python[sw]{0,}', re.I | re.M)
class MyItem(Item):
sentence = Field()
class MyCrawler(BaseCrawler):
"""Extract all sentences with `python` word"""
ENTRY_REQUESTS = UrllibHttpRequest('http://python.org/news') # entry point
def extract_items(self, response):
for i in python_sentence_re.findall(response.body.decode('utf-8')):
item = MyItem(sentence=i.strip())
print(item)
yield item
if __name__ == '__main__':
from pomp.core.engine import Pomp
from pomp.contrib.urllibtools import UrllibDownloader
pomp = Pomp(
downloader=UrllibDownloader(),
)
pomp.pump(MyCrawler())
В примере используется:
- Redis [11] для организации централизованной очереди задач;
- Apache Kafka [12] для агрегации добытых данных;
- Django [13] на postgres для хранения и отображения данных;
- grafana c kamon dashboards для отображения метрик работы кластера kamon-io/docker-grafana-graphite [14]
- docker-compose [15] что бы запустить весь этот зоопарк на одной машине.
Исходный код и инструкции по запуску смотрите здесь — estin/pomp-craigslist-example [16].
А так же видео без звука [17], где большая часть времени ушла на развертывание окружения. На видео можно найти некоторые ошибки в сборе метрик о размере очереди задач.
Примечание: в примере умышлено не исправлены ошибки в разборе некоторых страниц, для того что бы в процессе работы райсились исключения.
Pomp по большей части уже сформировался и достиг поставленных целей.
Дальнейшее развитие скорее всего будут заключаться в более плотной интеграции с asyncio.
- проект на bitbucket https://bitbucket.org/estin/pomp [2]
- зеркало проекта на github https://github.com/estin/pomp [18]
- документация http://pomp.readthedocs.org/en/latest/ [19]
Автор: estin
Источник [20]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/python/113961
Ссылки в тексте:
[1] Scrapy: http://scrapy.org/
[2] Pomp: https://bitbucket.org/estin/pomp
[3] requests: http://docs.python-requests.org/en/master/
[4] lxml: http://lxml.de/
[5] concurrent.futures: https://docs.python.org/3/library/concurrent.futures.html
[6] интеграции с phatnomjs: https://bitbucket.org/estin/pomp/src/82cbcabeb83a0b3041ee2ed76a6390eb91cd8a68/examples/e05_phantomjs.py?at=default&fileviewer=file-view-default
[7] Twisted: https://twistedmatrix.com/trac/
[8] Image: https://habrastorage.org/files/f9e/d31/6cf/f9ed316cf6d1491284c558a99fcd38f4.png
[9] http://python.org/news: http://python.org/news
[10] craigslist.org: http://www.craigslist.org
[11] Redis: http://redis.io/
[12] Kafka: http://kafka.apache.org/
[13] Django: https://www.djangoproject.com/
[14] kamon-io/docker-grafana-graphite: https://github.com/kamon-io/docker-grafana-graphite
[15] docker-compose: https://docs.docker.com/compose/
[16] estin/pomp-craigslist-example: https://github.com/estin/pomp-craigslist-example
[17] видео без звука: https://drive.google.com/file/d/0BzRf6g_VWuIjZDUxMGc1Q1ZScFk/view
[18] https://github.com/estin/pomp: https://github.com/estin/pomp
[19] http://pomp.readthedocs.org/en/latest/: http://pomp.readthedocs.org/en/latest/
[20] Источник: https://habrahabr.ru/post/278445/
Нажмите здесь для печати.