Python + Grab инсталляция и настройка

Вводная

Меня в последнее время достаточно сильно заинтересовала тема маркетинга, исследования различных данных по сайтам и, собственно, сбор данных с множества сайтов. Возникла задача не просто с бухты-барахты, а из требований заказчика на сайте free-lance. Так вот, я подумал, что собирать ручками с сайтов информацию — это мало того, что время затратное занятие, так при этом все желание на первых сайтах пропадет. Попозже пришла мысль, что должны существовать автоматизированные средства сбора и парсинга инфы веб-страниц. Погуглив, почитав различные статьи я решил начать осваивать python и библиотеку grab. Grab — библиотека парсинга вебсайтов для языка Python. Обладает широким набором возможностей.

Основные области использования Grab:

  • Извлечение данных с веб-сайтов (site scraping)
  • Работа с сетевыми API
  • Автоматизация работы с веб-сайтами, например, регистратор профилей на каком-либо сайте

Grab состоит из двух частей:

  • Главный интерфейс Grab для создания сетевого запроса и работы с его результатом. Этот интерфейс удобно использовать в простых скриптах, где не нужна большая многопоточность, или непосредственно в python-консоли.
  • Интерфейс Spider, позволяющий разрабатывать асинхронные парсеры. Этот интерфейс позволяет, во-первых, более строго описать логику парсера, во-вторых, разрабатывать парсеры с большим числом сетевых потоков.

Более подробную вводную можно посмотреть тут: http://ru.wikibooks.org/wiki/Grab

Немного про парсинг и все, что с ним связано

Парсер – программа, выполняющая анализ контента сайтов в интернет и выкачивающая содержимое по заданным параметрам. Используется также термин «граббер», оба слова считаются синонимами.

Программы парсинга обычно используются для следующих целей:

1. Поддержание постоянно обновляемой актуальной информации на веб-странице (например, курса валют или прогноза погоды).

2. Автообновление содержимого страниц сайта – новостей, добавление информации с RSS-каналов, сайтов сходной тематики и т.п.

3. Интеграция разрозненной информации – обычно для новостных сайтов, которые дают ссылки на новости других изданий, не скрывая их источника. Смысл – удобство посетителя.

4. Первичное наполнение ресурса – позволяет быстро провести заполнение информационной базы сайта с нуля до значимых величин объема информации. Парсеры подразделяются, в зависимости от форматов массива анализируемых данных, на парсеры XML, RSS, парсеры документов Excel и др. Современные программы совмещают в себе функции анализа контента, конвертации форматов и экспорта данных. Также многие парсеры несут в себе возможность уникализировать получаемый контент с помощью словарной базы синонимов. Еще одной возможностью программ для парсинга является функция быстрого создания из полученных данных готовых сайтов, с возможностью их немедленного размещения в интернете.

В лингвистике и информатике, синтаксический анализ (парсинг) — это процесс сопоставления линейной последовательности лексем (слов, токенов) естественного или формального языка с его формальной грамматикой. Результатом обычно является дерево разбора (синтаксическое дерево). Обычно применяется совместно с лексическим анализом. Синтаксический анализатор (парсер) — это программа или часть программы, выполняющая синтаксический анализ.

Пример разбора выражения в дерево При парсинге исходный текст преобразуется в структуру данных, обычно — в дерево, которое отражает синтаксическую структуру входной последовательности и хорошо подходит для дальнейшей обработки. Как правило, результатом синтаксического анализа является синтаксическая структура предложения, представленная либо в виде дерева зависимостей, либо в виде дерева составляющих, либо в виде некоторой комбинации первого и второго способов представления.

Типы алгоритмов Нисходящий парсер (англ. top-down parser) — продукции грамматики раскрываются, начиная со стартового символа, до получения требуемой последовательности токенов. Метод рекурсивного спуска LL-анализатор Восходящий парсер (англ. bottom-up parser) — продукции восстанавливаются из правых частей, начиная с токенов и кончая стартовым символом. LR-анализатор GLR-парсер

ПО для разработки анализаторов

  • ANTLR — генератор парсеров
  • Bison — генератор парсеров
  • Coco/R — генератор сканера и парсера
  • GOLD — парсер gppg — генератор парсеров для языка C#
  • JavaCC — генератор парсеров для языка Java
  • Lemon Parser — генератор парсеров
  • Lex — генератор сканеров
  • LRgen — генератор сканеров и парсеров
  • PEG.js — генератор парсеров для Javascript
  • Jison — генератор парсеров для Javascript
  • Ragel — генератор встраиваемых парсеров
  • Rats! — генератор парсеров для Java
  • Rebol SableCC — генератор интерпретаторов
  • Spirit Parser Framework — генератор парсеров
  • Xerces — XML парсер
  • Yacc — генератор парсеров
  • SHProto — генератор FSM-парсеров
  • AGFL — генератор парсеров естественного языка

