Веб-скрейпинг с помощью Python: введение и учебник

Всемирная паутина состоит из миллиардов взаимосвязанных документов, более известных как веб-страницы. Исходный код веб-сайтов написан на языке гипертекстовой разметки (HTML). Исходный код HTML представляет собой смесь человекочитаемой информации и машиночитаемого кода, известного как теги. Веб-браузер (например, Chrome, Firefox, Safari или Edge) обрабатывает исходный код, интерпретирует теги и отображает содержащуюся в них информацию пользователю.

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

Далее мы объясним, почему Python особенно хорошо подходит для создания веб-скрейперов, и предоставим вам введение в тему и учебник.

Почему вы должны использовать Python для веб-скрейпинга?

Популярный язык программирования Python является отличным инструментом для создания программного обеспечения для веб-скрейпинга. Поскольку веб-сайты постоянно модифицируются, веб-контент меняется с течением времени. Например, может быть изменен дизайн сайта или добавлены новые компоненты страницы. Веб-скрепер программируется в соответствии с конкретной структурой страницы. Если структура страницы меняется, необходимо обновить скрепер. Это особенно легко сделать с помощью Python.

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

Существует множество сложных инструментов для выполнения веб-скрейпинга с помощью Python. Здесь мы познакомим вас с тремя популярными инструментами: Scrapy, Selenium и BeautifulSoup. Для получения практического опыта вы можете воспользоваться нашим учебником по веб-скрейпингу с помощью Python на основе BeautifulSoup. Это позволит вам непосредственно ознакомиться с процессом скраппинга.

Обзор процесса веб-скрейпинга

Основную процедуру процесса скраппинга легко объяснить. Сначала разработчик скрапера анализирует исходный кодHTML рассматриваемой страницы. Обычно существуют уникальные шаблоны, которые используются для извлечения нужной информации. Скрепер программируется с использованием этих шаблонов. Остальную работу скрапер выполняет автоматически:

  1. Он запрашивает веб-сайт по адресу URL.
  2. Он автоматически извлекает структурированные данные, соответствующие шаблонам.
  3. Извлеченные данные обобщаются, сохраняются, анализируются, комбинируются и т.д.

Области применения веб-скрейпинга

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

  • создание баз данных контактов;
  • мониторинг и сравнение цен онлайн-предложений;
  • объединение данных из различных онлайн-источников;
  • отслеживание присутствия и репутации в Интернете;
  • сбор финансовых, погодных и других данных;
  • мониторинг веб-контента на предмет изменений;
  • сбор данных для исследовательских целей; и
  • добыча данных.

Демонстрация веб-скрейпинга на примере

Рассмотрим веб-сайт по продаже подержанных автомобилей. Когда вы перейдете на сайт в браузере, вам будет показан список автомобилей. Ниже мы рассмотрим пример исходного кода для списка автомобилей:

raw_html = """
<h1>Used cars for sale</h1>
<ul class="cars-listing">
    <li class="car-listing">
        <div class="car-title">
            Volkswagen Beetle
        </div>
        <div class="car-description">
            <span class="car-make">Volkswagen</span>
            <span class="”car-model”">Beetle</span>
            <span class="car-build">1973</span>
        </div>
        <div class="sales-price">
            € <span class="”car-price”">14,998.—</span>
        </div>
    </li>
</ul>
 """

Веб-скребок может осуществлять поиск по доступным онлайн объявлениям о продаже подержанных автомобилей. Скребок будет искать определенную модель в соответствии с замыслом разработчика. В нашем примере моделью является Volkswagen Beetle. В исходном коде информация о марке и модели автомобиля помечена CSS-классами ‘car-make’ и ‘car-model’. Используя имена этих классов, можно легко извлечь нужную информацию. Вот пример с использованием BeautifulSoup:

