Створення веб павука з Python та Scrapy

5 хв. читання

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: 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, як найкращий інструмент в своєму класі. Також раджу ознайомитись з документацією. Дякую за увагу.

Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Codeguida 6.2K
Приєднався: 7 місяців тому
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація