Лайфхаки

Маленькие, полезные хитрости

Урок по Scrapy в python.

19.04.2022 в 05:38

Урок по Scrapy в python.

Синтаксический анализ (парсинг) сайтов хоть и не имеет прямого отношения к пространственным данным, но владение основами которого полезно любому, работающему с ними. В свете роста числа онлайн-ресурсов, публикующих открытые данные, ценность умения извлекать из них необходимую информацию многократно повышается. Приведём небольшой пример. Допустим, нам необходимо составить набор тематических карт, отражающих результаты Выборов Президента Российской Федерации 2012. Исходные данные можно получить на сайте ЦИК России . Однако, согласитесь, что непосредственно использовать данные, предоставляемые в таком виде, очень сложно. Плюс это усложняется тем, что данные по разным регионам расположены на разных страницах. Гораздо удобнее было бы, чтобы вся эта информация была представлена, например, в виде одного или нескольких структурированных CSV или XML файлов (в идеале, конечно было бы иметь еще и некоторый API, позволяющий выполнять запросы к таким ресурсам), однако зачастую формирование подобных файлов отдаётся на откуп конечному пользователю (почему так происходит - это вопрос отдельный). Именно проблеме создания таких вот аггрегированных наборов данных и посвещена данная статья. В связи с недавними событиями в качестве целевого сайта, который мы будем парсить, выбран сайт ДетскиеДомики.ру , а именно его раздел Детские учреждения . Предполагается, что информация, расположенная на этом сайте будет в ближайшее время очень востребованной.

Scrapy python документация. Scrapy Tutorial ¶

In this tutorial, we’ll assume that Scrapy is already installed on your system. If that’s not the case, see.

We are going to useas our example domain to scrape.

This tutorial will walk you through these tasks:

  1. Creating a new Scrapy project
  2. Defining the Items you will extract
  3. Writing ato crawl a site and extract
  4. Writing anto store the extracted Items

Scrapy is written in. If you’re new to the language you might want to start by getting an idea of what the language is like, to get the most out of Scrapy. If you’re already familiar with other languages, and want to learn Python quickly, we recommend. If you’re new to programming and want to start with Python, take a look at.

Creating a project

Before you start scraping, you will have set up a new Scrapy project. Enter a directory where you’d like to store your code and then run:

scrapy startproject tutorial

This will create a tutorial directory with the following contents:

tutorial/ scrapy.cfg tutorial/ __init__.py items.py pipelines.py settings.py spiders/ __init__.py …

These are basically:

    scrapy.cfg : the project configuration file tutorial/ : the project’s python module, you’ll later import your code from here. tutorial/items.py : the project’s items file. tutorial/pipelines.py : the project’s pipelines file. tutorial/settings.py : the project’s settings file. tutorial/spiders/ : a directory where you’ll later put your spiders.

Defining our Item

Itemsare containers that will be loaded with the scraped data; they work like simple python dicts but provide additional protecting against populating undeclared fields, to prevent typos.

We begin by modeling the item that we will use to hold the sites data obtained from dmoz.org, as we want to capture the name, url and description of the sites, we define fields for each of these three attributes. To do that, we edit items.py, found in the tutorial directory. Our Item class looks like this:

This may seem complicated at first, but defining the item allows you to use other handy components of Scrapy that need to know how your item looks like.

Scrapy python примеры. 1: Базовый поиск

Scraping состоит из двух этапов:

  • Извлечение данных с веб-страниц.

Создать поискового робота с нуля можно с помощью различных модулей и библиотек, которые предоставляет язык программирования, однако в дальнейшем – по мере роста программы – это может вызвать ряд проблем. К примеру, вам понадобится переформатировать извлечённые данные в CSV, XML или JSON. Также вы можете столкнуться с сайтами, для анализа которых необходимы специальные настройки и модели доступа.

Поэтому лучше сразу разработать робота на основе библиотеки, которая устраняет все эти потенциальные проблемы. Для этого в данном руководстве используются Python и  Scrapy .

Scrapy – одна из наиболее популярных и производительных библиотек Python для получения данных с веб-страниц, которая включает в себя большинство общих функциональных возможностей. Это значит, что вам не придётся самостоятельно прописывать многие функции. Scrapy позволяет быстро и без труда создать «веб-паука».

Пакет Scrapy (как и большинство других пакетов Python) можно найти в PyPI (Python Package Index, также известен как pip) – это поддерживаемый сообществом репозиторий для всех вышедших пакетов Python.

Если вы следовали одному из предложенных руководств (раздел Требования), пакетный менеджер pip уже установлен на вашу машину. Чтобы установить Scrapy, введите:

pip install scrapy

Примечание : Если во время установки у вас возникли проблемы или вы хотите установить Scrapy без помощи pip, обратитесь к официальной документации .

После установки создайте папку для проекта.

mkdir brickset-scraper

Откройте новый каталог:

cd brickset-scraper

Создайте файл для поискового робота по имени scraper.py. В этом файле будет храниться весь код «паука». Введите в терминал:

touch scraper.py

Также вы можете создать файл с помощью текстового редактора или графического файлового менеджера.

Для начала нужно создать базовый код робота, который будет основан на библиотеке Scrapy. Для этого создайте класс Python под названием scrapy.Spider, это базовый класс для поисковых роботов, предоставленный Scrapy. Этот класс имеет два обязательных атрибута:

  • name – название «паука».
  • start_urls – список ссылок на страницы, которые нужно проанализировать.

Откройте scrapy.py и добавьте следующий код:

import scrapy
class BrickSetSpider(scrapy.Spider):
name = "brickset_spider"
start_urls =

Рассмотрим этот код подробнее:

  • Первая строка импортирует scrapy, что позволяет использовать доступные классы библиотеки.
  • Строка class BrickSetSpider(scrapy.Spider) добавляет класс Spider из библиотеки Scrapy и создаёт подкласс BrickSetSpider. Подкласс – это, по сути, просто более узкий, специализированный вариант родительского класса. Класс Spider предоставляет методы для отслеживания URL-ов и извлечения данных с веб-страниц, но он не знает, где искать страницы и какие именно данные нужно извлечь. Чтобы передать классу недостающие данные, мы создали подкласс.
  • Имя поискового робота: brickset_spider.
  • Ссылка в конце кода – это ссылка на страницу, которую нужно просканировать. Если вы откроете её в браузере, вы увидите первую страницу результатов поиска наборов LEGO.

Scrapy python Tutorial. Scrapy Vs. BeautifulSoup

In this section, you will have an overview of one of the most popularly used web scraping tool called BeautifulSoup and its comparison to Scrapy.

Scrapy is a Python framework for web scraping that provides a complete package for developers without worrying about maintaining code.

Beautiful Soup is also widely used for web scraping. It is a Python package for parsing HTML and XML documents and extract data from them. It is available for Python 2.6+ and Python 3.

Here are some differences between them in a nutshell:

ScrapyBeautifulSoup
Functionality ---
Scrapy is the complete package for downloading web pages, processing them and save it in files and databasesBeautifulSoup is basically an HTML and XML parser and requires additional libraries such asrequests,urlib2to open URLs and store the result
Learning Curve ---
Scrapy is a powerhouse for web scraping and offers a lot of ways to scrape a web page. It requires more time to learn and understand how Scrapy works but once learned, eases the process of making web crawlers and running them from just one line of command. Becoming an expert in Scrapy might take some practice and time to learn all functionalities.BeautifulSoup is relatively easy to understand for newbies in programming and can get smaller tasks done in no time
Speed and Load ---
Scrapy can get big jobs done very easily. It can crawl a group of URLs in no more than a minute depending on the size of the group and does it very smoothly as it usesTwisterwhich works asynchronously (non-blocking) for concurrency.BeautifulSoup is used for simple scraping jobs with efficiency. It is slower than Scrapy if you do not usemultiprocessing.
Extending functionality ---
Scrapy provides Item pipelines that allow you to write functions in your spider that can process your data such as validating data, removing data and saving data to a database. It provides spider Contracts to test your spiders and allows you to create generic and deep crawlers as well. It allows you to manage a lot of variables such as retries, redirection and so on.If the project does not require much logic, BeautifulSoup is good for the job, but if you require much customization such as proxys, managing cookies, and data pipelines, Scrapy is the best option.

