Scrapy: Скачать страницу — подробное руководство и примеры кода на Python

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

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

Основы Scrapy для скачивания страниц

Что такое Scrapy и зачем он нужен

Scrapy – это асинхронный фреймворк для веб-скрапинга, написанный на Python. Он предоставляет все необходимые инструменты для скачивания, обработки и сохранения данных с веб-сайтов. Scrapy позволяет:

  • Автоматически обходить сайты по заданным правилам.

  • Извлекать данные с помощью селекторов XPath и CSS.

  • Обрабатывать динамический контент (с использованием дополнительных библиотек).

  • Сохранять данные в различных форматах (JSON, CSV, XML и др.).

  • Настраивать запросы (заголовки, cookies, прокси).

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

Установка Scrapy и создание первого проекта

Перед началом работы необходимо установить Scrapy. Для этого используйте pip:

pip install scrapy

После установки создайте новый проект Scrapy:

scrapy startproject myproject
cd myproject

Эта команда создаст структуру проекта с необходимыми файлами и каталогами. Основные компоненты проекта:

  • scrapy.cfg: Файл конфигурации проекта.

  • myproject/: Каталог проекта.

  • myproject/spiders/: Каталог для хранения spider’ов.

  • myproject/items.py: Определение структуры данных (items).

  • myproject/middlewares.py: Middleware для обработки запросов и ответов.

  • myproject/pipelines.py: Pipelines для обработки извлеченных данных.

  • myproject/settings.py: Настройки проекта.

Создание вашего первого паука (Spider)

Написание Spider для скачивания одной страницы

Spider – это класс, определяющий, как Scrapy будет обходить сайт и извлекать данные. Создадим простой spider для скачивания содержимого главной страницы example.com. В каталоге myproject/spiders/ создайте файл example_spider.py со следующим содержанием:

import scrapy

class ExampleSpider(scrapy.Spider):
    name = "example"
    start_urls = ['http://www.example.com']

    def parse(self, response):
        filename = 'example.html'
        with open(filename, 'wb') as f:
            f.write(response.body)
        self.log(f'Saved file {filename}')

Этот spider определяет имя (name), список URL’ов для начала обхода (start_urls) и метод parse, который вызывается для обработки каждого скачанного ответа.

Чтобы запустить spider, используйте команду:

scrapy crawl example

Эта команда запустит spider example и сохранит HTML-код главной страницы example.com в файл example.html.

Извлечение данных с помощью селекторов (XPath и CSS)

Scrapy использует селекторы XPath и CSS для извлечения данных из HTML-кода. Метод response.xpath() позволяет использовать XPath-выражения, а response.css() – CSS-селекторы.

Например, чтобы извлечь заголовок страницы, можно использовать следующий код:

import scrapy

class ExampleSpider(scrapy.Spider):
    name = "example"
    start_urls = ['http://www.example.com']

    def parse(self, response):
        title = response.xpath('//title/text()').get()
        self.log(f'Page title: {title}')

Этот код извлекает текст из элемента <title> и выводит его в лог.

CSS-селекторы работают аналогично:

title = response.css('title::text').get()

get() возвращает первый найденный результат. Для получения всех результатов используйте getall().

Обработка и сохранение скачанного контента

Парсинг HTML и извлечение нужной информации

После скачивания страницы необходимо извлечь из нее нужную информацию. Для этого используются селекторы XPath и CSS, как показано выше. Можно комбинировать несколько селекторов для получения более точных результатов.

Реклама

Рассмотрим пример извлечения всех ссылок с главной страницы:

import scrapy

class ExampleSpider(scrapy.Spider):
    name = "example"
    start_urls = ['http://www.example.com']

    def parse(self, response):
        for link in response.css('a::attr(href)').getall():
            self.log(f'Found link: {link}')

Этот код извлекает атрибут href всех элементов <a> и выводит их в лог.

Сохранение данных в файлы (JSON, CSV) с помощью Pipelines

После извлечения данных их необходимо сохранить. Scrapy предоставляет механизм Pipelines для обработки и сохранения данных. Создайте файл items.py и определите структуру данных:

import scrapy

class MyItem(scrapy.Item):
    title = scrapy.Field()
    link = scrapy.Field()

Затем в spider’е создайте экземпляры MyItem и заполните их данными:

import scrapy
from myproject.items import MyItem

class ExampleSpider(scrapy.Spider):
    name = "example"
    start_urls = ['http://www.example.com']

    def parse(self, response):
        item = MyItem()
        item['title'] = response.css('title::text').get()
        item['link'] = response.url
        yield item

В файле pipelines.py определите pipeline для сохранения данных в JSON-файл:

import json

class JsonWriterPipeline:
    def __init__(self):
        self.file = open('items.json', 'w')

    def process_item(self, item, spider):
        line = json.dumps(dict(item)) + "\n"
        self.file.write(line)
        return item

    def close_spider(self, spider):
        self.file.close()

В settings.py активируйте pipeline:

ITEM_PIPELINES = {
    'myproject.pipelines.JsonWriterPipeline': 300,
}

Теперь при запуске spider’а извлеченные данные будут сохранены в файл items.json.

Продвинутые техники скачивания страниц

Работа с динамическим контентом и JavaScript

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

  • Selenium: Автоматизированный браузер, который позволяет выполнять JavaScript и получать HTML-код после загрузки динамического контента.

  • Splash: Специализированный HTTP-сервис, который рендерит JavaScript и предоставляет API для взаимодействия с ним.

Пример использования Selenium:

from selenium import webdriver
import scrapy

class ExampleSpider(scrapy.Spider):
    name = "example"
    start_urls = ['http://www.example.com']

    def __init__(self):
        self.driver = webdriver.Chrome()  # Или другой браузер

    def parse(self, response):
        self.driver.get(response.url)
        html = self.driver.page_source
        # Далее обрабатываем html с помощью BeautifulSoup или Scrapy селекторов

Настройка запросов: заголовки, прокси, задержки

Для настройки запросов можно использовать Request объекты. Например, чтобы добавить заголовки:

import scrapy

class ExampleSpider(scrapy.Spider):
    name = "example"
    start_urls = ['http://www.example.com']

    def start_requests(self):
        headers = {
            'User-Agent': 'Mozilla/5.0',
        }
        for url in self.start_urls:
            yield scrapy.Request(url, headers=headers)

    def parse(self, response):
        # ...

Для использования прокси необходимо настроить middleware. В settings.py добавьте:

DOWNLOADER_MIDDLEWARES = {
    'myproject.middlewares.ProxyMiddleware': 350,
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 400,
}

PROXY_LIST = [
    'http://proxy1.com:8000',
    'http://proxy2.com:8000',
]

И создайте ProxyMiddleware в middlewares.py:

import random

class ProxyMiddleware:
    def process_request(self, request, spider):
        proxy = random.choice(spider.settings.get('PROXY_LIST'))
        request.meta['proxy'] = proxy

Для установки задержки между запросами используйте настройку DOWNLOAD_DELAY в settings.py:

DOWNLOAD_DELAY = 3  # Задержка в секундах

Заключение

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


Добавить комментарий