Парсинг веб-сайтов с помощью Scrapy в Python (88/100 Дней Python)
Парсинг веб-сайтов - это процесс извлечения данных с веб-сайтов. Он может использоваться для различных целей, включая data mining, исследования и анализ. Scrapy - мощный и гибкий фреймворк для парсинга веб-сайтов, написанный на Python.
Установка Scrapy
Сначала вам нужно установить Scrapy. Вы можете сделать это с помощью pip, менеджера пакетов Python. Откройте командную строку или терминал и выполните следующую команду:
pip install scrapy
Создание проекта Scrapy
После установки Scrapy вы можете создать новый проект Scrapy. Чтобы создать новый проект, выполните следующую команду в командной строке или терминале:
scrapy startproject myproject
Это создаст новый каталог под названием myproject, который содержит основную структуру проекта Scrapy.
Создание паука
Пауки являются основным компонентом Scrapy. Паук - это класс Python, который определяет, как обходить веб-сайт и извлекать данные из него. Чтобы создать нового паука, перейдите в каталог вашего проекта и выполните следующую команду:
cd myproject
scrapy genspider myspider example.com
Это создаст нового паука с именем myspider, который настроен на обход веб-сайта example.com. Вы можете изменить код паука, чтобы определить, как извлекать данные из веб-сайта.
Определение правил для паука
В коде паука необходимо определить правила для парсинга веб-сайта. Для этого можно использовать методы start_urls
и parse
. Метод start_urls
определяет начальные URL-адреса для парсинга, а метод parse
определяет, как извлекать данные с веб-сайта:
import scrapy
class MyspiderSpider(scrapy.Spider):
name = 'myspider'
start_urls = ['https://example.com']
def parse(self, response, **kwargs):
title = response.css('title::text').extract_first()
yield {'title': title}
Запуск паука
После определения правил для паука можно запустить его с помощью следующей команды:
scrapy crawl myspider
Это запустит паука и начнет парсинг веб-сайта. Извлеченные данные будут выведены в консоль.
Сохранение данных
Если вы хотите сохранить извлеченные данные в файл, вы можете использовать встроенный экспортер Scrapy. Для этого добавьте следующие строки в файл settings.py
:
FEED_FORMAT = 'json'
FEED_URI = 'data.json'
Это сохранит извлеченные данные в файл с именем data.json
.
Расширенный парсинг
Scrapy предлагает множество расширенных функций для парсинга веб-страниц, включая поддержку cookies, user agents и прокси. Вы также можете использовать Scrapy с другими библиотеками Python, такими как BeautifulSoup и Pandas, для дальнейшей обработки и анализа извлеченных данных.
Парсинг quotes.toscrape.com
с помощью Scrapy
Мы можем извлекать информацию с веб-страницы на основе ее HTML. В качестве примера давайте рассмотрим Quotes to Scrape, на котором есть много цитат разных людей вместе с некоторыми атрибутами. Это отличная страница, на которой мы можем попрактиковаться в парсинге. Если вы перейдете к исходному коду страницы, вы можете найти ее HTML и все определенные в нем атрибуты. Вы можете сделать это, щелкнув правой кнопкой мыши на содержимом страницы и нажав кнопку Просмотреть исходный код страницы
.
После открытия исходного кода страницы вы можете заметить, что все цитаты находятся внутри элемента <div>
, который имеет атрибут class="quote"
. Таким образом, мы можем перебрать все цитаты, используя scrapy
.
Таким образом, паук будет выглядеть примерно так:
import scrapy
class MyspiderSpider(scrapy.Spider):
name = 'myspider'
start_urls = ['https://quotes.toscrape.com']
def parse(self, response, **kwargs):
for book in response.css('.quote'):
yield {
'text': book.css('.text::text').extract_first(),
'author': book.css('.author::text').extract_first(),
}
Он извлекает все элементы div
с классом .quote
, а затем возвращает другие поля, извлекая их из HTML и превращая их в значения словаря.
В этом примере мы извлекли текст
цитаты и автора
цитаты. Если вы посмотрите на приведенный выше HTML, автор всегда определяется внутри <span>
, который имеет атрибут класса author
, а сама цитата находится внутри <span>
, который имеет атрибут класса text
. Суффикс ::text
добавляется, чтобы убедиться, что мы извлекаем фактический текст внутри <span>
, а не сам <span>
.
После запуска кода с помощью scrapy crawl myspider
вы получите красивый JSONL со всем содержимым страницы:
[
{"text": "“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”", "author": "Albert Einstein"},
{"text": "“It is our choices, Harry, that show what we truly are, far more than our abilities.”", "author": "J.K. Rowling"},
{"text": "“There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”", "author": "Albert Einstein"},
{"text": "“The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”", "author": "Jane Austen"},
{"text": "“Imperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.”", "author": "Marilyn Monroe"},
{"text": "“Try not to become a man of success. Rather become a man of value.”", "author": "Albert Einstein"},
{"text": "“It is better to be hated for what you are than to be loved for what you are not.”", "author": "André Gide"},
{"text": "“I have not failed. I've just found 10,000 ways that won't work.”", "author": "Thomas A. Edison"},
{"text": "“A woman is like a tea bag; you never know how strong it is until it's in hot water.”", "author": "Eleanor Roosevelt"},
{"text": "“A day without sunshine is like, you know, night.”", "author": "Steve Martin"}
]
Что дальше?
- Если вам понравилась эта история, пожалуйста, подумайте о том, чтобы поаплодировать несколько раз (это действительно очень помогает!)
- Практическое занятие: Бесплатный курс по Python
- Полная серия: 100 дней Python
- Предыдущая тема: Мокирование и фикстуры в Python
- Следующая тема: Работа с листами Excel и CSV-файлами с использованием Pandas для обработки данных