# parse the HTML source code stored in raw_html
html = BeautifulSoup(raw_html, 'html.parser')
# extract the content of the tag with the class 'car-title'
car_title = html.find(class_ = 'car-title').text.strip()
# if this car is a Volkswagen Beetle
if (car_title == 'Volkswagen Beetle'):
    # jump up from the car title to the wrapping <li> tag</li>
    html.find_parent('li')
    
    # find the car price
    car_price = html.find(class_ = 'sales-price').text.strip()
    
    # output the car price
    print(car_price)

Юридические риски веб-скрейпинга

Как бы ни был удобен веб-скрейпинг, он также связан с некоторыми юридическими рисками. Поскольку оператор веб-сайта на самом деле планировал, что его сайт будет использоваться людьми, автоматическое извлечение данных с помощью веб-скрейперов может представлять собой нарушение условий использования. Это особенно актуально, когда извлекается большое количество данных с нескольких страниц одновременно или в быстрой последовательности. Человек не может взаимодействовать с веб-сайтом таким образом.

Кроме того, автоматизированный поиск, хранение и анализ данных, опубликованных на сайте, может представлять собой нарушение закона об авторском праве. Если соскобленные данные содержат информацию, позволяющую установить личность, их хранение и анализ без согласия заинтересованного лица может нарушать действующие нормы защиты данных, например, GDPR или CCPA. Например, запрещено соскабливать профили Facebook для сбора личной информации.

Примечание

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

Технические ограничения веб-скрейпинга

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

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

Ниже приведен пример файла robots.txt, который запрещает скребление любым ботом на всем сайте:

# Any bot
User-agent: *
# Disallow for the entire root directory
Disallow: /

Соблюдение ограничений, изложенных в файле robots.txt, является полностью добровольным. Предполагается, что боты должны соблюдать спецификации, но технически это невозможно обеспечить. Поэтому, чтобы эффективно регулировать доступ веб-скреперов к своим сайтам, операторы сайтов используют более агрессивные методы. Эти методы включают ограничение их доступа путем ограничения пропускной способности и блокировку их IP-адресов, если они неоднократно заходят на сайт, игнорируя спецификации.

API как альтернатива веб-скрейпингу

Хотя веб-скрейпинг может быть полезен, он не является предпочтительным методом получения данных с веб-сайтов. Часто существует более эффективный способ. Многие операторы веб-сайтов представляют свои данные в структурированном, машиночитаемом формате. Доступ к этим данным осуществляется через специальные программные интерфейсы, называемые интерфейсами прикладного программирования (API).

Использование API имеет значительные преимущества:

  • API явно предоставляется провайдером для доступа к данным: Меньше юридических рисков, и поставщику легче контролировать доступ к данным. Например, для доступа к данным может потребоваться ключ API. Кроме того, поставщик может более точно ограничить пропускную способность.
  • API предоставляет данные непосредственно в машиночитаемом формате: Это устраняет необходимость утомительного извлечения данных из исходного кода. Кроме того, структура данных отделена от их графического представления. Поэтому структура остается неизменной даже при изменении дизайна сайта.

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

Инструменты для веб-скрейпинга на языке Python

В экосистеме Python есть несколько хорошо зарекомендовавших себя инструментов для выполнения проекта веб-скрейпинга:

  • Scrapy
  • Selenium
  • BeautifulSoup .

Далее мы рассмотрим преимущества и недостатки каждого из этих трех инструментов.

Веб-скрейпинг с помощью Scrapy

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

URL → HTTP-запрос → HTML → Scrapy

Основной концепцией для разработки скраперов с помощью Scrapy являются скраперы, называемые веб-пауками. Это небольшие программы, основанные на Scrapy. Каждый паук запрограммирован на поиск определенного веб-сайта и ползает по сети от страницы к странице, как и положено пауку. Для этого используется объектно-ориентированное программирование. Каждый паук является собственным классом Python.