Дистрибутивы, которые я использовал для установки на windows 7

  1. Качаем python-2.7.4.msi по ссылке http://python.org/ftp/python/2.7.4/python-2.7.4.msi
    1. Устанавливаем python, запустив дистрибутив python-2.7.4.msi;
    2. В качестве директории оставил по умолчанию C:\Python27
  2. Качаем и устанавливаем lxml-2.3.6.win32-py2.7;
  3. Качаем и устанавливаем pycurl-ssl-7.19.0.win32-py2.7;
  4. Качаем, распаковываем distribute-0.6.36.tar. Далее запускаем в распакованной директории команду python.exe setup.py install; Пользовался far;
  5. Качаем, распаковываем grab-0.4.8.tar. Далее запускаем в распакованной директории команду python.exe setup.py install; Пользовался far.
  6. Google’s Python Class https://developers.google.com/edu/python/?hl=ru

Изучать Grab — библиотеку можно тут

Help on Grab in module grab.base object:

class Grab(grab.ext.lxml.LXMLExtension, grab.ext.form.FormExtension, grab.ext.pquery.PyqueryExtension, grab.ext.django.DjangoExtension, grab.ext.text.TextExtension, grab.ext.rex.RegexpExtension, grab.ext.ftp.FTPExtension)

Method resolution order

  • Grab
  • grab.ext.lxml.LXMLExtension
  • grab.ext.form.FormExtension
  • grab.ext.pquery.PyqueryExtension
  • grab.ext.django.DjangoExtension
  • grab.ext.text.TextExtension
  • grab.ext.rex.RegexpExtension
  • grab.ext.ftp.FTPExtension
  • __builtin__.object

 Methods defined here

  • __getstate__(self)
  • __init__(self, response_body=None, transport=’curl.CurlTransport’, **kwargs)
  • adopt(self, g)
  • change_proxy(self)
  • clear_cookies(self)
  • clone(self, **kwargs)
  • common_headers(self)
  • copy_request_data(self)
  • detect_request_method(self)
  • download(self, url, location, **kwargs)
  • dump_config(self)
  • dump_cookies(self, path)
  • fake_response(self, content, **kwargs)
  • get_request_counter(self)
  • go(self, url, **kwargs)
  • load_config(self, config)
  • load_cookies(self, path)
  • load_proxylist(self, source, source_type, proxy_type=’http’, auto_init=True, auto_change=True, **kwargs)
  • log_request(self, extra=»)
  • make_url_absolute(self, url, resolve_base=False)
  • prepare_request(self, **kwargs)
  • process_request_result(self, prepare_response_func=None)
  • request(self, **kwargs)
  • reset(self)
  • save_dumps(self)
  • save_failed_dump(self)
  • setup(self, **kwargs)
  • setup_proxylist(self, proxy_file=None, proxy_type=’http’, read_timeout=None, auto_init=True, auto_change=True, server_list=None)
  • setup_with_proxyline(self, line, proxy_type=’http’)
  • sleep(self, *args, **kwargs)
  • trigger_extensions(self, point)

———————————————————————-

Data descriptors defined here

  • request_headers

———————————————————————-

