CoderCastrov logo
CoderCastrov
Парсер

Изучение Scrapy в подробностях

Изучение Scrapy в подробностях
просмотров
7 мин чтение
#Парсер

Что такое Scrapy?

Определение:

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

Scrapy - это полноценный инструмент для загрузки веб-страниц, обработки и сохранения данных в базах данных.

Scrapy - это приложение для обхода веб-сайтов или веб-страниц и извлечения структурированных данных, которые могут быть использованы для широкого спектра полезных приложений, таких как data mining, обработка информации или историческое архивирование. Scrapy можно использовать для работы с API и для общего парсинга.

Два основных концепта в Scrapy.

  • Обход (Crawling): это процесс программного получения и загрузки данных веб-страницы, извлечения ее гиперссылок и следования по ним.
  • Парсинг (Scraping): это процесс программного получения и загрузки данных веб-страницы, извлечения очень конкретной информации из нее.

Некоторые библиотеки Python для парсинга

  • BeautifulSoup
  • Requests
  • URLlib
  • Html.parser
  • LXML
  • Selectolax

Scrapy - это не библиотека, а фреймворк

o Между фреймворком и библиотекой есть огромная разница, давайте рассмотрим ее:

Scrapy работает на основе двух принципов: -

1. Асинхронность

2. Управление

1. Асинхронность:-

Ø Это самая важная и определяющая особенность Scrapy.

Ø Без асинхронности невозможно запустить несколько задач парсинга одновременно.

Ø Scrapy написан с использованием twisted, который является высокоуровневым сетевым фреймворком для Python.

Ø Асинхронность работает для подключения к нескольким URL-адресам и парсинга разных страниц.

2. Управление:-

Ø Процесс передачи данных требует полного контроля, и это возможно благодаря модульной структуре.

Ø Это является движущей силой Scrapy, которая обрабатывает запросы от парсеров и передает их модулю загрузки для выполнения.

Ø Затем мы получаем результат в виде элементов.

Ø В одно и то же время работает несколько потоков управления данными, чтобы выполнять модули в цикле и получать данные несколько раз с разных URL-адресов.

Преимущества Scrapy

  • Надежность
  • Параллельное выполнение
  • Надежность
  • Контроль
  • Скорость

Архитектура Scrapy

На следующем изображении мы можем увидеть архитектуру Scrapy.

Scrapy Architecture

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

2. Движок: Он отвечает за поток данных между всеми компонентами системы и вмешивается, когда происходит внезапное действие.

3. Планировщик: Он получает запросы от движка и сохраняет их для последующей обработки, когда движку они понадобятся.

4. Загрузчик: Он отвечает за загрузку веб-страниц и передачу их движку, который затем передает их паукам.

5. Элементы: Они отвечают за обработку элементов после их извлечения пауками. Элементы представляют данные, полученные с веб-сайтов. Они также выполняют типичные задачи, такие как очистка, проверка и сохранение данных, например, сохранение элемента в базе данных.

Есть еще один пример архитектуры Scrapy и рабочего процесса архитектуры.

Scrapy Workflow

Пауки

Пауки - это классы, в которых определяются пользовательские поведения, такие как сканирование и разбор страниц.

Как реализованы пауки в Scrapy

· Что может быть спарсено, то есть какой URL или веб-страницу вы хотите спарсить и получить данные с этой страницы.

· Нам нужно найти свой способ для сканирования веб-сайта или веб-страницы.

· И последнее - как мы разбираем, например, в каком формате мы хотим разобрать JSON, XML, HTML и т. д.

Типы пауков Scrapy

1. Scrapy.spider: Это самый простой паук, от которого должны наследоваться другие пауки. Этот паук не предоставляет никакой специальной функциональности. Он просто предоставляет реализацию метода запроса по умолчанию, который отправляет запросы к атрибуту start URL и вызывает метод parse для каждого результата.

a. Name: Определяет имя паука.

b. Allowed_domains: Список доменов, которые паук может сканировать.

c. Start_URLs: Список URL, с которых начинается сканирование паука.

d. Start_requests: Метод, который должен возвращать итерируемый объект с первыми запросами для сканирования паука.

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

Пример:

#импортируем библиотеки Scrapy

import scrapy

#создаем класс с именем вашего проекта

class CoolSpider(scrapy,spider):

#имя вашего проекта

name = ‘website.com’

#Домен, с которого вы извлекаете данные

allowed_domains = [‘Website.com’]

#URL, с которого начинается парсинг

