Рубрики
Без рубрики

Гусеничный, правила и Linkextractor – 04 – Python Scraphy Учебник для начинающих

Оригинальный пост Python Scraphy Trouorial для начинающих – 04 – гусеничный, правила и Linkextractor … Помечено Python, Scrapy, учебник.

Оригинальный пост Python Scraphy Учебник для начинающих – 04 – гусеничный, правила и Linkextractor

В нашем последнем уроке Как перейти на следующую страницу Мы сбрасывали весь сайт до последней книги. Но сегодня мы собираемся изучать инструмент, который будет проще сделать наши веб-канализационные задачи.

Мы говорим о Crawlspider.

В этом посте вы узнаете, как:

  • Как использовать новый паук: CrawlSpider
  • Какие правила и Linkextractor
  • Скапел весь сайт без усилий

Вы готовы?

Наш игровой план

Каждая задача, которую мы сделали до сих пор, помог нам с двумя вещами: получать необходимые URL или извлекать информацию.

Мы извлекли частичные URL-адреса, манипулировали на них, добавляли к базовому URL-адресу, чтобы создать абсолютный URL-адрес, и пока он работал, это было слишком много. Ну, может быть, не слишком много, так как это было несколько строк кода, но мы можем сделать это проще.

Способ проще.

Здесь, опять же, мы собираемся использовать две части кода. Один, чтобы получить URL, а другой, чтобы извлечь информацию.

Как мы собираемся использовать ту же структуру, мы не должны делать никакой модификации этого. Мы собираемся улучшить способ извлечения URL-адресов.

Мы собираемся сделать это таким проще, вы не поверите.

Я говорю о новом пауке: Crawlspider.

Новый паук: Crawlspider

Мы подбираем его с последнего урока. Это наш Текущий паук :

# -*- coding: utf-8 -*-
import scrapy


class SpiderSpider(scrapy.Spider):
    name = 'spider'
    allowed_domains = ['books.toscrape.com']
    start_urls = ['http://books.toscrape.com/']
    base_url = 'http://books.toscrape.com/'

    def parse(self, response):
        all_books = response.xpath('//article[@class="product_pod"]')

        for book in all_books:
            book_url = book.xpath('.//h3/a/@href').extract_first()

            if 'catalogue/' not in book_url:
                book_url = 'catalogue/' + book_url

            book_url = self.base_url + book_url

            yield scrapy.Request(book_url, callback=self.parse_book)

        next_page_partial_url = response.xpath(
            '//li[@class="next"]/a/@href').extract_first()

        if next_page_partial_url:
            if 'catalogue/' not in next_page_partial_url:
                next_page_partial_url = "catalogue/" + next_page_partial_url

            next_page_url = self.base_url + next_page_partial_url
            yield scrapy.Request(next_page_url, callback=self.parse)

    def parse_book(self, response):
        title = response.xpath('//div/h1/text()').extract_first()

        relative_image = response.xpath(
            '//div[@class="item active"]/img/@src').extract_first().replace('../..', '')
        final_image = self.base_url + relative_image

        price = response.xpath(
            '//div[contains(@class, "product_main")]/p[@class="price_color"]/text()').extract_first()
        stock = response.xpath(
            '//div[contains(@class, "product_main")]/p[contains(@class, "instock")]/text()').extract()[1].strip()
        stars = response.xpath(
            '//div/p[contains(@class, "star-rating")]/@class').extract_first().replace('star-rating ', '')
        description = response.xpath(
            '//div[@id="product_description"]/following-sibling::p/text()').extract_first()
        upc = response.xpath(
            '//table[@class="table table-striped"]/tr[1]/td/text()').extract_first()
        price_excl_tax = response.xpath(
            '//table[@class="table table-striped"]/tr[3]/td/text()').extract_first()
        price_inc_tax = response.xpath(
            '//table[@class="table table-striped"]/tr[4]/td/text()').extract_first()
        tax = response.xpath(
            '//table[@class="table table-striped"]/tr[5]/td/text()').extract_first()

        yield {
            'Title': title,
            'Image': final_image,
            'Price': price,
            'Stock': stock,
            'Stars': stars,
            'Description': description,
            'Upc': upc,
            'Price after tax': price_excl_tax,
            'Price incl tax': price_inc_tax,
            'Tax': tax,
        }

