Оригинальный пост 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”