start_urls= [‘http://www.website.com/page.html’,‘http://www.website.com/page2.html’,]

#функция для разбора данных и параметр response, который содержит данные вашей веб-страницы.

def parse(self, response):For h1 in response.xpath(‘//h1’).getall():

#yield замораживает вашу страницу, пока данные не будут извлечены

yield {“title”:h1}

#xpath помогает извлечь нужные данные с веб-страницы

for href in response.xpath(‘//a/@href’).getall():yield scrapy.request(response.urljoin(href),self.parse)

2. Generic Spider: Цель этого паука - предоставить удобный функционал для нескольких распространенных случаев использования Scrapy, таких как следование по всем ссылкам на сайте на основе определенных правил или вызов карт сайта или разбор XML или CSV данных.

Scrapy имеет четыре различных типа общих пауков

a. CrawlSpider:- Следует по всем ссылкам на сайте на основе определенных правил.

b. XMLFeedSpider:- Разбирает XML-ленты, перебирая узлы.

c. CSVFeedSpider:- Разбирает CSV-ленты, перебирая строки.

d. SiteMapSpider:- Обходит сайт, обнаруживая URL-адреса с помощью карт сайта.

Crawl Spider

1. Rules:- список одного или нескольких объектов правил

2. Rule:- Определяет поведение при обходе сайта

3. Parse_start_URL:- Этот метод вызывается для ответов start_URLs.

4. Link_extractor:- Определяет, как будут извлекаться ссылки из каждой просмотренной страницы.

Пример:-

#import scrapy library

Импорт scrapy

Импорт библиотеки scrapy для создания паука и задания правил

from scrapy.spiders import CrawlSpider, Rule

Эта библиотека извлекает все ссылки, найденные на веб-сайте или веб-странице

from scrapy.linkextractors import LinkExtractor

Класс проекта

class CoolSpider(CrawlSpider):

Название проекта

name = 'website.com'

Веб-сайт, с которого мы извлекаем данные

allowed_domains = ['website.com']

URL, с которого мы начинаем поиск и извлечение данных

start_urls = ['http://www.website.com/page.html', 'http://www.website.com/page2.html']

Правила, которые указывают пауку, что мы хотим и как

rules = (Rule(LinkExtractor(allow=('product\.php', )), callback='parse_item'),)

Класс парсера для обработки HTML-страницы

def parse_item(self, response):
    item = scrapy.Item()
    item['name'] = response.xpath('//td[@id="prod_name"]/text()').get()
    item['link_text'] = response.meta['link_text']
    return item

XMLFeedSpider

XMLFeedSpider [source] XMLFeedSpider предназначен для разбора XML-лент путем итерации через них по определенному имени узла. Итератор может быть выбран из internodes, XML и HTML.

Пример:

#Импорт библиотек для XMLFeedSpider

from scrapy.spiders import XMLFeedSpider

#Класс для вызова библиотеки

class ExampleSpider(XMLFeedSpider):

#Имя проекта

name = 'example'**#Взятие URL-адреса веб-сайта в переменную**namespaces = [('x', 'http://www.w3.org/TR/html4/'),]itertag = 'x:td'iterator = 'xml'

#Функция для получения данных с помощью XPath

def parse_node(self, response, node):self.logger.debug(node.xpath('text()').extract_first())

CSVFeedSpider

1. Delimiter:- Представляет символ-разделитель для каждого поля в CSV. По умолчанию,

2. Quotechar:- Представляет символ-ограничителя для каждого поля в CSV. По умолчанию,

Headers:- Названия столбцов в CSV

Пример:

#import Scrapy

Импорт scarpy

#CSVSpider получает каждый файл в формате CSV и сохраняет данные

Из scarpy.spiders импортировать CSVFeedSpider

#Представляет запас определенного продукта в определенном месте

Из project.items импортировать ProductItem

#класс проекта

Класс CoolSpider(CSVSpider):

#название проекта

Name = ‘website.com’

#веб-сайт, с которого мы извлекаем данные

allowed_domains = [‘Website.com’]

# URL, с которого мы начинаем поиск и извлечение данных

start_urls= [ ‘http://www.website.com/products.csv’]

#разделитель - это символ запятой, который является полем

delimiter = ‘:’

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

quotechar = “ ’ “

#Заголовки содержат протоколо-специфическую информацию, которая появляется, когда отправляется запрос на соединение

headers = [‘products’ , ‘price’]

#Функция-парсер для разбора HTML-данных

def parse_row(self, response, row)item= ProductItem()item[‘product’] = row[‘product’]item[‘price’] = row[‘price’]return item

SiteMapSpider

1. Sitemap_URL:- Список URL-адресов, указывающих на карту сайта

2. Sitemap_rule:- [(‘/product/’,’prase_product’)]

3. Sitemap_follow:- список регулярных выражений карты сайта, которые должны быть прослежены.

4. Sitemap_alternate_links:- Альтернативные ссылки для конкретного URL-адреса

Sitemap_filter:- Фильтры для выбора записей карты сайта на основе атрибутов.

Пример:

#import Scrapy

Импорт scrapy

#SitemapSpider позволяет обходить сайт, обнаруживая URL-адреса с использованием карт сайта.

Из scrapy.spiders импортировать SitemapSpider

#класс проекта

Класс Coolspider(SitemapSpider):

#Sitemap URL, с которого мы получаем sitemapы

Sitemap_urls = ['http://www.website.com/sitemap.xml']

# Назначение правил, которым следует краулер

Sitemap_rules=[('/product/','parse_product'),('/prodcategory/', 'parse_prod_category')]

# Функция парсера

def parse_product(self, response):#парсинг каждого продукта
def parse_prod_category(self, response)#парсинг каждой категории продукта