В дополнение к основному пакету Python, установка Scrapy поставляется с инструментом командной строки. Пауки управляются с помощью этой оболочки Scrapy. Кроме того, существующие пауки могут быть загружены в облако Scrapy. Там пауки могут быть запущены по расписанию. В результате даже крупные веб-сайты можно обследовать без использования собственного компьютера и домашнего подключения к Интернету. В качестве альтернативы вы можете создать собственный сервер веб-скрейпинга, используя программное обеспечение с открытым исходным кодом Scrapyd.

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

Веб-скрейпинг с помощью Selenium

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

В отличие от Scrapy или BeautifulSoup, Selenium не использует исходный HTML-код страницы. Вместо этого страница загружается в браузер без пользовательского интерфейса. Браузер интерпретирует исходный код страницы и генерирует объектную модель документа (DOM). Этот стандартизированный интерфейс позволяет тестировать взаимодействие с пользователем. Например, можно имитировать нажатия и автоматически заполнять формы. Результирующие изменения страницы отражаются в DOM. В результате получается следующая схема, иллюстрирующая веб-скрейпинг с помощью Selenium:

URL → HTTP-запрос → HTML → Selenium → DOM

Поскольку DOM генерируется динамически, Selenium также позволяет скрапировать страницы с содержимым, созданным на JavaScript. Возможность доступа к динамическому содержимому является ключевым преимуществом Selenium. Selenium также можно использовать в сочетании с Scrapy или BeautifulSoup. Selenium предоставляет исходный код, а второй инструмент разбирает и анализирует его. В результате получается следующая схема:

URL → HTTP-запрос → HTML → Selenium → DOM → HTML → Scrapy/BeautifulSoup

Веб-скрейпинг с помощью BeautifulSoup

BeautifulSoup — самый старый из представленных здесь инструментов для веб-скрейпинга на языке Python. Как и Scrapy, он также является парсером HTML. В результате получается следующая схема, иллюстрирующая веб-скраппинг с помощью BeautifulSoup:

URL → HTTP-запрос → HTML → BeautifulSoup

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

Сравнение инструментов для веб-скрейпинга на Python

Каждый из трех рассмотренных нами инструментов имеет свои преимущества и недостатки. В приведенной ниже таблице вы найдете краткий обзор этих инструментов:

  Scrapy Selenium BeautifulSoup
Легко изучить ++ + +++
Доступ к динамическому контенту ++ +++ +
Создает сложные приложения +++ + ++
Умеет справляться с ошибками HTML ++ + +++
Оптимизирован для работы со скрапом +++ + +
Сильная экосистема +++ + ++
Резюме

Итак, какой инструмент вы должны использовать для своего проекта? Если говорить коротко, то если вы хотите, чтобы процесс разработки прошел быстро или хотите сначала ознакомиться с Python и веб-скрейпингом, вам следует использовать BeautifulSoup. Если вы хотите разрабатывать сложные приложения для веб-скрейпинга на Python и обладаете необходимыми ноу-хау для этого, вам следует выбрать Scrapy. Однако если ваша основная цель — соскребать динамический контент с помощью Python, вам лучше выбрать Selenium.

Учебник по веб-скрейпингу с помощью Python и BeautifulSoup

Здесь мы покажем вам, как извлекать данные с веб-сайта с помощью BeautifulSoup. Сначала вам нужно будет установить Python и несколько инструментов. Требуется следующее:

  • Python версии 3.4 или выше,
  • менеджер пакетов Python pip, и
  • модуль venv.

Следуйте инструкциям по установке на странице установки Python.

В качестве альтернативы использованию pip, если в вашей системе установлен бесплатный менеджер пакетов Homebrew, вы можете установить Python с помощью следующей команды:

brew install python
Примечание

Приведенный ниже код и пояснения к нему были написаны на Python 3 в macOS. В принципе, код должен работать и на других операционных системах. Однако, возможно, вам придется внести некоторые изменения, особенно если вы используете Windows.

Настройка проекта веб-скрейпинга на Python на собственном устройстве

