Grab: различия между версиями

Содержимое удалено Содержимое добавлено
оформление
Строка 1:
grabGrab — это библиотека парсинга вебсайтов для языка [[Python]]. Обладает широким набором возможностей.
 
Основные области использования Grab:
* Извлечение данных с веб-сайтов (site scraping)
* Работа с сетевыми API
* Автоматизация работы с веб-сайтами, например, регистратор профилей на каком-либо сайте
 
Grab состоит из двух частей:
* Главный интерфейс Grab для создания сетевого запроса и работы с его результатом. Этот интерфейс удобно использовать в простых скриптах, где не нужна большая многопоточность, или непосредственно в python-консоли.
* Интерфейс Spider, позволяющий разрабатывать асинхронные парсеры. Этот интерфейс позволяет, во-первых, более строго описать логику парсера, во-вторых, разрабатывать парсеры с большим числом сетевых потоков.
 
 
= Установка =
Автор библиотеки рекомендует сначала установить зависимость, а потом уже саму библиотеку. Grab нуждается в двух библиотеках: lxml и pycurl.
 
== Под Windows ==
Есть некоторые особенности для установки под Windows. Зависимости лучше скачать с http://www.lfd.uci.edu/~gohlke/pythonlibs/<br>
Необходимо найти файл:
Строка 21 ⟶ 23 :
<code>C:\Python27\python.exe C:\Python27\Scripts\easy_install-2.7-script.py grab</code><br>
 
== Установка под Mac OS X ==
В терминале написать.
<code>sudo easy_install lxml</code><br>
Строка 27 ⟶ 29 :
<code>sudo easy_install pycurl</code>
 
== Установка под Linux ==
<code>pip install pycurl lxml</code><br>
<code>pip install Grab</code>
Строка 43 ⟶ 45 :
# Указываете адрес, куда пройдет программа
 
Что в результате произойдетпроизойдёт? grabGrab пройдетпройдёт по указанному адресу и создаст файл out.html отладки в корневой директории. Вы можете его открыть, это обычный html.
 
== Поиск на странице ==
<source lang="python">
Строка 51 ⟶ 54 :
g.search(u'яндекс')
</source>
 
Если текст будет найден, то ответ будет True.
 
Строка 60 ⟶ 64 :
print g.xpath_text('//*')
</source>
 
В результате вы получите весь текст со страницы Yandex.<br>
<source lang="python">
print g.xpath_text('//title')
</source>
 
Получите title страницы.
 
Часто требуется получения текста из одного элемента. Например, статус пользователя вконтакте или мониторинг цены товара (как промышленный шпион). Поставьте расширение для браузера firebug. Правой клавишей становитесь на тексте и выбираете Inspect element with Firebug.<br>
Строка 70 ⟶ 76 :
Многим новичкам непонятен, как работает XPath. Самый легкий вариант импортировать путь через Firebug, но в этом случае генерируется много мусора. XPath очень легкий, если понятен его принцип.<br>
XPath расшифровывается как XML Path Language.
 
<source lang="python">
print g.xpath_text('//*')
</source>
 
ЗвездочкаЗвёздочка означает импортировать весь текст.
 
<source lang="python">
print g.xpath_text('//div')
</source>
 
После двух слешей, вы можете указать из какого конкретно элемента импортировать. Если элемент пуст, то появится ошибка. Это не должно вас пугать, это не значит, что вы неправильно прописали синтаксис, это значит, что просто элемент пуст. Также еще важный момент xPath действует интеллектуально, он ищет элемент по всей странице. НайдетНайдёт даже если он в конце вебстраницы.
Вы можете конкретизировать элемент. Эта та самая часть, которая путает многих начинающих.
 
<source lang="python">
print g.xpath_text('//h1')
Строка 86 ⟶ 97 :
print g.xpath_text('//a[@class="post_title"]')
</source>
 
После двух слешей вы указываете сам элемент, ухо указывает на атрибут элемента. Например, в html коде написано так:
 
<source lang="python">
<div id="post_115825">
</source>
 
А в Грабе следовательно надо написать так:
 
<source lang="python">
print g.xpath_text('//div[@id="post_115825"]')
</source>
 
Если мы имеем дело с линком, значит вместо div пишем a. Если он имеет какой-то класс, то конкретизируем.
 
<source lang="python">
print g.xpath_text('//a[@class="post_title"]')
</source>
 
Значительную помощь нам оказывает [[w:Firebug|Firebug]] или встроенный модуль анализа элементов в браузерах.
 
== Получаем линк ==
Если приведенныйприведённый пример не сработает, это значит, что grab не может найти класс линка. Они часто меняются. Чтобы узнать новый класс, надо поставить расширение для браузера firebug. Правой клавишей становитесь на линк и выбираете Inspect element with Firebug.
 
<source lang="python">
from grab import Grab
Строка 110 ⟶ 129 :
print g.xpath('//a[@class="reference external"]').get('href')
</source>
 
Мы получим первый линк из класса reference external. <code>>>> /psf/license/</code><br>
Для получения всех линков, надо писать цикл.
 
== Парсинг файла ==
Допустим у вас есть уже несколько сохраненныхсохранённых веб-страниц, вам нужно их распарсить.
 
<source lang="python">
data = open('my-file.html').read()
g = Grab(data)
</source>
 
== Сообщения об ошибках ==
* 400 Bad Request - может появиться при попытке подключения. Может означать, что исходящий запрос заблокирован вашим провайдером. Часто возникает при множественных запросах на разные домены.