Scrapy python. Scrapy vs. Beautiful Soup

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

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

BeautifulSoup также широко используется для веб-скрапинга. Это пакет Python для парсинга документов в форматах HTML и XML и извлечения данных из них. Он доступен для Python 2.6+ и Python 3.

Вот основные отличия между ними:

Scrapy BeautifulSoup
Функциональность
Scrapy — это самый полный набор инструментов для загрузки веб-страниц, их обработки и сохранения в файлы и базы данныхBeautifulSoup — это в принципе просто парсер HTML и XML, требующий дополнительных библиотек, таких как requests и urlib2 для открытия ссылок и сохранения результатов.
Кривая обучения
Scrapy — это движущая сила веб-сканирования, предлагающая массу способов парсинга страниц. Обучение тому, как он работает, требует много времени, но после освоения процесс сканирования превращается в одну строку кода. Потребуется время, чтобы стать экспертом в Scrapy и изучить все его особенностиBeautifulSoup относительно прост для понимания новичкам в программировании и позволяет решать маленькие задачи за короткий срок.
Скорость и нагрузка
Scrapy с легкостью выполняет крупную по объему работу. Он может сканировать несколько ссылок одновременно менее чем за минуту в зависимости от общего количества. Это происходит плавно благодаря Twister, который работает асинхронно (без блокировки)BeautifulSoup используется для простого и эффективного парсинга. Он работает медленнее Scrapy, если не использоватьmultiprocessing.
Расширяемость
Scrapy предоставляет функциональностьItem pipelines, с помощью которой можно писать функции для веб-сканера. Они будут включать инструкции о том, как робот должен проверять, удалять и сохранять данные в базу данных.Spider Contractsиспользуются для проверки парсеров, благодаря чему можно создавать как базовые, так и глубокие парсеры. Он же позволяет настраивать множество переменных: повторные попытки, перенаправление и т. д.Если проект не предполагает большого количества логики, BeautifulSoup отлично для этого подходит, но если нужна настраиваемость, например прокси, управление куки и распределение данных, то Scrapy справляется лучше.

Scrapy учебник. Установка и создание проекта

Для начала установим scrapy. Он тянет довольно много сторонних зависимостей:

$ sudo apt-get install python-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev $ pip install Scrapy

После этого создадим проект:

$ scrapy startproject habr

И ниже он предлагает создать первого паука:

You can start your first spider with: cd habr scrapy genspider example example.com $ cd habr $ scrapy genspider HabrSpider habrahabr.ru

В итоге в каталоге spiders появился первый алгоритм паука с вот таким содержимым:

import scrapy class HabrspiderSpider(scrapy.Spider): name = 'HabrSpider' allowed_domains = start_urls = def parse(self, response): pass

У каждого такого паука есть имя, по которому мы будем его запускать, список доменов, на которые можно переходить и стартовый url.

Для запуска перейдём в каталог с scrapy.cfg и выполнимscrapy crawl HabrSpider. Предлагаю полностью разобрать вывод, т.к. в нём представлен функционал, который уже идёт “из коробки”. Первым делом - версии пакетов и текущие настройки. По умолчанию Scrapy учитывает файлrobots.txtиз-за настройкиROBOTSTXT_OBEY:

INFO: Scrapy 1.5.0 started (bot: habr) 2018-03-08 23:59:00 INFO: Versions: lxml 4.1.1.0, libxml2 2.9.7, cssselect 1.0.3, parsel 1.4.0, w3lib 1.19.0, Twisted 17.9.0, Python 3.6.3 (default, Oct 6 2017, 08:44:35) - , pyOpenSSL 17.5.0 (OpenSSL 1.1.0g 2 Nov 2017), cryptography 2.1.4, Platform Linux-4.13.0-32-generic-x86_64-with-LinuxMint-18.3-sylvia 2018-03-08 23:59:00 INFO: Overridden settings: {'BOT_NAME': 'habr', 'NEWSPIDER_MODULE': 'habr.spiders', 'ROBOTSTXT_OBEY': True, 'SPIDER_MODULES': }

Во-первых, это, которые вешаются на внутренние события Scrapy и позволяют дополнять поведение по умолчанию. Например, сбор статистики и потребление памяти:

INFO: Enabled extensions:

Во-вторых, список мидлварей, которые обеспечивают некоторые базовые вещи. Делятся на 2 типа: при скачивании и при обходе. Например, RedirectMiddleware выполняет расшифровку редиректов, а RetryMiddleware - повтор запроса в случае окончания таймаута. Вы можете дописать свои для установки JWT токена или эмуляции разных User-Agent, а ненужные - отключить. Кстати, по умолчанию в новом проекте создаётся пустой файлmiddlewares.py, в котором описаны методы для переопределения.

Scrapy parse. scrapy.Spider ¶

class scrapy.spiders.Spider

This is the simplest spider, and the one from which every other spider must inherit (including spiders that come bundled with Scrapy, as well as spiders that you write yourself). It doesn’t provide any special functionality. It just provides a defaultimplementation which sends requests from thespider attribute and calls the spider’s method parse for each of the resulting responses.

name

A string which defines the name for this spider. The spider name is how the spider is located (and instantiated) by Scrapy, so it must be unique. However, nothing prevents you from instantiating more than one instance of the same spider. This is the most important spider attribute and it’s required.

If the spider scrapes a single domain, a common practice is to name the spider after the domain, with or without the TLD . So, for example, a spider that crawls mywebsite.com would often be called mywebsite .

Note

In Python 2 this must be ASCII only.

allowed_domains

An optional list of strings containing domains that this spider is allowed to crawl. Requests for URLs not belonging to the domain names specified in this list (or their subdomains) won’t be followed ifis enabled.

Let’s say your target url is https://www.example.com/1.html , then add 'example.com' to the list.

start_urls

A list of URLs where the spider will begin to crawl from, when no particular URLs are specified. So, the first pages downloaded will be those listed here. The subsequentwill be generated successively from data contained in the start URLs.

custom_settings

A dictionary of settings that will be overridden from the project wide configuration when running this spider. It must be defined as a class attribute since the settings are updated before instantiation.

For a list of available built-in settings see:.

crawler

Crawlers encapsulate a lot of components in the project for their single entry access (such as extensions, middlewares, signals managers, etc). Seeto know more about them.

You probably won’t need to override this directly because the default implementation acts as a proxy to the __init__() method, calling it with the given argumentsargsand named argumentskwargs.

Nonetheless, this method sets theandattributes in the new instance so they can be accessed later inside the spider’s code.

Parameters:
  • crawler (instance) – crawler to which the spider will be bound
  • args ( list ) – arguments passed to the __init__() method
  • kwargs ( dict ) – keyword arguments passed to the __init__() method
start_requests ( )

This method must return an iterable with the first Requests to crawl for this spider. It is called by Scrapy when the spider is opened for scraping. Scrapy calls it only once, so it is safe to implementas a generator.

The default implementation generates Request(url, dont_filter=True) for each url in.

class MySpider ( scrapy . Spider ): name = 'myspider' def start_requests ( self ): return

parse ( response )

The parse method is in charge of processing the response and returning scraped data and/or more URLs to follow. Other Requests callbacks have the same requirements as theclass.

This method, as well as any other Request callback, must return an iterable ofand/or dicts orobjects.

Категории: Базовый поиск