Grab: различия между версиями
Содержимое удалено Содержимое добавлено
Oleg4280 (обсуждение | вклад) →Под Windows: Windows |
Oleg4280 (обсуждение | вклад) оформление |
||
Строка 1:
Основные области использования Grab:
* Извлечение данных с веб-сайтов (site scraping)
* Работа с сетевыми API
* Автоматизация работы с веб-сайтами, например, регистратор профилей на каком-либо сайте
Grab состоит из двух частей:
* Главный интерфейс Grab для создания сетевого запроса и работы с его результатом. Этот интерфейс удобно использовать в простых скриптах, где не нужна большая многопоточность, или непосредственно в python-консоли.
* Интерфейс Spider, позволяющий разрабатывать асинхронные парсеры. Этот интерфейс позволяет, во-первых, более строго описать логику парсера, во-вторых, разрабатывать парсеры с большим числом сетевых потоков.
= Установка =
Автор библиотеки рекомендует сначала установить зависимость, а потом уже саму библиотеку. Grab нуждается в двух библиотеках: lxml и pycurl.
==
Есть некоторые особенности для установки под 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>
==
В терминале написать.
<code>sudo easy_install lxml</code><br>
Строка 27 ⟶ 29 :
<code>sudo easy_install pycurl</code>
==
<code>pip install pycurl lxml</code><br>
<code>pip install Grab</code>
Строка 43 ⟶ 45 :
# Указываете адрес, куда пройдет программа
Что в результате
== Поиск на странице ==
<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]] или встроенный модуль анализа элементов в браузерах.
== Получаем линк ==
Если
<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 - может появиться при попытке подключения. Может означать, что исходящий запрос заблокирован вашим провайдером. Часто возникает при множественных запросах на разные домены.
|