Вау … анализ Метод слишком грязный … Прошу прощения! Удалить его, пожалуйста.

Нет, я не шучу. Удалить всю функцию.

Помните, что мы собираемся упростить добычу URL? Удалите, что Goddamn Big анализ Функция сейчас ..

Проверьте главный класс Spiderspider. Мы насуждаем Снапировка Паук. Мы не хотим этого паука, это слишком глупо! Таким образом, вместо этого мы должны использовать CrawlSpider. Перейдите к вершине импорта и импортируйте CrawlSpider из Scrapy Spiders. И сделать ваш паукник наследует это:

from scrapy.spiders import CrawlSpider


class SpiderSpider(CrawlSpider):

Лучше!

Но … помните, что паук всегда называет анализ Способ начать читать код? Ну, не этот.

Здесь вместо того, чтобы искать анализ Метод, мы можем попросить этого паука делать то, что мы хотим. Но чтобы сделать это, нам нужно установить правила земли, верно?

Правила и Linkextractor.

CrawlSpider помимо того же атрибута, что и обычный паук, имеет новый атрибут: правила Отказ

«Правила» – это список одного или нескольких объектов правил, где каждое правило определяет один тип поведения для ползания сайта.

Кроме того, мы собираемся использовать Linkextractor: Объект, который определяет, как ссылки будут извлечены на каждой поползке.

Правила устанавливают поведение того, как он собирается ползти на сайт и Linkextractor, как будут извлечены ссылки. Но лучше, если мы видим, как это работает, верно? Давайте импортируем правило и Linkextractor, а затем определите правила:

from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor


class SpiderSpider(CrawlSpider):
    name = 'spider'
    allowed_domains = ['books.toscrape.com']
    start_urls = ['http://books.toscrape.com/']
    base_url = 'http://books.toscrape.com/'

    rules = [Rule(LinkExtractor(allow='catalogue/'),
                  callback='parse_filter_book', follow=True)]

Мы импортируем ресурсы, и мы создаем одно правило: В этом правиле мы собираемся установить, как будут извлечены ссылки, откуда и что с ними делать.

Сначала мы устанавливаем Разрешить = ‘Каталог/’ Отказ Теперь, если URL не имеет «каталога/» в этом, мы даже не будем обработать его. Путь лучше, чем если бы мы использовали раньше, верно?

У нас также есть Перезвоните : Обратный вызов в программировании – это то, что мы делаем после завершения текущего процесса. В этом случае это означает «после получения действительного URL, вызовите Parse_filter_book метод.

И Следуйте за Просто указывает, следует ли следовать ссылки из каждого ответа. Как мы устанавливаем его правда, мы собираемся получить какие-либо вложенные URL. Весь сайт.

Теперь изменить parse_book к parse_filter_book и запустить код!

Ох … Мы получили ошибку:

ATTRUTEERROR: «NONETYPE» объект не имеет атрибута «заменить»

Конечно: мы извлекаем каждый URL в код! Не только книги, но и пагинация (Page-1.HTML, Page-2.HTML, и т. Д.) и каждая URL-адресов находит паук.

Мы должны использовать parse_filter_book Способ только если страница является действительным URL книги!

Фильтрация URL-адресов

Внутри parse_filter_book Мы собираемся выполнить небольшую проверку: если URL является URL-адресом книги, извлечь данные. Если нет, ничего не делай.

Но Как мы знаем, принадлежит ли URL-адрес книги или другому URL?

Ну давайте проверим один: Открыть и не книжный URL, например