Data and other attributes defined here

  • clonable_attributes = (‘request_head’, ‘request_log’, ‘request_body’, …
  • extension_handlers = {‘config’: [], ‘init’: [], ‘reset’: [<unbound met…
  • extension_points = (‘config’, ‘init’, ‘reset’)
  • mutable_config_keys = [‘post’, ‘multipart_post’, ‘headers’, ‘cookies’,…

———————————————————————-

Methods inherited from grab.ext.lxml.LXMLExtension

  • assert_css(self, path)
  • assert_xpath(self, path)
  • build_html_tree(self)
  • build_xml_tree(self)
  • css(self, path, default=<object object>)
  • css_exists(self, path)
  • css_list(self, path)
  • css_number(self, path, default=<object object>, ignore_spaces=False, smart=False, make_int=True)
  • css_text(self, path, default=<object object>, smart=False, normalize_space=True)
  • extra_reset(self)
  • find_link(self, href_pattern, make_absolute=True)
  • find_link_rex(self, rex, make_absolute=True)
  • follow_link(self, anchor=None, href=None)
  • strip_tags(self, content, smart=False)
  • xpath(self, path, default=<object object>, filter=None)
  • xpath_exists(self, path)
  • xpath_list(self, path, filter=None)
  • xpath_number(self, path, default=<object object>, filter=None, ignore_spaces=False, smart=False, make_int=True)
  • xpath_text(self, path, default=<object object>, filter=None, smart=False, normalize_space=True)

———————————————————————-

Data descriptors inherited from grab.ext.lxml.LXMLExtension

  • __dict__
  • __weakref__
  • tree
  • xml_tree

———————————————————————-

Methods inherited from grab.ext.form.FormExtension

  • choose_form(self, number=None, id=None, name=None, xpath=None)
  • choose_form_by_element(self, xpath)
  • form_fields(self)
  • set_input(self, name, value)
  • set_input_by_id(self, _id, value)
  • set_input_by_number(self, number, value)
  • set_input_by_xpath(self, xpath, value)
  • submit(self, submit_name=None, make_request=True, url=None, extra_post=None)

———————————————————————-

Data descriptors inherited from grab.ext.form.FormExtension

  • form

———————————————————————-

Data descriptors inherited from grab.ext.pquery.PyqueryExtension

  • pyquery

———————————————————————-

Methods inherited from grab.ext.django.DjangoExtension

  • django_file(self, name=None)

———————————————————————-

Methods inherited from grab.ext.text.TextExtension

  • assert_substring(self, anchor, byte=False)
  • assert_substrings(self, anchors, byte=False)
  • search(self, anchor, byte=False)

———————————————————————-

Methods inherited from grab.ext.rex.RegexpExtension

  • assert_rex(self, rex, byte=False)
  • normalize_regexp(self, regexp, flags=0)
  • rex(self, regexp, flags=0, byte=False, default=<object object>)
  • rex_text(self, regexp, flags=0, byte=False, default=<object object>)

———————————————————————-

Methods inherited from grab.ext.ftp.FTPExtension

  • ftp_upload_directory(self, server, local_dir, remote_dir, userpwd=None)
  • ftp_upload_file(self, server, local_path, remote_path, userpwd=None, make_request=True)

Дополнительная инфа по парсингу

Debug пауков, написанных на python

В python есть стандартный модуль для вывода диагностических сообщений. Называется logging, он предоставляет возможности фильтровать сообщения из различных модулей, отправлять сообщения в различные источники. Grab использует logging модуль. Все его сообщения идут через логгеры с именем «grab.*» Чтобы просто выводить все сообщения grab в консоль, пропишите этот код перез запуском паука: import logging logging.basicConfig(level=logging.DEBUG) В таком случае вы увидите куча диагностических сообщений. Ественно, там же вы увидите критическую ошибку, из-за которой падает ваш паук. В библиотеке grab есть функция которая настраивает сообщения от Grab так, что в консоль выводятся только ошибки, а диагностические сообщения выводятся в файлы. Использовать её можно так: from grab.tools.logs import default_logging() default_logging()

Утилиты, в помощь разработчикам

Различные утилиты для получения информации об элементах на веб-страницах

  • Chrome — Developer Tools
  • Firefox — Firebug
  • Internet Explorer — Developer Toolbar
  • Opera — Dragonfly
  • Safari — Developer Tools

«Simple HTML DOM» — это библиотека, которая даёт возможность манипулировать DOM-представлением HTML-документа средствами PHP. Данная библиотека позволяет с лёгкостью создавать различные грабберы контента.

Подробнее http://habrahabr.ru/post/114143/

cron — демон-планировщик задач в UNIX-подобных операционных системах, использующийся для периодического выполнения заданий в определённое время.

Снифферы — это проги, которые перехватывают весь сетевой трафик. Снифферы полезны для диагностики сети (для админов) и для перехвата паролей (понятно для кого:)). Например если ты получил доступ к одной сетевой машине и установил там сниффер, то скоро все пароли от их подсети будут твои. Снифферы ставят сетевую карту в прослушивающий режим (PROMISC).То есть они получают все пакеты. В локалке можно перехватывать все отправляемые пакеты со всех машин (если вы не разделены всякими хабами), так как там практикуется широковещание.

http-снифферы (для Windows):

HttpAnalyzer — классный сниффер, есть все необходимые плюшки для http-сниффера: «pretty» отображение POST DATA; возможность открыть ответ на запрос в браузере; плюс, это не debugging proxy, а значит можно дебажить работу скриптов через прокси/соксы, т.к. перехватываются все запросы. Из минусов: платный; подвисает при остановке сниффинга; открытие ответа частенько тупит и открывается не браузер, а блокнот.

Fiddler — это как раз таки debugging proxy, то есть является проксей через которую надо направлять запросы, которые хотим увидеть. То есть отдебажжить запросы скрипта через прокси не получится, зато нет остальных минусов HttpAnalyzer-а, а остальные плюшки присутствуют.

3
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x