Scrapy - фреймворк для обходу сайтів та вилучення з них структурованих даних, які можуть використовуватися для широкого кола корисних застосувань: видобуток та обробка інформації чи історичне архівування.
Сьогодні ми коротко пройдемося по основам роботи з цим фрейморком. На свій Google не розраховуйте, але перший крок в цьому напрямку дана стаття вам дасть ;)
Встановлення
Залежності:
- Python 2.7
- lxml
- OpenSSL - встановлено за замовчуванням у всіх операційних системах окрім Windows
- pip або easy_install
Потім просто встановлюємо Scrapy за допомогою будь-якого менеджеру пакетів в python:
pip install Scrapy
або
easy_install Scrapy
Створення проекту та простий парсинг
Перед початком роботи, в потрібній вам директорії, виконуємо команду створення проекту:
scrapy startproject codeguidatutorial
Ця команда створить директорію codeguidatutorial з вмістом:
codeguidatutorial/
scrapy.cfg
codeguidatutorial/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
...
Де:
-
scrapy.cfg
- файл конфігурації проекту -
codeguidatutorial/
- python модуль, потім ви будете імпортувати ваш код з нього. -
codeguidatutorial/items.py
- items файл проекту. -
codeguidatutorial/pipelines.py
- pipelines файл проекту. -
codeguidatutorial/settings.py
- файл налаштувань проекту. -
codeguidatutorial/spiders/
- директорія, куди ви будете додавати ваших пошукових павуків.
Створимо найпростішого павука, який буде вибирати всі назви статей та їх URL на сторінці нашого архіву. Створимо файл codeguidatutorial/spiders/my_first_spider.py
та додамо до нього код:
import scrapy
class CodeguidaSpider(scrapy.Spider):
name = "cg"
allowed_domains = ["codeguida.com"]
start_urls = [
"http://codeguida.com/archive/"
]
def parse(self, response):
for item in response.xpath('/html/body/div[4]/section/div'):
title = item.xpath('a/h2/text()').extract()
link = item.xpath('a/@href').extract()
print title[0].encode('utf-8'), link[0].encode('utf-8')
Де name
- ім'я павука, start_urls
- список початкових URL для парсингу. Функція parse
викликається при парсингу, тут ви можете отримати потрібні вам дані зі сторінки та передати їх на обробку та збереження. В нашому випадку ми просто виводимо їх в консоль. Для отримання потрібних даних використовуємо XPath, наприклад за допомогою developer tools в chrome:
Отримуємо /html/body/div[4]/section/div[1]
, але щоб отримати список всіх наших div
з потрібними даними видаляємо індекс з нього в XPath/html/body/div[4]/section/div
. Потім ми проходимо по кожному div
і збираємо та виводимо заголовки та посилання в тілі циклу.
Виконуємо команду в директорії нашого проекту:
scrapy crawl cg
І бачимо результат:
В терміналі виводиться результат нашого парсингу та купа іншої корисної чи не дуже інформації.
Збереження результатів
Тепер давайте трохи ускладнимо нашу задачу, наприклад, ми хочемо отримати дані про автора статті. В codeguidatutorial/items.py
додаємо наш item
:
import scrapy
class CodeguidascrapyItem(scrapy.Item):
title = scrapy.Field()
url = scrapy.Field()
author = scrapy.Field()
Також новий код павука:
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors import LinkExtractor
from codeguidascrapy.items import CodeguidascrapyItem
class CodeguidaSpider(CrawlSpider):
name = "cg"
allowed_domains = ["codeguida.com"]
start_urls = [
"http://codeguida.com/archive/"
]
rules = [Rule(LinkExtractor(allow=['/post/[1-9]/']), 'parse_post')]
def parse_post(self, response):
post = CodeguidascrapyItem()
post['url'] = response.url
title = response.xpath('/html/body/div[4]/div/section/h1/text()').extract()
author = response.xpath('/html/body/div[4]/div/section/div[1]/div[1]/a/text()').extract()
post['title'] = title[0]
post['author'] = author[0]
return post
Що змінилося? Тепер ми наслідуємо CrawlSpider
, який шукає певні посилання на початковій сторінці, та отримує інформацію з них. В rules
вказуємо список правил з регулярними вираженнями, при збіганні з якими виконується функція, яку ми задали. У нас це будуть посилання на статті від 1 до 9. В parse_post
ми ініціалізуємо наш item
та повертаємо його з присвоєними даними, все інше написано по тому ж принципу, що і в першому прикладі.
Тепер виконуємо команду:
scrapy crawl cg -o scraped_data.xml -t xml
За допомогою неї запускається наш павук, та зберігається результат в файл scraped_data.xml
. Команда -o
- назва файлу для збереження, -t
тип файлу. Список всіх доступних форматів, які йдуть з фреймворком.
Результат:
<items><item><url>http://codeguida.com/post/8/</url><author> alt+255</author><title>Hydros - розумна система зрошення економить воду і час</title></item><item><url>http://codeguida.com/post/6/</url><author> alt+255</author><title>Apple знову зливає дані користувачів. Китайське розслідування.</title></item><item><url>http://codeguida.com/post/3/</url><author> boomey</author><title>Dell почав приймати Bitcoin </title></item><item><url>http://codeguida.com/post/7/</url><author> alt+255</author><title> З'явилося нове енергозберігаюче скло</title></item><item><url>http://codeguida.com/post/1/</url><author> comandante</author><title>Hello World!</title></item></items>
Висновок
Scrapy - чудовий інструмент, як для простого парсингу сайтів, так і для складних та комплексних рішень. Його структуру дуже схожа на структуру Django, що явно є плюсом. Він швидкий (завдяки twisted) та дуже легко розширюється. Фреймворк має дуже багато прикладів та готових розширень. Тому рекомендую всім, хто знайомий з python, як найкращий інструмент в своєму класі. Також раджу ознайомитись з документацією. Дякую за увагу.
Ще немає коментарів