Здесь мы создадим папку проекта web Scraper для учебника Python на рабочем столе. Откройте терминал командной строки (например, Terminal.app на Mac). Затем скопируйте следующие строки кода в терминал и выполните их.

# Switch to the desktop folder
cd ~/Desktop/
# Create project directory
mkdir ./web Scraper/ && cd ./web Scraper/
# Create virtual environment
# Ensures for instance that pip3 is used later
python3 -m venv ./env
# Activate virtual environment
source ./env/bin/activate
# Install packages
pip install requests
pip install beautifulsoup4

Сбор цитат и авторов с помощью Python и BeautifulSoup

Сайт Quotes to Scrape предоставляет подборку цитат. Это сервис, предоставляемый специально для скрап-тестов. Поэтому не стоит беспокоиться о нарушении условий использования.

Давайте начнем. Откройте терминал командной строки (например, Terminal.app на Mac) и запустите интерпретатор Python из папки Python проекта web Scraper. Скопируйте следующие строки кода в терминал и выполните их:

# Switch to the project directory
cd ~/Desktop/web Scraper/
# Activate virtual environment
source ./env/bin/activate
# Launch the Python interpreter
# Since we are in the virtual environment, Python 3 will be used
python

Теперь скопируйте следующий код в терминал командной строки в интерпретаторе Python. Затем нажмите Enter — при необходимости несколько раз — для выполнения кода. Вы также можете сохранить код в виде файла под названием scrape_quotes.py в папке проекта web Scraper. В этом случае вы можете запустить Python-скрипт с помощью команды python scrape_quotes.py.

В результате выполнения кода в папке проекта Python web Scraper будет создан файл quotes.csv. Это будет таблица, содержащая цитаты и авторов. Вы можете открыть этот файл с помощью любой программы для работы с электронными таблицами.

# Import modules
import requests
import csv
from bs4 import BeautifulSoup
# Website address
url = "http://quotes.toscrape.com/"
# Execute GET request
response = requests.get(url)
# Parse the HTML document from the source code using BeautifulSoup
html = BeautifulSoup(response.text, 'html.parser')
# Extract all quotes and authors from the HTML document
quotes_html = html.find_all('span', class_="text")
authors_html = html.find_all('small', class_="author")
# Create a list of the quotes
quotes = list()
for quote in quotes_html:
    quotes.append(quote.text)
# Create a list of the authors
authors = list()
for author in authors_html:
    authors.append(author.text) 
# For testing: combine the entries from both lists and output them
for t in zip(quotes, authors):
print(t)
# Save the quotes and authors in a CSV file in the current directory
# Open the file using Excel, LibreOffice, etc.
with open('./zitate.csv', 'w') as csv_file:
    csv_writer = csv.writer(csv_file, dialect='excel')
    csv_writer.writerows(zip(quotes, authors))

Использование пакетов Python для веб-скрейпинга

Каждый проект по веб-скрейпингу отличается от другого. Иногда вы просто хотите проверить сайт на наличие изменений. В других случаях требуется выполнить сложный анализ. В Python в вашем распоряжении широкий выбор пакетов.

  1. Используйте следующий код в терминале командной строки для установки пакетов с помощью pip3.
pip3 install <package></package>
  1. Интегрируйте модули в сценарий Python с помощью import.

 

from <package> import <module></module></package>

Следующие пакеты часто используются в проектах веб-скрейпинга:

Пакет Использовать
venv Управление виртуальной средой для проекта
запрос Запрос веб-сайтов
lxml Использовать альтернативные парсеры для HTML и XML
csv Чтение и запись данных электронных таблиц в формате CSV
pandas Обработка и анализ данных
scrapy Использование Scrapy
selenium Используйте Selenium WebDriver
Совет

Используйте Python Package Index (PyPI) для обзора доступных пакетов Python.

Нажмите здесь для ознакомления с важными юридическими оговорками.

Оцените статью
cdelat.ru
Добавить комментарий