Теперь нам нужно искать элемент из книг, которые не в URL-адресах без книги. Например, я заметил, что книги имеют product_gallery сорт:

Мы можем использовать это, чтобы отделить URL-адреса книги из URL-адресов без книги!

Измените свой код, как это:

    def parse_filter_book(self, response):
        exists = response.xpath('//div[@id="product_gallery"]').extract_first()
        if exists:
            title = response.xpath('//div/h1/text()').extract_first()

            relative_image = response.xpath(
                '//div[@class="item active"]/img/@src').extract_first()
            final_image = self.base_url + relative_image.replace('../..', '')

            price = response.xpath(
                '//div[contains(@class, "product_main")]/p[@class="price_color"]/text()').extract_first()
            stock = response.xpath(
                '//div[contains(@class, "product_main")]/p[contains(@class, "instock")]/text()').extract()[1].strip()
            stars = response.xpath(
                '//div/p[contains(@class, "star-rating")]/@class').extract_first().replace('star-rating ', '')
            description = response.xpath(
                '//div[@id="product_description"]/following-sibling::p/text()').extract_first()
            upc = response.xpath(
                '//table[@class="table table-striped"]/tr[1]/td/text()').extract_first()
            price_excl_tax = response.xpath(
                '//table[@class="table table-striped"]/tr[3]/td/text()').extract_first()
            price_inc_tax = response.xpath(
                '//table[@class="table table-striped"]/tr[4]/td/text()').extract_first()
            tax = response.xpath(
                '//table[@class="table table-striped"]/tr[5]/td/text()').extract_first()

            yield {
                'Title': title,
                'Image': final_image,
                'Price': price,
                'Stock': stock,
                'Stars': stars,
                'Description': description,
                'Upc': upc,
                'Price after tax': price_excl_tax,
                'Price incl tax': price_inc_tax,
                'Tax': tax,
            }

        else:
            print(response.url)

Ключ – первые две строки: мы пытаемся получить Div с классом «Product_Gallery». Если он существует, мы разбираем URL. Если нет, мы просто распечатаем его.

Давайте запустим код сейчас …

И наши тысячи книг там! Здорово!

Заключение

Сегодня мы узнали, как:

  • Гусеничные работы
  • Установить правила и Linkextractor
  • Чтобы извлечь каждый URL на сайте
  • Что мы должны отфильтровать URL-адреса, полученные для извлечения данных из книжных URL и Нет каждого URL

Это был еще один шаг в вашем сетевом соскоре обучения, это был отличный скачок.

Использование Craillsspiders поможет вам много упростить ваш код, как вы видели в этом уроке.

Это был простой пример, но что если вместо книг у нас есть книги, музыкальные инструменты, еда и т. Д., как в Amazon и eBay? Без Craillsspiders было бы безумно. Выполнимый, но безумный. Вы можете попробовать!

У вас есть базовое понимание сейчас от Scrapy. Теперь нам нужно идти глубже. На Следующий урок Мы узнаем о трубопроводах и предметах.

Но до этого …

Упражнение

Прямо сейчас вы знаете, как получить URL-адреса, необходимые с помощью Spider и CrawlSpider, как извлечь данные, используя XPath и как дать информацию в файл.

Теперь пришло время работать самостоятельно! Ищите простой веб-сайт для лома и попробуйте ловить его самостоятельно.

Вы можете использовать помощь, такую как поиск прошлых уроков, поиск Google, глядя в Струпкая документация , так далее. Но вам нужно сделать это самостоятельно.

После этого оставьте комментарий здесь с сайтом и вашим кодом, чтобы все могли видеть, как вам удалось сделать это самостоятельно и как вы гордитесь!

Мои учебные видеоролики YouTube

Окончательный код на GitHub

Добраться до меня в Twitter

Предыдущий урок: 03 – Как перейти на следующую страницу

Оригинал: “https://dev.to/davidmm1707/crawler-rules-and-linkextractor-04-python-scrapy-tutorial-for-beginners-3g4d”