пошаговое руководство по созданию проекта scrapy и извлечению данных

ЧАСТЬ 1, ЧАСТЬ 2, ЧАСТЬ 3, ЧАСТЬ 4, ЧАСТЬ 5

Это вторая часть учебника по scrapy. Если вы не читали первую часть, посетите страницу, чтобы узнать, как работает scrapy и как настроить среду.

В последнем уроке мы узнали, как создать простого паука (простой модуль Python). В этом уроке мы узнаем о

  1. Как создать скрап-проект?
  2. Как написать паука для обхода сайта и извлечения с него данных?

Зачем нам нужен проект scrapy, когда мы можем создать простой файл Python и извлечь данные, как мы делали в части 1? На самом деле это хороший вопрос. Причина в том, что проект scrapy предлагает множество функций, таких как постобработка данных, дедупликация и т. д. Мы подробно рассмотрим их в следующих руководствах.

Создание проекта Scrapy

TL:DR: Репозиторий github для учебника здесь

Убедитесь, что у вас установлен скрап

$ scrapy version
2.6.1

если не установить scrapy через

$ pip install scrapy

Теперь мы можем создать проект

$ scrapy startproject quotesspider

Это создаст следующую структуру

Вам не нужно ни о чем беспокоиться прямо сейчас, кроме spiders папок, куда вы будете помещать свой код пауков. Давайте двигаться дальше.

Первый паук в нашем паучьем проекте

Пауки — это определяемые вами классы Python, которые Scrapy использует для сбора информации с веб-сайта (или группы веб-сайтов). Они должны создать подкласс Spider и определить исходные запросы и способы анализа загруженного содержимого страницы для извлечения данных.

Поместите следующий код в quotesspider/spiders/quotes_spiders.py

import scrapy


class QuotesSpider(scrapy.Spider):
    name = "quotes"

    start_urls =['https://quotes.toscrape.com/']

    def parse(self, response):
        with open('quotes.html', 'wb') as f:
            f.write(response.body)
        self.log(f'Saved file quotes.html')

Как видите, наш Spider является подклассом scrapy.Spider и определяет некоторые атрибуты и методы:

  • name — имя паука (уникальное для каждого класса пауков)

start_urls — из этого атрибута будет ползать паук. Это может быть список URL-адресов

parse — метод обратного вызова по умолчанию для response . HTML-ответ (вся веб-страница) для start_urls будет загружен внутренней программой scrapy и передан в качестве аргумента этому методу.

Как казнить паука

Чтобы запустить паука, вы должны находиться внутри каталога проекта.

$ cd quotesspider
# scrapy crawl <spider_name>
$ scrapy crawl quotes

Пример вывода

вы можете видеть, что паук открылся, начал сканировать и создал новый файл quotes.html в текущем каталоге. По сути, мы загрузили html в файл. Теперь давайте переключим передачу и посмотрим, как извлечь данные с помощью scrapy.

Как извлечь данные?

Лучший способ научиться извлекать данные с помощью Scrapy — попробовать селекторы с помощью оболочки Scrapy.

Оболочка Scrapy — это интерактивная оболочка, в которой вы можете очень быстро попробовать и отладить код парсинга, не запуская паука. Он предназначен для тестирования кода извлечения данных, но на самом деле вы можете использовать его для тестирования любого кода, поскольку это также обычная оболочка Python.

Бегать

$ scrapy shell 'https://quotes.toscrape.com'

Используя оболочку, вы можете узнать и отладить, как извлекать данные

>>> response
<200 https://quotes.toscrape.com/>

Попробуйте распечатать все содержимое веб-страницы

>>> response.text

Вы можете попробовать выбрать любые элементы с помощью Xpath

>>> response.xpath('//title')
[<Selector xpath='//title' data='<title>Quotes to Scrape</title>'>]
>>> response.xpath('//title/text()').get()
'Quotes to Scrape'

что такое XPath?

XPath определяется как XML-путь. Это синтаксис или язык для поиска любого элемента на веб-странице с использованием выражения пути XML. XPath используется для поиска местоположения любого элемента на веб-странице с использованием структуры HTML DOM. Типичное выражение Xpath для извлечения любого элемента с веб-страницы будет

//element[@attr_key="attr_value"]
//element[@attr_key="attr_value"]/text() # if you want text 

например, рассмотрим следующий HTML-код

<html>
<span class="test">Hello</span>
</html>

если вы хотите извлечь Hello из приведенного выше HTML, `xpath` будет

# //element[@attr_key="attr_value"]/text() -> format
//span[@class="test"]/text()

Мы не будем подробно рассматривать XPath здесь, но вы можете прочитать больше об использовании XPath с селекторами Scrapy здесь.

Извлечение данных — цитаты и имя автора

Каждая цитата в https://quotes.toscrape.com представлена ​​элементами HTML, которые выглядят следующим образом:

<div class="quote">
    <span class="text">“The world as we have created it is a process of our
    thinking. It cannot be changed without changing our thinking.”</span>
    <span>
        by <small class="author">Albert Einstein</small>
        <a href="/author/Albert-Einstein">(about)</a>
    </span>
    <div class="tags">
        Tags:
        <a class="tag" href="/tag/change/page/1/">change</a>
        <a class="tag" href="/tag/deep-thoughts/page/1/">deep-thoughts</a>
        <a class="tag" href="/tag/thinking/page/1/">thinking</a>
        <a class="tag" href="/tag/world/page/1/">world</a>
    </div>
</div>

Вы можете найти это, наведя курсор на любую цитату и щелкнув правой кнопкой мыши -> проверить

Давайте откроем scrapy shell и немного поиграем, чтобы узнать, как извлечь нужные нам данные:

$ scrapy shell 'https://quotes.toscrape.com'

Сначала нам нужно выбрать весь элемент quote, затем мы можем извлечь цитату и имя автора.

выражение xpath для выбора элемента quote

>>> response.xpath('//div[@class="quote"]')

Результатом выполнения response.xpath(‘//div[@class=”quote”]’) является похожий на список объект с именем SelectorList, который представляет собой список объектов Selector, обертывающих элементы XML/HTML и позволяющих выполнять дополнительные запросы для детализации выбора или извлечения данные.

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

>> quote = response.xpath('//div[@class="quote"]')[0]
>> quote
<Selector xpath='//div[@class="quote"]' data='<div class="quote" itemscope itemtype...'>

Теперь давайте извлечем text, author из этой цитаты, используя только что созданный объект quote:

>> quote.xpath('span/text()').get()  # xpath to get quotes
'“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”'
>> quote.xpath('span/small/text()').get()  # xpath to get the author
'Albert Einstein'

Выяснив, как извлечь каждый бит, теперь мы можем перебрать все элементы кавычек и объединить их в словарь Python.

Полный код нашего паука

Интеграция вышеуказанной логики в наш файл quotesspider/spiders/quotes_spiders.py. Пожалуйста, обновите файл до следующего кода

Запустить паука

$ scrapy crawl quotes -o quotes.json

Если вы запустите этот паук, он выведет извлеченные данные вместе с журналом и сохранит данные в quotes.json:

В этом уроке мы просканировали данные только с первой страницы. В следующем уроке мы увидим, как сканировать несколько страниц с помощью scrapy.

Удачной разборки!! 🕷

Пожалуйста, оставьте комментарий, если у вас возникнут какие-либо проблемы.

ЧАСТЬ 1, ЧАСТЬ 2, ЧАСТЬ 3, ЧАСТЬ 4, ЧАСТЬ 5